yanniwang

如果没接负端参考源(GNDREF)--你的ADC将会怎样?

0
阅读(5120)

 这几天在使用ADUC7026做一款无刷电机驱动器,一切就绪,PCB打板后开始调试,可是在单独调试ADUC7026的ADC时出现以下现象:

     1.输入电压0~0.5V左右,转换结果为0;

     2.输入电压为0.5~2.5V,转换结果随输入电压变化,但有较大误差。

解决的办法:

(1)由于是手工焊接,对于80引脚的指甲大小的芯片心里也没底啊,难道是焊接时坏掉了?解决方案最先是换一个通道测试(ADUC7026有一个ADC,通过MUX分成16个AD采样通道),但各通道都是一样。 焊接的几块PCB板的AD转换都有这个问题,基本可以排除不规范焊接引起的损坏;

(2)由于调试时使用内部参考源,所以测一下VREF引脚电压吧!结果示波器测量VREF引脚对地电压为稳定的2.5V。

(3)调试其他功能,结果其他功能(DAC/PWM/GPIO等)都调试正常,看来真的不像是焊接损坏啊。

(4)用已调试好的板板跑一遍程序,结果调试程序在ADI提供的ADUC7026迷你开发板上调试正常。

 

痛定思痛,开始仔细检查电路,结果就如标题所示: 如果没接负端参考源(GNDREF)--你的ADC将会怎样?

答案是上面描述的现象~~~~~~~~

 

 

 

附错误的(GNDREF没有接地)原理图

 

 

 

 

附:调试程序

  调试程序:

#include<ADuC7026.h>

int input1 = 0;

 

void Delay(int time)

{

         while(time>0)

         time--;

   return;

}

 

 

 void senddata(int to_send)

{

        while(!(0x020==(COMSTA0 & 0x020))){}

                COMTX = 0x0A;                                        // output 0A

       while(!(0x020==(COMSTA0 & 0x020))){}

                COMTX = 0x0D;                                        // output 0D 标志值

        while(!(0x020==(COMSTA0 & 0x020))){}

                COMTX = ((to_send >> 8) & 0x0F);   //  输出8到11位

        while(!(0x020==(COMSTA0 & 0x020))){}

                COMTX = ((to_send) & 0x0FF);                          // 输出0到7位

 }

 

 

 

void ADCpoweron(int time)

{

        ADCCON = 0x20;                                        // power-on the ADC

        while (time >=0)                                // wait for ADC to be fully powered on

    time--;

}

 

 

 

void main()

{      

             

        

                GP4DAT = 0x04000000;

      

 

                                      //ADC充分上电,参考电压2.5V

                   ADCpoweron(2000);

        REFCON = 0x01;

        

                   GP1CON = 0x011;               //设置串口接收发送端

 

                                            //设置波特率9600

                   COMCON0 = 0x80;   

        COMDIV0 = 0x88;                                

        COMDIV1 = 0x00;

        COMCON0 = 0x07;

        

        

              while(1)

             {

               ADCCON = 0x7A4;

                     ADCCP = 0x01;                                   //使能ADC1

                    

     

       

                      while (!ADCSTA) {}

           input1 = (ADCDAT >> 16);

            

                      senddata(input1);      

                      Delay(1000000);

              }

}