已回答假定已回答

ADuC7060的ADC无法使用外部基准电压

梦归魂 在 2013-7-24 詢問的問題
最後回覆由ADI_XUN於2014-12-1提供

我使用的MCU为ADuC7060,使用ADC2通道,主ADC,单端工作模式,使用外部基准电压2.4V,外部基准电压接在VREF+/VREF-上。

QQ截图20130724153335.jpg

出现的问题:

     1.当ADC2输入的模拟电压达到1.2V时,ADC0DAT寄存器的值就满了,达到了0xFFFFFF,这显然与我的初衷不一致,按理说当ADC输入的模拟电压达到2.4V时,ADC0DAT寄存器的值才能到0xFFFFFF。看起来似乎外部基准电压2.4V未起作用。    

     2.我还想问一下,当我的外部基准电压接2.4V时,ADC的输入能否输入0V到2.4V?

     3.ADC0CON寄存器的12位HIGHEXTREF0的解释“当ADC0的外部基准电压高于1.35V时,必须将该位置1.这样,可以将基准电压源二分频”,解释中的将基准电压二分频是什么意思啊?难道是说基准电压超过1.35V后,若将该位置1,则实际基准电压只有外部基准电压的一半,即ADC的输入电压不能超过1.2V?

 

下面附上我的程序:

#include<aduc7060.h>
#include "stdio.h"
#include "string.h"
#include "user/bit.h"
 
unsigned char szTemp[16] = "";     // Used to store ADC result before printing to UART
volatile unsigned long ulADC0Result = 0;  // Variable that ADC0DAT is read into in ADC0 IRQ

//函数声明
void ADCInit(void);
void UARTInit(void);
void Delay(int a);
float CodeToAV(unsigned long ulCode,int iPGA,float fVref);

/******************************************************************************
函数名     :  int main(void)
描述       :  主函数
输入       :  void
返回  :  NONE
*******************************************************************************/
int main(void)
{

      unsigned char i = 0;
      unsigned char nLen = 0;

 

      POWKEY1 = 0x1;
      POWCON0 = 0x78;     // Set core to max CPU speed of 10.24Mhz
      POWKEY2 = 0xF4;

      UARTInit();
      ADCInit();

      IRQEN = BIT10 + BIT11; // Enable ADC and UART interrupts

      while (1)
      { }

}


/******************************************************************************
函数名     :  void IRQ_Handler(void) __irq
描述       :  IRQ中断服务程序
输入       :  void
返回  :  void
*******************************************************************************/
void IRQ_Handler(void) __irq
{
      unsigned long IRQSTATUS = 0;
      unsigned char ucCOMIID0 = 0;

      IRQSTATUS = IRQSTA;    // Read off IRQSTA register
      if ((IRQSTATUS & BIT11) == BIT11) //UART interrupt source
      {
            ucCOMIID0 = COMIID0;
       if ((ucCOMIID0 & 0x2) == 0x2)   // Transmit buffer empty
       { } 
      }

      if ((IRQSTATUS & BIT10) == BIT10) //If ADC0 interrupt source
      {
            ulADC0Result = ADC0DAT; // Read ADC0 conversion result   
      }


}

/******************************************************************************
函数名     :  void ADCInit(void)

描述       :  初始化ADuC7060的ADC的ADC2通道。

输入       :  void
返回  :  void
*******************************************************************************/
void ADCInit(void)
{      
      //

      // 配置ADC2通道连续转换模式,采样速率4Hz,单端工作模式,使用主ADC
      //
      ADCMSKI = BIT0;      // Enable 主ADC result ready interrupt source
      ADCFLT = 0xFF1F;      // Chop on, Averaging, AF=63, SF=31, 4Hz
      ADCCFG = 0;      

      ADC0CON = BIT4 +     //使用外部基准电压输入(VREF+/VREF-)2.4V,主ADC增益为1
                            BIT7 + BIT8 +      // ADC2/ADC5(单端模式)。
                            BIT10 +       // Unipolar ADC output
                            BIT12 +                    //ADC0的外部基准电压为2.4V高于1.35V。
                            BIT15;        // Enable Primary_ADC.

      ADCMDE  = BIT0 + BIT4 + BIT7;     // continuous conversions
}


/******************************************************************************
函数名     :  void UARTInit(void)
描述       :  初始化ADuC7061的主UART,9600-8-N
输入       :  void
返回  :  void
*******************************************************************************/
void UARTInit(void)
{
  // Initialize the UART for 9600-8-N
GP1CON = BIT0 + BIT4;  // Select UART functionality for P1.0/P1.1
COMCON0 = BIT7;   // Enable access to COMDIV registers
COMDIV0 = 0x21;   // Set baud rate to 9600.
COMDIV1 = 0x00;
//COMDIV2 = 0x21 + BIT11; // Enable fractional divider for more accurate baud rate setting
COMCON0 = BIT0 + BIT1 + BIT2;
COMIEN0 = BIT0 + BIT1;  // Enable UART interrupts when Rx full and Tx buffer empty.
}

 

/******************************************************************************

函数名     :  float CodeToAV(unsigned long ulCode,int iPGA,float fVref)
描述       :  单端模式下将ADuC7060的主ADC或者辅助ADC转换得到的数据量换
       算为相应的模拟电压值。
输入       :  ulCode为ADC0DAT或者ADC1DAT寄存器中的值,
       iPGA为主ADC或者辅助ADC中的增益放大器的设置值,
      fVref为基准电压值。
返回  :  转换得到的模拟电压,float类型。

*******************************************************************************/
float CodeToAV(unsigned long ulCode,int iPGA,float fVref)
{

      float fAINV;

      fAINV = ((ulCode / 16777215.0) * fVref) / iPGA ;

      return fAINV;
}

 


/******************************************************************************
函数名     :  void Delay(int a)
描述       :  延时函数
输入       :  int a
返回  :  void
*******************************************************************************/
void Delay(int a)
{
int i,j;
for(i = 1 ; i < a ; i++)
  for(j = 1 ; j < 1000 ; j++);
}

結果