看了你的帖子,我也决定校正AD数值,结果对第9通道采集的数据始终是1023啊,模拟通道采集数据是对的,真的好奇怪,我的芯片是15W408AS
//返回指定模拟输入通道_ch的模拟电压值,单位mV
//调用之前,对应_ch通道的引脚要先设置为纯输入
unsigned int chip_AD(unsigned char _ch)
{
unsigned int _data, adc_bg;
_ch &= 0x07; // _ch取值范围0-7,本芯片只有P1口的8个AD输入通道
ADC_RES = 0;
ADC_RESL = 0;
P1ASF = 0x00;
ADC_CONTR = 0xE8;
_nop_();_nop_();_nop_();_nop_();_nop_();
while((ADC_CONTR & 0x10) == 0); // 等待AD结束,大约90个机器周期
ADC_CONTR &= ~0x10;
adc_bg = ADC_RES;
adc_bg = adc_bg << 2;
adc_bg += ADC_RESL & 0x03;
ADC_RES = 0;
ADC_RESL = 0;
P1ASF = 1 << _ch;
ADC_CONTR = 0xE8 | _ch; // 启动AD,通道_ch, 如通道2就是0xEA
_nop_();_nop_();_nop_();_nop_();_nop_();
while((ADC_CONTR & 0x10) == 0); // 等待AD结束标志,大约90个机器周期
ADC_CONTR &= ~0x10; // 清除AD结束标志
_data = ADC_RES;
_data = _data << 2;
_data += ADC_RESL & 0x03;
//return (unsigned long)Vbg_ROM * (unsigned long)_data / (unsigned long)adc_bg;
return adc_bg;
}
问题在哪儿呢?
|