近期用到了二路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; |