ADI 技术
直播中

刘平

7年用户 240经验值
私信 关注
[问答]

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

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

出现的问题:
     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
#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++);
}

回帖(3)

刘思思

2018-12-3 09:22:26
ADUC7060内部有参开电压分压电路,当您的输入参考超过1.3V时会对其进行分压至外部参考的一半。所以其输入值无法达到1.2V以上。
举报

张宇

2018-12-3 09:28:47
引用: qwe045 发表于 2018-12-3 16:47
ADUC7060内部有参开电压分压电路,当您的输入参考超过1.3V时会对其进行分压至外部参考的一半。所以其输入值无法达到1.2V以上。

如果用差分输入能?
手册上写的主通道绝对输入电压范围是0.1~VDD-0.7,在使用内部参考电压的情况下。那么用外部参考电压的时候是不是也是这样?谢谢
举报

刘思思

2018-12-3 09:40:26
非常抱歉,虽然ADC的输入范围是0.1~VDD-0.7 ,但是其转换量程只能到1.2V。详细您可以参考数据手册的表43 HIGHEXTREF0处的描述。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分