頻率
GPIO的針腳只能輸出 0V 或 3.3V的電壓. 那如果我們設計一個程式, 讓針腳放電50ms, 不放電50ms, 然後重複這二個動作, 就會形成如下的波型
上圖中, 在一秒鐘內高低電壓總共變化了10次, 我們就稱頻率為10Hz
平均電壓
再依上圖來說明, 那這一秒鐘內, 電壓的平圴值是多少呢? 因為是50ms 3.3V, 50ms 0V, 所以測出來的平圴電壓為3.3/2=1.65V
工作周期(Duty cycle)
接著我們把上圖放大, 並改成如下. 在一個周期中, 高電壓放電40ms, 低電壓維持10ms. 此時高電壓佔了一周期(50ms)的4/5=80%的時間, 所以平圴電壓就會變成 3.3*80%=2.64V
高電壓佔80%的時間, 我們就把80%這個值稱為工作周期. 有時我們又稱為脈衝寬度(Pulse Width)
因此, 我們就可以利用工作周期來達成類比電壓的控制了.
頻率大小有什麼區別
按照數學的平圴值來算, 1秒完成10個周期(10Hz), 跟1秒完成100個周期(100Hz), 其值都是一樣的. 但在人類的眼睛看來就不一樣了. LED一秒鐘閃10下, 跟一秒鐘閃100下, 我們就會覺的前面超閃爍的, 但會覺的後面的光線就很平順.
同樣的, 有的零件比較敏感, 比如在失去電力1ms就需重啟, 那為了不讓零件重啟浪費時間, 就必需將頻率設定在超過1000Hz之上.
Raspberry方法
Gpio.pwmSetClock(100) : 將GPIO的接腳設定為1秒完成100個周期, 即設定頻率
Gpio.pwmSetRange(2000) : 將一個周期分為2000個等份.
Gpio.pwmWrite(1, 100) : 將pin1 的脈衝寬度設定為 100/2000 = 1/20 = 5%
所以由上說明可知, 工作周期為Gpio.pwmWrite(1,100)及Gpio.pwmSetRange(2000)二者值相除的結果