近期用到了二路ADC电压检测,很正常稳定,没有什么问题的,设置要正确.
精简代码如下:
ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16 ,右对齐;
P_SW2 |= 0x80; //访问扩展RAM区域寄存器(ADCTIM),需先将P_SW2的BIT7设置为1,才可正常读写; 手册后面P_SW2 &= 0x7f释放P_SW2非必要已删除没问题!
ADCTIM = 0x30; //设置ADC时序控制2A~3F,采样时间:0A~1F,ok; 用复位默认值0X2A(0010,1010)可省2句(已验证可以但暂未采用),注意低5位SMPDUTY一定不能设置小于A(01010B);
//2、P32ADC10:测VTP1(BAT1一半分压值); 3句合并ok!20220305;
ADC_CONTR = 0xCA; //BAT1:复位值000x,0000;打开ADC电源(B7:1)、启动AD转换(B6:1)、选通道A(P32);
delay_ms(1); //ADC模块电源打开后需等待约1ms等ADC电源稳定后再让ADC工作?? 20220327增加;
_nop_(),_nop_(); //参考手册空操作2次; ADC模块电源打开后需等待约1ms等ADC电源稳定后再让ADC工作??
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志; 手册:检测工作约耗时1mS;
ADC_CONTR &= ~0x20; //清完成标志;
ADC_CONTR &= 0x7F; //ADC转换完即断电更省电; 之前放PD改放这里测完即关省时即省电20220305;ok
res = (ADC_RES << 8) | ADC_RESL; //读取ADC结果(右对齐:高2位低8位,前面自动补0);
BAT1 = (int)(3300L*res/1024L+17L);//计算监测电压mV;特别注意数据类型后面带L(因I易混淆)!及VDD3.3V参考电压稳定性;修正值:+29L;OK20220309;+17L;OK20220327; |