Version 3, last updated by fellong at Dec 01 09:24 2008 UTC
實驗(十二)直流風扇控制
/// ===============================================
/// 風扇控制模組
/// -----------------------------------------------
/// 功能 : 風扇 PWM 控制
/// -----------------------------------------------
/// Input Pins :
/// NONE
/// Output Pins :
/// FAN_PWM equ pi.4;
/// ===============================================
void Initial_Fan(); /// 初始化 I/O
void Fan_Control(); /// 風扇 PWM 控制 LOOP
void Fan_SetDuty(); /// 設定風扇 PWM DUTY, duty = a, ALL OFF(a=0), ALL ON(a=255)
void Fan_GetDuty(); /// 讀取風扇 PWM DUTY, a = duty
風扇速度的控制有幾種方法,一種是透過硬體電壓調整來控制,一種是透過直流 PWM 驅動控制,再一種是透過硬體 DA 轉換來控制電壓。FPPA 實驗平台是採用直流 PWM 驅動的方式來控制。
/// ===============================================
/// 風扇控制模組
/// -----------------------------------------------
/// 功能 : 具有回授信號及轉數計數功能的風扇控制( 計算 rpm 用 )
/// -----------------------------------------------
/// Input Pins :
/// FAN_SIGNAL equ pb.2;
/// Output Pins :
/// FAN_PWM equ pi.4;
/// ===============================================
/// ======== START 共享變數-由主程式宣告 ========
extern word fan_rpm_count; /// 風扇計數器,自上次歸零起的圈數,由主程式負責歸零
/// 使用範例:
/// fan_rpm_count = 0
/// Fan_Control() <---- 保持 pwm 輸出一段時間 T
/// 頻率 = fan_rpm_count / T
/// ======== END 共享變數 ========
/// ======== START Public 函式 ========
void Initial_Fan(); /// 初始化 I/O
void Fan_Control(); /// 風扇 PWM 控制 LOOP
void Fan_SetDuty(); /// 設定風扇 PWM DUTY, duty = a, ALL OFF(a=0), ALL ON(a=255)
void Fan_GetDuty(); /// 讀取風扇 PWM DUTY, a = duty
/// ======== END Public 函式 ========
至於 PWM 輸出的控制,可以跟 RGB LED 燈的控制作比較,它的控制手法可以跟 RGB LED 一樣,仍然能達到控制速度的功能,但是由於風扇回授信號的電源是跟風扇PWM電壓輸入電源是一樣的,造成 PWM 在切的時候,回授信號也跟著切,因此在 PWM 的控制跟回授信號的偵測上要比較有技巧,並且需要高頻的 PWM 輸出,所以其作法跟 RGB LED 是不同的,不是一個 STEP 一個 STEP 來作 PWM 輸出,而是一個 CONTROL 的呼叫就把整個 PULSE 周期作完整輸出,因此在主系統控制上需要特別注意,必須單獨一個核心來處理才能完成所需的功能,但是在設計上,仍然會在一個PULSE後把主控權還給系統,保留一些使用上的彈性。
另外,這個模組也用了一個變數技巧…
extern word fan_rpm_count; /// 風扇計數器,自上次歸零起的圈數,由主程式負責歸零
這個變數作為回授信號計數用,每個 PULSE 計數器+1,並且由主系統來讀它的值以及作歸零的動作。