-
1 # IT自動化交流
-
2 # 牧碼南山
從接觸微控制器到現在,也有十幾年了,從個人設計經驗上來簡單說一說,希望可以給你提供一點思路和參考。
可靠性微控制器程式可靠性這個這個話題比較大,但是也還是有可行的方法來操作的開發流程標準化,可以儘量往CMMI 3級標準上靠。要有系統設計文件輸出,軟體版本管理,bug管理系統進行bug跟進。
系統設計,主要是將整個系統按功能層次做好模組化設計。如果所在的公司或機構還沒有一套成熟的系統功能劃分方法,我建議你可以參考ARM 的 CMSIS架構來劃分軟體模組,然後進行系統設計。CMSIS架構如下圖所示。硬體,軟體可靠性好,前提是它所執行的硬體系統也需要設計得可靠。這就需要設計硬體時多用你們已有的成熟電路,設計初期進行DFMEA等。軟體設計,提倡先寫設計文件再擼程式碼。主要是設計的時候需要多做單元測試,提高程式碼質量。程式碼質量提高的方法有降低邏輯複雜度,模組化設計等,可以直接參考MISAR C標準做程式碼質量檢測,這塊工作有工具可以完成,不用人肉做,相關工具有polyspace,QAC,PC-Lint等。實時性要想實時性高,方法有兩種,
簡單粗暴的,直接用頻率更高的MCU。
非同步設計。這種設計主要是透過儘量少使用空跑迴圈來做延時實現的。比如這個例子,我希望foo函式延時n毫秒再做某事:
void foo(void){ uint32_t i; for(i=0;i<delay_time;i++){}; //do something here}void task_5ms(void){ foo();}上述這種就是死等延時,這種設計實時性很差,我們完全可以透過狀態機的方式,讓for迴圈這個延時釋放出來做別的事。改進例子如下:
uint32_t delayCounter = 0;; void foo(void){ if(delayCounter<(delay_time/5ms){ delayCounter++; }else{ //do something here delayCounter=0; }}void task_5ms(void){ foo();}運用這種非同步方法,可以大大提高系統實時性。還有就是像寫flash,EEPROM這種操作,也可以先更新記憶體值,再統一10ms左右更新一次這樣非同步實現,來提高實時性。
測量準確性測量準確性這塊主要分三個方向分析和改善
硬體元器件,儘量選精度高的電阻電容,降低元器件引入的誤差。
電路設計,PCB 布板時儘量降低由於佈線引入的干擾,保證參考電壓源和地不會因為干擾源發生抖動。
軟體濾波。如果硬體已經成型,可以透過多個取樣週期後求平均值,或者搞一個一階濾波或者多階濾波演算法,甚至FFT取樣然後去掉分頻量的方法提高取樣的準確度。還有就是對於一些明顯的錯誤值,可以考慮丟棄掉,當前週期暫時使用上一個週期的有效值的方式去做計算。
-
3 # 峟思
這一期,重點所講內容主題是振弦式測縫計結構及工作原理,以下是相關內容:
結構:
VWD-J 型振弦式測縫計由護管座、護筒、位移計、後接圈、觀測電纜等組成,其位移計內部由滑動測杆、振弦、激振電磁線圈、測溫元件等組成。
埋入式測縫計結構圖
工作原理:
當被測結構物發生位移時將會帶動測縫計變化,透過前、後端座傳遞給振弦使其產生應力變化,從而改變振弦的振動頻率。電磁線圈激振振弦並測量其振動頻率,頻率訊號經觀測電纜傳輸至讀數裝置,即可測出被測結構物的位移量。同步測量埋設點的溫度值。
回覆列表
題主提到的微控制器程式的可靠性、實時性,
軟體架構起著決定性的作用,微控制器程式的軟體架構有以下幾點需要考慮:
1)分層分模組
微控制器程式至少分為三個層次,包括硬體驅動層,中間層,和應用層。
硬體驅動層主要實現對硬體的驅動控制,包括輸入按鍵檢測,AD取樣,UART/IIC/SPI的收發,系統定時時鐘的產生、定時事件傳送、事件銷燬,輸入指示燈控制,LCD顯示控制,FLASH讀寫等等。
中間層作為硬體驅動層和應用層之間的中間處理模組,負責將應用層控制硬體驅動層的公共邏輯抽象提煉,而設計成一些能脫離應用層獨立執行的模組。比如UART資料的收發,當應用層需要傳送資料時,需要呼叫UART硬體驅動層的傳送函式將資料填入傳送快取,再透過UART的傳送中斷或DMA將資料逐一送出,當有多個應用層都需要往UART傳送資料時,需要有佇列的機制,需要有先進先出的機制等等,而且有些應用層的UART資料需要有對端的應答,在超時沒有收到應答時,需要超時重發。當多個應用層模組需要透過UART傳送資料時,每一個應用層模組都需要處理這樣的邏輯,將會使軟體異常臃腫無法維護。這個時候需要有一個串列埠資料的收發模組,將所有應用層的資料填入佇列,透過狀態機按先進先出將報文從佇列取出,透過硬體驅動層的介面傳送出去,同時透過狀態機處理資料應答,超時重發等機制,這樣一來,應用層的模組只需要閉著眼睛調中間層的函式介面傳送報文,並且檢測中間層返回的狀態,做一些事件處理即可。
應用層是根據產品的功能抽象,根據不同的功能模組劃分,包括,裝置設定、UI顯示、應用邏輯控制等等。每一個應用層的功能模組都要配合狀態機實現,狀態機的每一個狀態都有一個狀態函式,每一個狀態函式都有定時器,子狀態等等,之後就是按照邏輯根據不同的事件切換狀態。
這個問題太大了,未完待續