我使用的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条
1/1 1 跳转至页
ADuC7060的ADC为什么无法使用外部基准电压?
关键词: ADuC7060 ADC 基准电压
2楼
有几种可能导致ADuC7060的ADC无法使用外部基准电压:
1. 外部基准电压未正确连接:请确保外部基准电压源已正确连接到MCU的VREF+/VREF-引脚,并且电压源的电压稳定在2.4V。
2. 编程配置错误:需要在代码中正确配置ADC的参考电压。请确保已经设置了正确的寄存器位,使ADC使用外部基准电压。具体配置方式可以参考MCU的用户手册或编程指导。
3. 基准电压的精度:外部基准电压源的精度也可能影响ADC的测量结果。如果基准电压源的精度较低,那么ADC的测量精度也会降低。
关于问题2:当使用外部基准电压时,ADC的输入范围通常是基准电压的0V到基准电压的值。所以,如果你的外部基准电压是2.4V,那么ADC的输入范围应该是0V到2.4V。
共3条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 | |
【换取逻辑分析仪】rtthread添加RRH62000传感器驱动-基于野火启明6M5被打赏48分 | |
换逻辑分析仪+Verilog多输入门被打赏27分 |