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