我使用的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 prin
ting 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++);
}