高精度簡易電子稱第二步 低功耗測試

2021-09-26 00:13:48 字數 3120 閱讀 8498

雖然這個稱做出來的樣子不是可攜式,外觀有些簡陋(自己用木頭架子搭起來的),但是對於使用兩節3.7v的18650的鋰電池供電來說,還是需要設計一下低功耗的。

稱的使用頻率不高,不能讓觸控螢幕一直亮著,也不能讓微控制器一直處於工作狀態,那樣也太不節能、太不綠色了。

我想要的效果是在稱上沒有放任何東西的時候,如果持續30秒沒有放置,立即進入低功耗模式,但是sram和暫存器中的資料不要丟失,在這個基礎上,功耗盡量小就可以了

對比上面的模式說明,我需要進入的是停止模式。

停止模式是在cortex™-m3的深睡眠模式基礎上結合了外設的時鐘控制機制,在停止模式下電壓

調節器可執行在正常或低功耗模式。此時在1.8v供電區域的的所有時鐘都被停止, pll、 hsi和

hse rc振盪器的功能被禁止, sram和暫存器內容被保留下來。

關鍵的一點是在停止模式下,所有的i/o引腳都保持它們在執行模式時的狀態。 

確定了進入的是停止模式,那麼如何才能進入停止模式呢?

其實這麼多操作,st全都給我們封裝在了乙個庫函式中:void pwr_enterstopmode(uint32_t pwr_regulator, uint8_t pwr_stopentry)

具體內容是:

void

pwr_enterstopmode(uint32_t pwr_regulator, uint8_t pwr_stopentry)

else

/*reset sleepdeep bit of cortex system control register

*/scb->scr &= (uint32_t)~((uint32_t)scb_scr_sleepdeep);

}

我們只需要在需要低功耗的時候,呼叫這個函式就行了。

但是我們要選擇自己需要喚醒時的方式——中斷wfi(wait for interrupt)  or  事件wfe(wait for event)

這兩個有點繞:事件是中斷的觸發源,開放了對應的中斷遮蔽位,則事件可以觸發相應的中斷。在stm32中,中斷與事件不是等價的,乙個中斷肯定對應乙個事件,但乙個事件不一定對應乙個中斷。

比如我想要使用外部按鍵喚醒停止中的stm32,那麼需要把按鍵引腳對映在了外部中斷線上,然後對應的上面配置成中斷喚醒方式:

pwr_enterstopmode(pwr_regulator_lowpower,pwr_stopentry_wfi);

在按鍵的中斷函式中配置退出低功耗時的操作即可。

hsi時鐘是板子上的8m晶振提供的,而我們使用的是72m的時鐘,所以還需要重新配置一下時鐘:

//

啟動並配置stm32

errorstatus hsestartupstatus;

//使能 hse

rcc_hseconfig(rcc_hse_on);

//等待 hse 準備就緒

hsestartupstatus =rcc_waitforhsestartup();

if(hsestartupstatus ==success)

//選擇pll作為系統時鐘源

rcc_sysclkconfig(rcc_sysclksource_pllclk);

//等待pll被選擇為系統時鐘源

while(rcc_getsysclksource() != 0x08

)

}

使用的是hmi串列埠屏,乙個指令即刻讓螢幕進入sleep模式

//

hmi息屏

void hmi_sleep_mode(void

)

還是檢視晶元手冊:

cs1237重新喚醒,sclk回到低電平並保持10us

void cs1237_restart(void

)一開始考慮使用定時器定時對比讀出的重量資料,如果資料在30s內沒有變化並且一直小於1g,則進入低功耗模式,但是又怕定時器的中斷正好發生在cs1237的讀寫過程中,

這樣會打斷時序,造成讀數誤差

我看了一下我程式主迴圈迴圈一次的用時,大概在0.2s左右,其實這個也能當做乙個基準,因為每次迴圈的時間都是差不多的。

那麼我可以每迴圈一次就進行一次資料對比,每滿足上面的情況就+1,當迴圈計數150次的時候,進入低功耗。否則清零計數。

這樣每次進入低功耗的時間其實都是相差無幾,而且節省了乙個定時器。運用迴圈體本身的時間作為計時標誌。

//

下面是關於進入低功耗的判斷

//**發現在沒有收到觸控螢幕的按下時,迴圈一次的時間大致為4s,這樣省去了乙個定時器,避免了中斷

low_power_weight_1 =now_weight;

if((low_power_weight_1 < 1) && ((low_power_weight_1-low_power_weight_2 < 1) || (low_power_weight_2-low_power_weight_1 < 1

)))

else

//重量低於1g並且在40秒內沒有變化,即開始進入低功耗

if(low_power_num >= 80

)

diango專案第二步

django 模板 使用 django.http.httpresponse 來輸出 hello world!該方式將資料與檢視混合在一起,不符合 django 的 mvc 思想。django 的模板是乙個文字,用於分離文件的表現形式和內容。模板應用例項,在 helloworld 目錄底下建立 tem...

python學習第二步

函式的呼叫 以絕對值函式abs 為例,可以直接從python的官方 檢視文件,也可以從互動介面利用help abs 檢視。常用或不好記函式 持續更新 hex 函式 將乙個整數轉換為十六進製制表示的字串。函式的定義 定義乙個函式要使用def語句,函式返回值用return語句返回。ep def my a...

成為ITer的第二步

斷斷續續的補習,對於網管 系統管理的知識算是有了個大概認識。今天小結幾個要點,算是對以前的失誤及現在的更新認識吧。1 選擇乙個主攻方向,太重要了!it行業往細處做真的技術多,而且更新快,說實在的跟不上時代的節奏。不是我不行,而是沒入行,閉門造車 的惡果就是習得一些過時的技術,沒用。得專注,專注在乙個...