---
# System prepended metadata

title: 'Project : 富泰-VF模組'
tags: [NHY, ' Project', 富泰, FuTai]

---

---
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 轉換
* 開機關機狀態動作

繪出設計圖如下：
![](https://i.imgur.com/azlhvEt.png)

<!--
```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
