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

猜你喜欢

转载自blog.csdn.net/yaojiawan/article/details/82937537