Mbed OS 輸出 PWM訊號
PWM 脈寬調製是通過改變脈衝訊號的波形來控制模擬量的方法。PWM可以用來控制燈光亮度,電機速度,電源電壓等等。
PWM 訊號是一種脈衝訊號,具有下面幾個特點:
PWM 頻率
PWM訊號的週期是不變的,而高電平的寬度是變化的。
PWM 佔空比
PWM 的佔空比=100%*(高電平時間)/(脈衝週期)。PWM 的佔空比決定了輸出訊號的電壓平均值,佔空比高,輸出的平均值就高。使用一個RC濾波器電路就可以方便地將PWM 訊號轉換成平均值的電訊號。所以PWM是另一種形式的模擬量輸出方式。
Mbed OS PWMOut 類
Mbed 提供了PWMOut 類,它內部是使用STM32 中的TIM 產生PWM 訊號的。所以並不是所有GPIO腳都可以輸出PWM訊號的。具體的選擇方式要查詢modular-2 IO引腳定義表。
1 建構函式 |
|
pwmout() |
|
2 成員函式 write (float value) |
寫入當前的佔空比。浮點百分比 |
Read() |
讀出當前的佔空比。浮點百分比 |
period (float seconds) |
設定週期(秒) |
period_ms (int ms) |
設定週期(豪秒) |
period_us (int us) |
設定週期(微秒) |
pulsewidth (float seconds) |
脈衝寬度(秒) |
pulsewidth_ms (int ms) |
脈衝寬度(毫秒) |
pulsewidth_us (int us) |
脈衝寬度(微秒) |
例子 主機板LED燈漸變
modular-2主機板上的雙色燈控制線PC_6和PC_7 支援PWM 輸出,所以可以實現顏色的漸變。PWM 的頻率為100Hz(週期為10ms),改變的速度為50HZ,每次該變數為1%。
#include "mbed.h" PwmOut myled(PC_7); int main() { float fade; fade=0; myled.period(0.01f);//10ms while(1) { wait(0.02); // 20 ms myled.write(fade); fade=fade+0.01; if (fade>1) { fade=0; myled.write(fade); wait(1); } }
值得注意的是,PWMOut 是利用STM32 TIM 時鐘來實現的,所以並不是所有的GPIO都支援PWM 輸出。modular-2 上的使用者LED指示燈選擇了具有TIM 時鐘輸出的能力(PC6,PC7)。
例2: RGB 燈條漸變
LED RGB 燈條是24V 共陽極RGB 彩色LED 燈條,我們使用modular-2 的數字IO板來控制該燈條實現漸變。
modular-2 使用雙極性電晶體數字輸出IO模組,控制彩色LED 燈條。
程式碼
#include "mbed.h"
PwmOut red(PB_1);
PwmOut green(PE_8);
PwmOut blue(PE_14);
DigitalOut LED(PC_6);
int main() {
float Value;
int mode=0;
red.period_ms(1);
green.period_ms(1);
blue.period_ms(1);
Value=100;
blue.write(1);
green.write(1);
red.write(0);
while(1) {
LED=!LED;
wait(0.01);
switch (mode)
{
case 0:
{
red.write(Value/100);//Down
green.write((100-Value)/100);//Up
break;
}
case 1:
{
green.write(Value/100);//Down
blue.write((100-Value)/100);//Up
break;
}
case 2: {
blue.write(Value/100);//down
red.write((100-Value)/100);//up
break;
}
}
Value=Value-0.4;
if (Value<0) {
Value=100;
mode++;
if (mode>2) mode=0;
wait(1);
}
}
}