我使用ZLG提供的实例代码去调试ADC,PIO0_11引脚接可调电源,通过可调电源来改变模拟电压值,但是,不管我怎么改变电压值,读取出来的AD转换值总是0x3ff,IC的VDD为固定3.3V。
代码如下:
uint32_t ulADCBuf;
uint32_t ADCFlag;
char GcRcvBuf[20]; /* AD采集到的数据 */
#define BURST 0 /* AD BURST模式选择 */
void ADCInit( void )
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 16);
LPC_IOCON->R_PIO0_11 &= ~0xBF; /* 配置PIO0_11为模拟输入模式 */
LPC_IOCON->R_PIO0_11 |= 0x02; /* PIO0_11模拟输入通道0 */
LPC_SYSCON->PDRUNCFG &= ~(0x01 << 4); /* ADC模块上电 */
LPC_SYSCON->SYSAHBCLKCTRL |= (0x01 << 13); /* 使能ADC模块时钟 */
LPC_ADC->CR = ( 0x01 << 0 ) | /* SEL=1,选择ADC0 */
(( SystemFrequency / 1000000 - 1 ) << 8 ) | /* 转换时钟1MHz */
( 0 << 16 ) | /* BURST=1,使用Burst模式 */
( 0 << 17 ) | /* 使用11 clocks转换 */
( 0 << 24 ) | /* ADC转换停止 */
( 0 << 27 ); /* 直接启动ADC转换,此位无效 */
NVIC_EnableIRQ(ADC_IRQn); /* 使能ADC中断,并配置优先级 */
NVIC_SetPriority(ADC_IRQn, 2);
LPC_ADC->INTEN = (1 << 0); /* 通道0中断使能 */
}
void ADC_IRQHandler(void)
{
ulADCBuf = LPC_ADC->DR[0]; /* 读取通道0的值 */
ulADCBuf = (ulADCBuf >> 6) & 0x3FF;
printf("ulADCBuf = %x", ulADCBuf );//此处打印值一直为0x3ff
ADCFlag = 1; /* 置标志位 */
}
int main(void)
{
uint32_t i = 0;
uint32_t ulADCData;
SystemInit(); /* 系统初始化 */
uartInit(); /* 串口初始化 */
ADCInit(); /* ADC模块初始化 */
ADCFlag = 0;
#if BURST
LPC_ADC->CR |= 1<<16;
#else
LPC_ADC->CR |= 1 << 24;
#endif
while (1) {
if (ADCFlag == 1) {
ADCFlag = 0; /* 清零标志 */
i++;
ulADCData += ulADCBuf;
if(i == 10) {
i = 0;
ulADCData = (ulADCData / 10); /* 取10次采样的平均值 */
ulADCData = (ulADCData * 3300) / 1024;
printf("ulADCData = %x", ulADCData );//此处打印值一直为0xce0
ulADCData = 0;
myDelay(10);
}
#if BURST == 0
LPC_ADC->CR |= 1 << 24;
#endif
}
}
}
各位有碰到过类似的情况吗?