在PC散熱風扇之研究三:PWM風扇進階研究一文中介紹過用PWM控制
PC風扇轉速,而Arduino本身就提供好幾個PWM輸出腳位,可以直接
拿來控制PC上的散熱風扇。
先看Arduino UNO的介面圖:
Arduino UNO上有6個PWM控制腳可以用,PCB上有標示~的就是有PWM功能的腳位,
pin 3,5,6,9,10,11
先前介紹風扇的文章中也介紹了PWM技術,如下圖:
對PWM技術來說,很重要的參數就是佔空比(Duty cycle),Arduino可以設定為0-255,也就是8bit
深度。
而不同接腳能輸出的頻率不一樣,
pin 5,6 可以輸出976.5625Hz,也就是約1K Hz
pin 3,9,10,11則是490.196Hz,也就是約500Hz
Arduino PWM輸出的控制指令非常簡單:
analogWrite(接腳編號,類比數值);
接腳編號就是上述的那幾隻腳,類比數值就是上述的0-255之間。
PWM的電壓輸出可以用公式換算,計算公式:
類比輸出電壓=佔空比 * 高電位值
反過來算:
佔空比 = 輸出電壓 / 高電位值
假設要輸出3.3V類比電壓,高電位值=5V
所以是3.3/5 = 66%
因Arduino的設定是0-255,所以是255*66%=168
PWM的類比數值填168,即可讓PWM接腳輸出3.3V
以上的計算很簡單。
利用可變電阻控制PWM風扇
如上述要改變PWM的輸出很簡單也很方便計算,但不太可能
每次要調整轉速時就修改程式一次,不方便也不合理。
所以實務上可以透過一個可變電阻(VR),利用類比輸入腳進行偵測,
並將結果輸出到PWM腳上,這樣就能靠控制轉動VR的角度來改變風扇
的轉速輸出。
程式碼:
int fan = 9; //設定 Arduino 風扇腳位在 9 pin
void setup() {
// 初始化傳輸速率設定為9600
Serial.begin(9600);
pinMode(fan, OUTPUT); //定義 pinmode 為 pin 9 OUTPUT 輸出
}
void loop() {
// 讀取輸入 on analog pin 0:
int pot = analogRead(A0); //設定A0 值為讀取類比訊號
int fan_speed = pot * (255 / 1023.0); //這個公式將會計算風扇速度的pwm輸出介於 0-255
analogWrite(fan,fan_speed); //我們設定 9 pin 為 pwm 風扇速度輸出
Serial.println(fan_speed); //利用 Serial.println函數可以在序列監控視窗中輸出風扇速度的值
delay(1000); // 我希望每秒鐘可以延遲印出值
}
此程式預設是PWM接腳輸出為pin9,VR接到A0輸入,
因類比輸入解析度有0-1023段,但PWM輸出只有0-255,
所以中間需要mapping一下,我有特別標示出來。
com port輸出如下圖:
輸出數值會隨著VR轉動角度不同而改變,最高為255最低為0。
留言列表