今天搞一下PWM,即脉宽调制(PWM:(Pulse Width Modulation)输出。它是一种对模拟信号电平进行数字编码的方法,简单来说就是通过一个时钟周期内高低电平的不同占空比来表征模拟信号,如下面就是一个具体的编码样例(三角波是用来生成PWM编码的)。对于生成的PWM编码还可以用简单的电路进行还原,如下面的低通滤波电路就可以得到原来的模拟信号。
mbed的PWM类如下:
类名 | | | | | | | 设置PWM输出值,范围在0到1之间,0表示在一个时钟周期内全部都是低电平,1表示全部都是高电平 | | 读取PWM的当前输出值,需要注意的是,该值并不一定等于原先的色丁值 | void period(float seconds) | | | | | | void pulsewidth(float seconds) | 设定PWM输出的脉宽,相当于设定PWM的输出值,假设时钟周期是10ms,脉宽是5ms,那就相当于输出0.5,这里的单位是秒 | void pulsewidth_ms(int ms) | | void pulsewidth_us(int us) | | PwmOut& operator= (float value) | | PwmOut& operator= (PwmOut& rhs) | | | |
我本想不用LED0板子上的,但时在没有时间搭个电路,于是用板子上的LED0试一下:
mbed环境用的是LED1,其实就是一个,只不过有点差别:
程序如下:
#include "mbed.h"
PwmOut PWM1(LED1);
float pv=0;
int main()
{
PWM1.period_us(100);
PWM1=0;
while (1)
{
PWM1=pv;
pv=pv+0.01;
wait(0.05);
if (pv>1)
pv=0;
}
}
把程序下进,LED居然从亮到渐暗,也就是说成功了。
我想这PWM的应是用定时器控制的,否则怎么隨便一个接LED的管脚,尽然会发PWM波呢?
以下是下载成功的截图:
|