单片机/MCU论坛
直播中

李军

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

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++);
}

回帖(1)

fanB

2024-1-15 16:49:08
有几种可能导致ADuC7060的ADC无法使用外部基准电压:

1. 外部基准电压未正确连接:请确保外部基准电压源已正确连接到MCU的VREF+/VREF-引脚,并且电压源的电压稳定在2.4V。

2. 编程配置错误:需要在代码中正确配置ADC的参考电压。请确保已经设置了正确的寄存器位,使ADC使用外部基准电压。具体配置方式可以参考MCU的用户手册或编程指导。

3. 基准电压的精度:外部基准电压源的精度也可能影响ADC的测量结果。如果基准电压源的精度较低,那么ADC的测量精度也会降低。

关于问题2:当使用外部基准电压时,ADC的输入范围通常是基准电压的0V到基准电压的值。所以,如果你的外部基准电压是2.4V,那么ADC的输入范围应该是0V到2.4V。
举报

更多回帖

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