實驗(三)飛梭編碼器輸入

(教學教材內容保留所有版權~欲轉載請註明出處~謝謝)

實驗(三) 飛梭編碼(帶開關)輸入單元


實驗目的:

本節在實現飛梭編碼(帶開關)輸入單元模組。

實驗一:

開關ON/OFF+左右旋解碼,開關按一下ON、LED0亮,向右旋轉LED累加,向左旋轉LED遞減

實驗二:

開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,向右旋轉LED 變暗,向左旋轉 LED 變亮。

實驗三:

開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,按住 sw1 或向右旋轉 LED 變暗,按住 sw2 或向左旋轉 LED 變亮。

I/O腳位定義:

編碼訊號ROTARY_A:pd.7

編碼訊號ROTARY_B:pd.6

按鈕ROTARY_SW:pi.6

模組函式規畫:

/// ======== START Public 函式 ========

void Initial_Rotary();                           /// 初始化 IO

void Rotary_Control();                       /// 飛梭旋鈕控制 LOOP

/// ======== END Public 函式 ========

 

/// ======== START Rotary Callback 函式 ========

extern void Rotary_Up( void );          /// Callback 函式,當 Rotary 放開時會被持續叫用

extern void Rotary_Down( void );    /// Callback 函式,當 Rotary 按住時會被持續叫用

extern void Rotary_Press(void);       /// Callback 函式,當 Rotary 按下時會被叫用一次

extern void Rotary_Release(void);   /// Callback 函式,當 Rotary 放開時會被叫用一次

extern void Rotary_CW(void);          /// Callback 函式,當 Rotary 順時針轉一格會被叫用一次

extern void Rotary_CCW(void);       /// Callback 函式,當 Rotary 逆時針轉一格會被叫用一次

/// ======== END Rotary Callback 函式 ========

模組函式設計:

操作函式設計:

基本上飛梭按鈕模組的設計方式跟實驗二的按鈕模組很類似,都是輸於輸入模組,單看上列模組函式可以發現滿它的按鍵事件跟按鈕模組完全一樣(因為飛梭按鍵其實就是帶有一個獨立的按鈕),多出來的就是旋鈕正反旋轉的事件。這也是在設計模組時要把握的一個原則,就是在函式的命名上要儘量能統一、能一目瞭然、能讓系統設計時一看到函式名稱就知道大概怎麼用。

當然,一般按鈕跟飛梭按鈕在硬體的設計上必定是大不相同的,所以其底層函式底層的實作也必定不相同,程式設計師需要依循硬體規格及其Datasheet去完成實作。

控制函式的實作:

參考Datasheet,略。

實驗實作:

實驗一:

開關ON/OFF+左右旋解碼,開關按一下ON、LED0亮,向右旋轉LED累加,向左旋轉LED遞減。

系統的大致架構如下,你會發現它跟實驗二的系統架構如出一徹,這便是模組低耦合度的一個表現,同樣的系統功能,可以很輕易的用不同的模組來替換(或同時控制),在硬體的觀點來看,便是,同樣的輸出功能需求,可以由不同的輸入方式來作控制,大大增加了軟體、硬體整合的彈性。

void   FPPA0 (void)

{

                      /// 初始化...略

                      while (1)

                     {         /// 飛梭旋鈕控制 LOOP

                                Rotary_Control();

                      }

}

void Rotary_Press(void)                     /// Callback 函式,當 Rotary 按下時會被叫用一次

{
                /// 略

}

void Rotary_CW(void)                       /// Callback 函式,當 Rotary 順時針轉一格會被叫用一次

{

                      if( START_RUN )

                                LED_SR0();

}

 

void Rotary_CCW(void)                     /// Callback 函式,當 Rotary 逆時針轉一格會被叫用一次

{

                      if( START_RUN )

                                LED_SL1();

}

實驗二:

開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,向右旋轉LED 變暗,向左旋轉 LED 變亮。

略。

實驗三:

開關ON/OFF+左右旋解碼控制 LED 亮度,開關按一下 ON、LED0 亮,按住 sw1 或向右旋轉 LED 變暗,按住 sw2 或向左旋轉 LED 變亮。

略。