--- tags: NHY, Project,FuTai,富泰 --- # Project : 富泰-VF模組 ## 專案簡述: 規格需求: > * 關機的狀態下,按壓開關鍵(DI連續開啟1秒後承認),PWM依VR調整的數值輸出,並開啟Relay1(J4)輸出,固定秒數10秒後。Relay2(J5)打開輸出,完成開機動作,開機指示燈恆亮。 > * 開機的狀態下,按壓開關鍵(DI點連續1秒後承認),Relay2(J5)關閉輸出,固定秒數10秒後PWM停止輸出 (風機關閉)及Relay1(J4)關閉輸出,完成關機動作,關機指示燈恆亮。 > * PWM輸出由VR旋鈕定義輸出。 ## 設計思路: 根據規格需求,列出以下幾點會達到的步驟: * ADC 取得 * PWM 驅動 * ADC -> PWM 轉換 * 開機關機狀態動作 繪出設計圖如下:  <!-- ```flow st=>start: 開始 e=>end: 結束 sysinit=>operation: 系統初始化 off1 =>operation: RELAY2 OFF off2 =>operation: PWM / RELAY1 OFF on1 =>operation: RELAY1 / PWM ON on2 =>operation: RELAY2 ON offcond=>condition: 是否經過十秒? oncond =>condition: 是否經過十秒? swcond =>condition: 開關是否開啟? st->sysinit->off1->offcond offcond(yes)->off2->swcond offcond(no)->swcond swcond(yes)->on1 swcond(no)->off1 on1->oncond oncond(yes)->on2->swcond oncond(no)->swcond ``` --> ## 遇到的困難: **針對在開發中遇到的問題,我將它分為三樣如下:** * PWM部分延遲與抖動 * 陣列搜尋超出索引值 * 程式撰寫的結構 ### PWM部分延遲與抖動 Q: PWM的開啟的時間(波形)會有一點偏差,發現是會**重複開啟**PWM A: 因此使用開關來判斷他是否開啟以避免重複更動到PWM的暫存器。 ```C= void PWM_ON() { if(is_PWMCONV) { return; } // PWM ON } void PWM_OFF() { if(!is_PWMCONV) { return; } //PWM OFF } ``` ### 陣列搜尋超出索引值 Q: PWM的值會發生抖動與會發生突然變換,經過debug mode 觀察為計算上會發生錯誤。 A: 發現是ad在存取紀錄得到的值訪問超除陣列的大小,因此可能變更或讀取到其他地址的值,可設置大小界來避免這類問題發生 ### 程式撰寫的結構 原先想說兩個狀態用if else 控制即可,但鑑於維護的便利性,還是使用switch case 來控制狀態機來控制狀態。 **Using :** ```C= enum _DEF_SYS_STATE { DEF_POW_ON, DEF_POW_OFF, } unsigned char STATE_CTRL; void sys() { switch(STATE_CTRL) { case DEF_POW_ON: // do something break; case DEF_POW_ON: // do something break; } } ``` ## 更多資訊: [更多詳細資訊](https://hackmd.io/@huyuhua/NHY_VF_MODEL_EN) ## Contect Auther : YUHUA,HU HackMD : @huyuhua email : rd05@nhy.com.tw
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up