![]() |
發布時間: 2021-10-11 09:15
正文摘要:數據手冊上說,單片機掉電模式電流0.4ua,但是我測試掉電模式電流有1.5ma 網上有人說有漏電流,或者其他功能打開了。 電路用的是LQFP32轉DIP32的轉接板,代碼也很簡單。就只是測掉電模式電流。 有高手指點 ... |
STC Mcu睡眠時IO不耗電的處理方法: 1、對于設置為準雙向口、推挽輸出、開漏輸出低電平的IO,IO本身不耗電,輸出電平與外部電路配合成外部電路不耗電的方式即可。 2、設置為高阻或開漏輸出高電平的IO,如果懸空,則會因為輸入狀態不確定導致有電流,以下兩種方式任選一種: A、IO口接一個確定的高電平(電壓高于VDD-0.3)或低電平(電壓低于0.3V),否則耗電。 B、將IO口對應的數字輸入功能關閉(對于STC8系列、STC32系列)。 比如關閉P1.0、P1.1的數字輸入: P_SW2 |= 0x80; //允許操作擴展寄存器 P1IE = ~0x03; //將P1.0 P1.1的數字輸入功能關閉 3、睡眠前,禁止ADC(如果已經允許的話),禁止模擬比較器(如果已經允許的話)。 4、在主程序進入睡眠,睡眠后至少要加3個空操作(NOP)。 PCON |= 0x02; _nop_(); _nop_(); _nop_(); |
Y_G_G 發表于 2022-3-31 16:14 請問有沒有遇到過加了外部設備后電流變大的,我有NMOS關了外部設備電源0V |
ax6808 發表于 2022-3-26 18:47 ![]() |
睡眠時IO不耗電的處理方法: 1、對于設置為準雙向口、推挽輸出、開漏輸出低電平的IO,IO本身不耗電,輸出電平與外部電路配合成外部電路不耗電的方式。 2、設置為高阻或開漏輸出高的IO,以下兩種方式任選一種: A、IO口接一個確定的高電平(電壓高于VDD-0.3)或低電平(電壓低于0.3V),否則耗電。 B、將IO口對應的數字輸入功能關閉(對于STC8系列、STC32系列)。 比如關閉P1.0、P1.1的數字輸入: P_SW2 |= 0x80; //允許操作擴展寄存器 P1IE = ~0x03; //將P1.0 P1.1的數字輸入功能關閉 3、睡眠前,禁止ADC(如果已經允許的話),禁止模擬比較器(如果已經允許的話)。 |
剛才測了一下,io默認高阻進掉電,15uA左右。然后io口全部設置準雙向,進入掉電模式,只有0.625uA |
Y_G_G 發表于 2022-4-1 23:14 感謝哥們回復。。 確實ADC外圍電路耗電還可優化,只需多一個引腳資源,一路ADC就又可總體省下好多μA!! 對于極低功耗設計至關重要。 前期主要研究驗證MCU本身耗電問題去了! 再次感謝!再次感謝! |
外圍電路的問題:已嚴格審查; ADC分壓電阻還耗電????你不會是直接就串聯兩個電阻來采樣吧?在電池供電中怎么可能用這種采樣方法呢? 答:鋰電池電壓ADC檢測,滿電是4.2V,超過MCU的VDD3.3V,必須串聯電阻降壓到VDD以下檢測,我用2個330KΩ以上電阻串聯,靜態電流<6.4μA,電阻大些還可降低。 端口只要初始化一次是我自己的操作,跟STC數據手冊更不更新是沒有沒有關系的,設定好之后就不想動了,也沒有必要動了;看好外圍電路,掉電操作之前把電平固定,就不會有耗電的了; 答:掉電操作之前把電平固定,就不會有耗電的了,這個確實對的!ADC、外接晶振等高阻模擬腳除外! 比如,IIC,掉電之前,SCL和SDA全部高電平,這不就得了? 答:對的!! |
是的,在我代碼中,不設置PxIE,但掉電電流一直都是可以在5uA以下的,如果你的做不到,要么是代碼有問題,要么是外圍電路的問題 你ADC分壓電阻還耗電????你不會是直接就串聯兩個電阻來采樣吧?在電池供電中怎么可能用這種采樣方法呢? 端口只要初始化一次是我自己的操作,跟STC數據手冊更不更新是沒有沒有關系的,設定好之后就不想動了,也沒有必要動了 看好外圍電路,掉電操作之前把電平固定,就不會有耗電的了 比如,IIC,掉電之前,SCL和SDA全部高電平,這不就得了? |
Y_G_G 發表于 2022-3-31 16:14 最后回復一下: 你從來不設置PxIE,掉電模式電流一直是在5uA以下的?: 我之前有1路ADC平時低電平時就測不出來影響,但碰到高電平時就會多出16μA,后來仔細對比檢查2路才發現這個問題(另1路一上電就是高電平)。 ADC引腳也不需要重新設置,只要關閉ADC電源就行了:看到手冊有寫我才會去驗證,果然如此! 所有STC8G的端口設置只在程序初始化的時候設置一次而已:真不是這樣子的,STC手冊不斷更新中...呵呵,你懂的。 |
Y_G_G 發表于 2022-3-31 16:14 感謝回復!!! 未見你有過回復,或許刪除了; 反正我就2個ADC、1個I2C、2個開關、4個控制腳、其他空腳: 目前做到:總16.2μA-LDO7μA-ADC分壓電阻6μA-I2C傳感器待機0.2μA≈3μA(STC8掉電時電流,萬用表校準過)。 目前我的比較精確的實測數據事實就如此,都反復歸零驗證過的; 之前ADC轉換完就已經關了ADC電源的(不然電流就更大了),反正目前掉電前若不不關閉數字輸入,就一定會每一路多16μA。 后來沒啥事,反正俺近期有的是時間,能省的電必須。》凑壳暗腟TC5最低約3μA(±0.5μA精度)我是做到了。待機時間延長3倍!!非?捎^!原來總約48μA,現在16.2μA(少2路ADC影響約2*16μA).其實還可省零點幾μA但沒什么實際意義了.呵呵!不如結案也罷! |
ax6808 發表于 2022-3-31 00:40 還在整這個??? STC8G壓根就不需要設置PxIE,我從來不管這個寄存器 我一直在用這個單片機,最小系統掉電模式下.4.2V供電的待機電流就是3.5uA,可能是萬用表測量有誤差,但大概就是這個值左右 跟設置不設置PxIE沒有關系,從來都是默認值 如果你的電路超過這個值了,那就是外圍其它電路在耗電,我幾個月就回復過這個帖子了 我從來不設置PxIE,掉電模式電流一直是在5uA以下的 ADC引腳也不需要重新設置,只要關閉ADC電源就行了 所有STC8G的端口設置只在程序初始化的時候設置一次而已,待機電流一樣的能在5uA以下 |
ax6808 發表于 2022-3-27 22:53 剛才最后測試驗證了:我的STC8G模塊,掉電前設置PxIE寄存器,每關閉一路ADC數字輸入通道,掉電后流還可進一步減少15~17μA! 對于超低功耗產品設計,意義很大。 原來實測掉電后總約29.8μA,現在已降到16.2μA!(還不知道有沒有其他油水,呵呵! 學無止境!) |
本帖最后由 ax6808 于 2022-3-30 21:55 編輯 ax6808 發表于 2022-3-26 18:37 查到怎么"關閉數字輸入"了,有空實測一下究竟還有沒油水?? STC8H的最新手冊(20211221版)說的較詳細(之前版本還漏了P4IE到P7IE等): 6.5.1電源控制寄存器( PCON) PD:時鐘停振模式/掉電模式/停電模式控制位 0:無影響 1:單片機進入時鐘停振模式/掉電模式/停電模式, CPU 以及全部外設均停止工作。喚醒后硬件自動 清零。( 注:時鐘停振模式下, CPU 和全部的外設均停止工作,但 SRAM 和 XRAM 中的數據是一直維持不變的) 9.1.2端口模式配置寄存器( PxM0, PxM1) 注意:當有I/O口被選擇為ADC輸入通道時,必須設置PxM0/PxM1寄存器將I/O口模式設置為輸入模式。 另外如果MCU進入掉電模式/時鐘停振模式后,仍需要使能ADC通道,則需要設置PxIE寄存器關閉數字輸入,才能保證不會有額外的耗電。 ( 進入掉電模式CPU以及全部外設均停止工作了,“仍需要使能ADC通道...“是什么意思???我還干脆ADC完就直接將ADC_POWER都關掉了!) 9.1.7 端口數字信號輸入使能控制寄存器( PxIE) 數字信號輸入使能控制 0:禁止數字信號輸入。若 I/O 被當作比較器輸入口、 ADC 輸入口、 觸摸按鍵輸入口或者為外部晶振接入腳等模擬口時,進入時鐘停振模式前,必須設置為 0,否則會有額外的耗電。 1:使能數字信號輸入。若 I/O 被當作數字口時,必須設置為 1,否 MCU 無法讀取外部端口的電平。 特別注意(新版手冊才有加注): 對于具有 RTC 功能的 MCU,當 RTC 的時鐘源選擇外部 32.768K 的晶振時,需要將晶振接入腳 P1.6 和 P1.7 的數字通道關閉,否則進入 STOP 模式后會有額外的漏電。(將寄存器 P1IE的 bit6 和 bit7 都設置為 0 即可關閉 P1.6 和 P1.7 的數字通道)。 17.1.1 ADC控制寄存器( ADC_CONTR) ADC_POWER: ADC 電源控制位 0:關閉 ADC 電源 1:打開 ADC 電源。 建議進入空閑模式和掉電模式前將 ADC 電源關閉,以降低功耗 。 ADC_CHS[3:0]: ADC 模擬通道選擇位 (注意:被選擇為 ADC 輸入通道的 I/O 口,必須設置 PxM0/PxM1 寄存器將 I/O 口模式設置為高阻輸入模式。另外如果 MCU 進入掉電模式/時鐘停振模式后,仍需要使能 ADC 通道,則需要設置PxIE 寄存器關閉數字輸入通道,以防止外部模擬輸入信號忽高忽低而產生額外的功耗)。 |
關于STC8等單片機I/O口的準雙向模式有關問題討論 1、準雙向一般只能用于數字輸入輸出,輸入時為弱上拉狀態,端口只有兩種狀態:高或低:很好理解! 2、準雙向口讀外部狀態前,要先鎖存為1,才能讀到外部正確的狀態:不太理解! (1) 什么叫鎖存為1?? 就是通俗的寫1吧? 我的開關直接接端口和地,之所以端口設為準雙向并寫1(跟懸空腳的正確處理方法完全相同。。,判斷開關狀態(查詢非中斷)只用到“if某端口=0/1”就好,沒搞其他代碼,也沒有"等待兩個時鐘_nop_()",。是因為這樣既簡單可靠又省電,而且還省掉了外接上/下拉電阻。 若設置為“高阻輸入”去判斷按鍵狀態,還得額外增加合適阻值的上拉、下拉或分壓電阻,STC內部已有好幾種上拉電阻可用,不是自找麻煩么。 (2) 什么叫“讀取外部正確的狀態”?? 只用于沒外接上/下拉電阻的按鍵或開關狀態之列的識別么? 如I2C外設的2腳連接及其讀寫,我感覺只設雙向就好,無需也不用寫1,實際我也沒寫1,也沒有"等待兩個時鐘_nop_()",讀寫都沒有發現問題,是因為I2C等外設的數據線上已經有上拉電阻了么? 那么;下面例程中的“雙向口讀寫操作”中的讀部分,不知道究竟該怎么準確應用?P00 = 1讀取端口前先使能內部弱上拉電阻還等待兩個時鐘? P00 = 1; //讀取端口前先使能內部弱上拉電阻 _nop_(); //等待兩個時鐘 _nop_(); // CY = P00; //讀取端口狀態 ... (3)解釋的比較完整的(也只說了基本原理還是沒說到具體使用方面的點子上): 準雙向口向端口寫1:就是向鎖存器寫1,也就是讓其口輸出FF。 為什么,是這樣的,給鎖存器寫1,那么鎖存器的反向端就輸出0,那么和它相接的MOS管也就在截止狀態,也就是呈高阻態,這樣口上數據就會從讀引腳的三態緩沖器上正確的輸入,如果不寫1,那么鎖存器上次鎖存的可能為0,那么反向端有可能出現1,這樣和反向端相接的MOS管就倒通,也就是直接拉到地,那么不管你口上輸入什么信號都會拉成低電平,輸入就錯了。 雙向口與準雙向口的區別主要是: 準雙向口I/O口操作時做數據輸入時需要對其置1,否則若前一位為低電平,后一位輸入的電平為高則MOS管拉不起來導致出錯。而雙向口則不需要做此動作,因為雙向口有懸浮態。 準雙向口只能有效的讀取0,而對1則是采用讀取非零的方式,就是讀入的時候要先向接口上寫1,然后再讀。真正的雙向口正如其名,就是真正的雙向io不需要任何預操作可直接讀入讀出。 |
今天又測試了一下我的實際模塊STC8+硬件I2C電路板。VCC3.7V鋰電池供電,VDD LDO3.3V,TSSOP20封裝,3個腳為ADC高阻輸入,6個腳接I2C或控制腳及2個腳串口準雙向,其余空腳設準雙向寫1,4秒掉電喚醒一次...最終掉電后的電流也只做到29μA就再也下不來了(掉電前已關閉ADC、串口中斷,I/O口設為全高阻等等電流都不會更小了).理論上還可以降低掉電后的電流的???LDO有幾μA,I2C傳感器2腳本身極省電模式最多幾μ安有10K上拉電阻查詢模式。。。。 也不知道掉電期間還有什么內部功能可以關閉進一步省電。 |
最后實際3.3V時2μA左右就對了:掉電模式本身0.4μA,掉電喚醒定時器1.5μA,總共約2μA就對了。! VDD為5V時大很多! 我前面用的USB轉串口的3.7V電壓腳(本來有3.3V腳的,我把它跟VCC腳焊在一起了沒分開,而VCC腳只是5V串了2個二極管后約3.7V出來的)。 |
Jiang_YY 發表于 2021-10-12 22:18 不是的! 5. 特別注意:由于 STC8H 系列的所有 I/O(除了 ISP 下載口 P3.0/P3.1 外)在上電后都是高 阻輸入模式, I/O 外部電平不固定,此時如果 MCU 直接進入掉電模式/停機模式,會導致 I/O 有額外的耗電,所有在 MCU 進入掉電模式/停機模式前,必須將所有 I/O 口都根據實 際情況設置好 I/O 口的模式,對于所有沒有使用的外部懸空的 I/O 都需要設置為準雙向口, 并固定輸出高電平。特別是部分管腳的芯片,由于芯片內部有部分 I/O 口并沒有打線到外 部管腳,所以這些 I/O 也是處于懸空狀態的,這部分 I/O 也需要設置為準雙向口,并固定 輸出高電平。 |
本帖最后由 ax6808 于 2022-3-27 22:39 編輯 最后實踐證明: 省電主要靠低壓MCU+掉電喚醒模式;掉電前關閉所有不必要的功能如ADC等等等等,所有I/O設置為準雙向并寫1,喚醒后恢復原I/O口設置及有關功能,這樣最省電。。。。。 剛測試了一下STC8H1K08核心板無外圍電路,掉電喚醒前后電流變化: 記錄:1.裸板只有P12 led;PD前 VDD=5V,3.2mA, VDD=3.7V,2.6mA; 2. PD前全設雙向置1(只P12=0排除LED影響),PD后設回:VDD=5V,0.37mA降為0.3mA;VDD=3.7V時效果明顯!!!,30μA降為2μA(2mA檔); 5V不知道為什么多那么多,暫未經過進一步的測試考究。 另外,手冊描述注意: 當有I/O口被選擇為ADC輸入通道時,必須設置PxM0/PxM1寄存器將I/O口模式設置為輸入模式。(這個好理解,必須的); 另外如果MCU進入掉電模式/時鐘停振模式后,仍需要使能ADC通道,則需要設置PxIE寄存器關閉數字輸入,才能保證不會有額外的耗電;(如何關閉數字輸入????我只是PD前關閉了ADC功能也一樣省電吧?) |
18701931930 發表于 2021-10-12 20:38 配置 P0~P5 的IO模式,總共花不了 2us 的時間,既然目的是省電,僅僅切換IO模式就能達到目的,已經算工作量很小的了,知足吧。 給你一個快速更改IO模式的頭文件,你好輕松點。 http://www.zg4o1577.cn/bbs/dpj-211950-1.html |
18701931930 發表于 2021-10-11 21:39 懸空的IO,要設置為輸出模式,使IO口的電平固定。如果設置為輸入模式,IO口懸空時電平會有很微小的變化,會導致uA級微小的電流,電流大小跟具體使用芯片的輸入電路有關。 |
定時喚醒定時器功耗大約是1.8uA |
188610329 發表于 2021-10-11 23:16 謝謝指導! 減小了將近一半,但不是很滿意 啊。 |
進入掉電模式之后,所有的端口會保持進入掉電模式前一刻的狀態,這一點很重要,也就是說,進入掉電模式之前,端口的電平不會改變,而且片上所有的端口寄存器也都不會改變 解決這個問題實際上是很簡單的 單片機只留下電源的濾波電容,其實所有的外圍元件都不要,然后進入掉電模式,電流如果是在正常待機電流范圍內,說明你的掉電模式代碼是沒有問題的,剩下就是外圍元件的問題了 外圍電路不同,進入掉電模式之前的端口處理也會不同,有的要高電平,有的要低電平 至于ADC和比較器什么,并不是電流達到1.5mA的原因 |
18701931930 發表于 2021-10-11 21:39 嗯,至少比你一開始1.5mA小了很多了, 需要關的還有很多,太久了,也記不清了。 好像比較器有個濾波要關,比較器正負極都要切換到內部, 然后有幾個和時鐘相關的分頻器要關,ADC通道要切換到空, 你可以打開寄存器列表,對照著關看看。 |
8H的沒有測過,8G系列的測過,掉電模式下電流用萬用表測確實只有0.4uA。你要關閉所有外設,內部定時器、AD電源、IO設置為高阻等,最簡單的就只焊接芯片,這樣一下就可以測出來是哪里問題了 |
18701931930 發表于 2021-10-11 12:49 大多數IO默認高阻,但是,不包括P3.0 P3.1, 所以要手動高阻。其他功能很多是默認開,需要你手動關閉,在所有IO懸空,設為高阻,關閉各種可以關閉的模塊后,電流<50uA 是沒什么問題的,但是要達到他說的0.4uA是不可能的,只有他們實驗室才能出來這個結果。 LVD就很可笑了,能夠關閉的只是ELVD中斷, 但是 LVD低壓檢測根本沒有辦法關,ISP燒錄器可以選擇LVD檢測閥值就是沒有關閉LVD檢測的選項。所以關閉LVD只是在STC內部實驗室才存在。 STC的手冊,前后矛盾的地方有很多,你也不用盡信。 |
首先, 掉電模式的 0.4uA,只是指這么模式,消耗的電流是0.4uA(還是3.3V的前提),而不是說在這個模式下,整個單片機的電流只有0.4uA,換個說法,你要達到1uA以下這個電流,需要滿足很多條件: 首先,供電電壓3.3V, 其次所有的IO都切換到高阻模式(包括P3.0,3.1),然后關閉所有中斷,關閉所有定時器,關閉所有比較器,以及其他各種檢測用模塊,等等。而比如低壓檢測模塊會消耗10uA電流,找遍整本手冊你都找不到任何可以關閉他的地方,即使不開低壓中斷,LVDF標志始終會動作。所以,看過就看過了,別覺得可以達到就好了。 |
本帖最后由 lkc8210 于 2021-10-11 10:23 編輯 我試過把STC15的IO 設為高阻然后進入掉電 也發現還有幾毫安 然后把IO設為準雙向再進入掉電 就能實現幾微安 你可以從這方向試一下 ![]() |
掉電模式電流是指關閉芯片所有輸出和內置外設的電流。 |