我們設計的簡易PLC所提供的變量,有一類是斷電記憶的。
所謂斷電記憶也就是數據在斷電重啟之後保持斷電前的數值。
MCU的存儲器分為兩類:RAM和ROM。
兩者的最大區别是RAM在斷電以後保存在上面的數據會自動消失,而ROM不會自動消失,可以長時間斷電保存。
為了實現斷電記憶,需要把數據寫入到ROM,即FLASH中。
不幸的是,FLASH有兩個緻命的缺點:
1)擦寫次數有限,一般僅有10萬次的擦寫次數,超過擦寫次數,FLASH将被損壞。
2) FLASH的存儲位隻能由1改為0,如果需要将0改為1,則需要将數據擦除,最小擦除的單位為1個page。對于STM32F103為2KB,對于STM32F051為1KB。
通過BACKUP寄存器實現斷電記憶Cortex系列的處理器還有一種backup寄存器供斷電記憶數據使用,比如給RTC時鐘使用。
該寄存器的數據可以由VBAT的電壓來維持,而一般VBAT電壓由紐扣電池供電。
比如,我們選擇CR1220的電池,其容量為40mAh, VBAT的工作電流低到2uA。
CR1220的電池可以保證backup寄存器的數據在斷電之後一年内不丢失。
通過FLASH實現斷電記憶美中不足的是,STM32F103僅有84個字節的backup寄存器。
當需要斷電記憶的數據比較多時,還是需要将其存入到FLASH中。
可以分為兩種數據:
1)不會經常改變的數據,比如用戶設置的運行參數(比如密碼、溫控器的溫度阈值等)。
對于這種數據,隻需要做幾分鐘的緩存,在數據改變過後幾分鐘再寫入FLASH即可。
即使數據未存入FLASH,用戶重新設置即可。由于發生概率低,也不會有什麼問題。
2)改變頻率非常高的數據,比如計數器,有一個客戶将我們的控制器用于流水線上的計件。
基本上1s數據加一次,而且要求絕對準确。
保證任何不能錯計任何數據。
對于這種應用,如果還是采用1分鐘緩存的方法,10萬次的擦寫次數大概可以使用66天,不能滿足要求。
而且如果在這1分鐘内發生了斷電,數據沒能寫入FLASH,将會導緻這段時間的數據丢失。
當時,由于backup 寄存器數據有限,不得以需要采用FLASH來存儲。
技術方案
斷電延時電路
如上的電路圖所示,二極管D1用于電源反接的保護,V 經過R1、R2的分壓以及C5的濾波之後送入MCU的A/D口,用于檢測電源電壓。
補充:有網友留言,把檢測電壓的電路接到反向保護二極管的負極沒有辦法檢測到掉電,放在正極是否更好?
我們的考慮是,放在D1的正極,當有負電壓輸入時(比如脈沖群),負電壓經過R1,R2會直接到IO口,會形成所謂的潛通路。瞬間幾千V的高壓,是否會造成R1、R2以及IO口損壞,值得研究。
為了保證可靠,就放在了負極,避免了形成潛通路,同時對高頻正脈沖可以通過E1,C1的可靠過濾。
當掉電時,E1開始放電,此時并不能立即檢測到掉電,當放電至22V時,MCU認為掉電了,開始執行相應動作。
浪費了從23.2V到22V左右的能量,由于負載電流小,浪費這點能量并不導至C1無法取值。所以還是值得的。
小小的細節,卻能體現我們設計電路時的深思熟慮,這得益于我們的團隊之前從事汽車電子所形成的可靠性設計的思維。
E1用于儲能,用于當電源斷電時,給MCU供電,保證存儲在RAM中的數據可靠存入FLASH。
采用大電容給控制器供電,MCU實時檢測輸入電壓。
做了幾下的設計改進:
1)MCU的供電和其它負載(比如繼電器、WiFI模塊等)的供電分開,MCU專門由一路電源供電。
2)讓用戶采用控制器所支持的最高工作電壓為24V的電源供電。
3)在100us的定時中斷時,啟動A/D轉換并讀上次轉換數據,如果讀到的轉換數據所對應的電壓低于22V,則說明發生電源斷電,立即切斷所有輸出,以及一些内設模塊。從而在100us内就将功耗降到最低。
4) 在主程序中,判斷由定時中斷置位的斷電标志,如果判斷有檢測到斷電,降低主頻,
立即将需要斷電存儲卻暫存在RAM保存的數據寫入FLASH。
電容容量的計算DC-DC最低輸入電壓為5.0V左右。
STM32F103在禁用外設時,其工作電流大概為8mA@16MHz。
算上DC-DC的效率80%,以及DC-DC和LM1117的工作電流,以8/80% 2mA=12mA計算。
FLASH擦除時間為40ms/page, 寫入速度為70us/1bit。
假設需要存入的數據總量為1024Byte即512Word。
由擦寫 寫入需要花費的時間為80ms,實際可以在運行過程中先擦寫一個page備用,從而可以省去擦寫的時間,在這裡,仍以80ms來考慮。
要求斷電之後,電容E1上的電壓以12mA 的電流放電,從22V放電至 5V的時間需要大于80ms。
根據電容流過電容的電流I=C*du/dt,将電流、電壓降、時間等代入,得到:
C=12mA * 80ms /(22-5)=56uF,可選擇100uF的電容。
另一種計算方法可以從能量的角度考慮,計算更準确:
電容從22V放電至5V,所釋放的能量為1/2*C*(22*22-5*5),考慮到DC-DC的效率0.8,到5V的能量為:
1/2*C*459*0.8=5V*12mA*t=60mW*80ms。
解得C=26uF。
文中有任何錯誤,歡迎留言指正!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!