牛逼,不用外部電路檢測芯片工作電壓!
本篇筆記主要包含以下內(nèi)容(電池供電產(chǎn)品尤其實用):
1、如何進行 ADC 校準,ADC 校準基本原理
2、如何直接通過內(nèi)部參考電壓得到芯片的工作電壓
3、常見應用場合
在一些應用場合,往往需要得到芯片的工作電壓,確保芯片工作正常,比如低壓時進行必要保護、 ADC 采集時校準等。
一般情況下,我們使用分壓電阻方式獲得芯片工作時的電壓,比如 STM32 可工作在 2.0~3.6 V(你沒看錯,2.0 V 也能工作,魚鷹有段時間不小心用了 5 V 電壓,芯片竟然也能工作,沒燒壞,也是奇跡,但不建議這么干)。但是需要增加額外電路。
另外,如果你能得到芯片的工作電壓(或 ADC 的基準電壓),在 ADC 校準方面也是有奇效。因為如果你的參考電壓變化了,那么你通過 ADC 計算得到值必然也是有問題的。
測量電壓值 = (ADC 值 * 參考電壓值 3.3)/ ADC 最大值 4096
即上式的 參考電壓 3.3v 變化了,那么你計算的測量電壓就和實際的不符。因為在這個公式里面,你假設參考電壓穩(wěn)定不變?yōu)?3.3v ,但實際上如果因為某種原因,導致電壓上升或下降了,那么計算的測量電壓值就是有問題的。
所以,為了精確測量電壓,就有了校準。
既然參考電壓也在變化,那么我們就直接把參考電壓也一起采集了,作為公式的參數(shù)輸入,如此一來,就能保證測量電壓的穩(wěn)定性了。
但是參考電壓又應該怎么測量呢?還是使用分壓方式嗎?我們本身就是為了讓分壓方式測量的電壓更精確才使用校準的呀?這不是陷入了雞生蛋、蛋生雞的死循環(huán)?
如何跳出這一循環(huán)呢?關(guān)鍵在于是否存在一個電壓,可不隨外部電壓變化而變化,起碼不應該在芯片(2.0 ~ 3.6 V)正常工作時而變化,超出電壓范圍外就和我沒關(guān)系了。
就此我們可以想到一種常用器件,LDO (低壓差線性穩(wěn)壓器),比如 5 V 轉(zhuǎn) 3.3 V,只要輸入電壓在芯片規(guī)定范圍內(nèi),它總是能穩(wěn)定輸出 3.3 V。
在 STM32 中,內(nèi)部都內(nèi)置了一個比較穩(wěn)定的內(nèi)部參考電壓,即 VREFINT,一般電壓 1.2 V,但由于芯片差異,這也是不確定的,所以為了更加確定這個電壓值,芯片出廠時會進行校準(又來一次校準),即把實際采集到的電壓 ADC 值保存到一個地址里面。
怎么理解這次校準呢?這個參考電壓內(nèi)部連接到 ADC 外設中的一個通道,而 ADC 外設使用高精度穩(wěn)壓源穩(wěn)定供電 3.0 V,而此時該參考電壓也會輸出一個電壓,大概在 1.2V, 然后通過 ADC 采集這個電壓的 ADC 值,并把這一次電壓值保存在一個地址里面。
這里舉一個具體例子(參考文章里面的):
在這個芯片里面的參考電壓輸出就是 1.216 V,可以說相當精確了,但是另一個同款芯片就不一定就是這個電壓了(但也基本在 1.2 V 左右,不會差太多),這就是所謂的差異,也是為什么要校準的原因。
那么得到這樣一個穩(wěn)定的參考電壓有什么用,它的特點又是什么呢?
這個參考電壓你可以理解為,只要芯片工作在 2.0 ~ 3.6 V,它總是能輸出 1.216 V(當然是說上面那顆芯片,其它芯片就不一定是這個電壓了)。
這樣一來,我們讓 VDDA(ADC 外設的基準電壓)= VDD(芯片工作電壓)。當工作電壓下降時,VDDA 電壓也在下降,也就是說 4095 在下降前代表 3.3 V,那下降后代表的電壓值肯定更小了(還是代表 VDDA 的值,即總是代表的基準電壓)。
(圖片來源:茶話 MCU)
但是不管 VDDA(VDD) 怎么變化,Vrefint 的電壓值總是穩(wěn)定在 1.216 V(但是這個 ADC 值是處于變化中的)。而這也是我們反推外部電壓的基礎。
于是我們可以得到下面公式(前提芯片能正常工作,即 2.0 ~ 3.6 V):
VDDA : 4095 = VREFINT : Adc_vrefint
因為 VDDA 等于 VDD,所以也可以認為是芯片的工作電壓。在這個公式中,Adc_vrefint 的 ADC 值我們可以通過 ADC 的特殊通道(VREFINT 通道)采集回來,而 VREFINT 我們在前面通過某個地址的 ADC 值已經(jīng)計算出來了,就是 1.216 V,那么只有 VDDA 一個值不確定,計算它就是輕而易舉的事情了。
于是,通過采集 VREFINT 通道的 ADC 值,即可得到我們需要的 VDDA 值,也就是我們的芯片工作電壓!??!
這就是不用外部電路檢測芯片電壓的內(nèi)幕(原理)!
本來應該一切順利,這篇筆記也有一個完美的結(jié)局,但是很不幸的是,魚鷹找遍了手冊,網(wǎng)上也是到處找,始終沒有找到 STM32F1xx 系列芯片校準值的保存地址,而據(jù)網(wǎng)上的說法是,這款芯片并沒有校準值,這就很讓人尷尬了(其它系列是否存在該校準值,可以看對應的數(shù)據(jù)手冊,如果有道友知道 STM32F1xx的地址,可留言告知)。
但是如果你對電壓精度要求不是很高的話,你可以直接認為參考電壓就是 1.200 V,用它來大概計算芯片的工作電壓也是問題不大的。而如果你要更高的精度,那么你也可以像前面說的那樣,自己找出每一顆芯片的實際參考電壓,人工校準。當然工作量就大了那么一些了(專門寫一個校準程序,把校準值寫入內(nèi)部 FLASH 中)。
應用
那么這個功能一般用于什么場合呢?
實時檢測芯片的工作電壓,我們就知道芯片是否正常工作,從而排除芯片因為電源不穩(wěn)導致的一些問題。同時,我們可以把這個電壓值用于前面所說的 ADC 校準中,這樣不管芯片工作電壓怎么變化(前提是芯片工作電壓和 ADC 基準電壓是一同一個),你測量的電壓值一定是準確的(即使電壓源紋波比較大)。
這個功能對于電池供電的產(chǎn)品尤其實用,因為電池電壓在使用過程中,肯定會發(fā)生變化,這也意味著可能你的 ADC 基準電壓發(fā)生了變化(當然你也可以使用額外的穩(wěn)壓源,這樣就會增加成本)。
當工作電壓低到一定程度時,我們希望能做一些保護工作,或者保存一些參數(shù),我們該如何做呢?三種方法:
1、通過上述方法,定時采集 參考電壓 的 ADC 值,從而得到工作電壓,當電壓低于一定水平時,再采取一些措施。
2、使用 ADC 模擬看門狗功能,將這個通道的值加入到看門狗中,如此一來,只要電壓下降到你想要的值,就可以觸發(fā)看門狗,比方法一更及時,這也是參考文章介紹的一個應用,強烈建議各位道友看看這位大佬寫的。
3、芯片內(nèi)部有低電壓保護功能,當電壓低到一定水平時,可觸發(fā)中斷,但是只有幾個固定電平可選,不像上述方法可設置任意電平。
而在已出貨的產(chǎn)品中,可能當時我們并沒有考慮那么多,并沒有預留檢測工作電壓的電路,使用這個方法,就可以只更新軟件即可獲取工作電壓,相當實用。
這個方法魚鷹也曾用高精度穩(wěn)壓源測試過,發(fā)現(xiàn)計算出來的電壓值精度相當高,而當魚鷹改變電壓大小時,計算出來的電壓也在實時變化,可謂實用的一匹,再也不用怕硬件工程師說你采集的 ADC 值(軟件)有問題了。
簡單總結(jié)就是,采集 ADC 外設中的 VREFINT 通道值,通過上面公式簡單計算,即可得到芯片當前的 ADC 參考電壓,也可認為是芯片工作電壓。代碼和普通的 ADC 采集沒多大區(qū)別,只是采集的通道由外部通道變?yōu)榱藘?nèi)部通道,所以魚鷹就不再提供具體參考例子了(可惜忘記截圖了,否則更有說服力)。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。