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