关于程序注意以下几点:
1、要配置一个端口0脚为一个ADC输入,APCFG寄存器中相应的位必须设置为1。这个寄存器的默认值选择端口0引脚为非ADC,即数字输入输出。APCFG寄存器的设置将覆盖P0SEL的设置,所以无需再配置P0SEL,另外对于I/O口作为外设功能,都无需配置方向,即无需配置寄存器PxDIR。
2、对于单次ADC转换的配置,只需要配置寄存器ADCCON3,无需配置寄存器ADCCON1和ADCCON2。对于判断转换是否结束,还有一种判断方法:
1 ADCCON1 |=0X30; //ADC启动方式选择为ADCCON1.ST=1事件
2 ADCCON1 |= 0x40; //启动转换
3 while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
ADCCON1.STSEL是用于启动转换序列的触发方式的,对于单次ADC转换,个人感觉这样配置不好,以后对于单次ADC转换,不采用这种判断方式。
单次转换判断是否转换结束:判断ADC中断标志ADCIF。
3、ADCH的最高位是符号位,对于单次测量,结果总是正的,所以符号位总是0。14位的ADC转换值有效值并不是14位的。
有效分辨率如下:
00: 64 decimation rate (7 bits ENOB)----ADCH低7位
01: 128 decimation rate (9 bits ENOB)---ADCH低7位+ADCH高2位
10: 256 decimation rate (10 bits ENOB)--ADCH低7位+ADCH高3位
11: 512 decimation rate (12 bits ENOB)--ADCH低7位+ADCL高5位
例如:采集VDD/3值时,使用12位分辨率,参考电压AVDD5:3.3V
VDD/3 = vddvalue*3.3/2^11
扩大10倍
VDD/3 = vddvalue*33/2^11
为什么是除以2^11而不是2^12,因为最高位是符号位,12位分辨率实际上只有11位。
VDD = (vddvalue*33/2^11) * 3
4、差分输入可以用来做比较器。比如通道ADCCON3.ECH=1000,对应差分输入AIN0-AIN1。如果要比较一个模拟信号和另一个模拟信号的大小关系,只需要将这两个信号分别接入AIN0和AIN1,然后判断ADCH的最高位,如果是1,则AIN0<AIN1,如果是0,则AIN0>=AIN1。
5、最大转换电压等于参考电压,而参考电压的选择不能大于芯片的电源电压,一般为3.3V。虽然差分输入可以转换负电压,但是每一个模拟输入引脚都必须是正电压且小于电源电压VDD,负电压是指两个输入通道的差值。 |