1. 程式人生 > >Mbed OS 輸出 PWM訊號

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);
            }
    }
}