PWM實(shí)現(xiàn)ADC采集電量原理
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1. 說(shuō)明
對(duì)于沒(méi)有ADC的主控芯片來(lái)說(shuō),如果要實(shí)現(xiàn)ADC的功能,可以用兩個(gè)GPIO和一個(gè)運(yùn)算放大器解決該問(wèn)題。對(duì)于某些國(guó)產(chǎn)芯片來(lái)說(shuō),其內(nèi)部沒(méi)有ADC,所以在有些方案上采用的是PWM電路進(jìn)行模擬電壓的測(cè)量。接下來(lái)逐步分析一下基本的原理與采集過(guò)程。
2.基本原理
利用積分電路,通過(guò)調(diào)節(jié)PWM的占空比,將PWM變成平滑的電壓輸出。然后與需要測(cè)量的電壓用比較器進(jìn)行比較。不斷調(diào)節(jié)PWM的占空比,當(dāng)比較器的輸出從0到1時(shí),正好變化時(shí),記錄當(dāng)前的PWM的占空比即可實(shí)現(xiàn)模擬電壓的測(cè)量。
2. 硬件原理圖
2.1 積分電路
該部分電路的作用主要是將PWM波轉(zhuǎn)換成一個(gè)平滑的直線。
由于電容兩端的電壓不能突變,這里采用三階積分電路,使得輸出到比較器的電壓是一個(gè)平滑的直流電壓。
計(jì)算公式

經(jīng)過(guò)仿真后效果如下:

輸入為100K,振幅為3.3V的PWM波。當(dāng)占空比為70%時(shí),此時(shí)的輸出波形為一個(gè)平滑的直流電壓,根據(jù)計(jì)算公式,得到理論值為2.31V與仿真得到的2.325V基本保持一致。
2.2 電壓比較器

這部分電壓是電壓比較器的電路原理圖,其中R6的作用是上拉電阻,提高運(yùn)放的輸出能力。
通過(guò)R4與R5兩個(gè)電阻進(jìn)行分壓。得到測(cè)量電壓的三分之一與PWM調(diào)節(jié)出來(lái)的電壓進(jìn)行比較。通過(guò)連續(xù)不斷的條件PWM的占空比,并檢測(cè)運(yùn)放的輸出,當(dāng)功放輸出電平出現(xiàn)正好反向時(shí),此時(shí)的運(yùn)放的正級(jí)輸入就可以認(rèn)為與三分之一的測(cè)試電壓相同。通過(guò)該原理得到需要測(cè)量電壓的值。
3. 軟件設(shè)計(jì)
對(duì)于PWM測(cè)量電壓,需要gpio能夠輸出PWM波。可以直接用gpio輸出高低電平,然后通過(guò)計(jì)算占空比來(lái)進(jìn)行調(diào)節(jié)。對(duì)于君正X1000來(lái)說(shuō),可以直接利用PWM輸出穩(wěn)定的波形。
然后在比較器輸出引腳,可以將該引腳設(shè)置成一個(gè)中斷,當(dāng)中斷發(fā)生時(shí),功放的電平發(fā)生翻轉(zhuǎn)。通過(guò)得到當(dāng)前的PWM占空比,從而計(jì)算出此時(shí)電池的電量。
代碼可以參考
kernel/drivers/power/pwm-battery.c
通過(guò)該方法測(cè)量得到的電壓不是很準(zhǔn)確,代碼中的默認(rèn)精度為50mV。如果要調(diào)節(jié)精度,可以修改以下代碼
#define PWM_FREQ (140 * 1000) //采樣頻率 #define PWM_STABLE_TIME_US 200 #define PWM_SAMPLE_TIMES 3 //采樣次數(shù) #define PWM_DUTY_NS_STEP 30 //每次調(diào)節(jié)PWM采樣時(shí)間
4. 總結(jié)
在沒(méi)有ADC的情況下,可以利用兩個(gè)GPIO和一個(gè)功放進(jìn)行模擬ADC的設(shè)計(jì)。
(1)該方法需要輸出一個(gè)穩(wěn)定的PWM波,其占空比需要精確,所以能夠產(chǎn)生一個(gè)穩(wěn)定的PWM波是關(guān)鍵。
(2)被測(cè)量的電壓需要穩(wěn)定,所以為了其電壓的穩(wěn)定,可以在需要測(cè)量的電路部分加一個(gè)電容。

增加電容C162可以讓電平更加的平穩(wěn),采集的電壓更加精確。
(3)可多次ADC轉(zhuǎn)換求平均值,進(jìn)行數(shù)字濾波消除誤差。