这个其实就是利用PWM的占空比来控制LED的亮度,对于单片机来说是很普通的功能,但在mbed下会发现更加无法想象的简单。在没有看官方例子前,总觉得该配置点定时器什么的,然后再得到PWM。结果并非如此。因为已经定义了PwmOut这个类了!!官方例子是控制蜂鸣器演奏一首歌曲,那我们就改造成呼吸灯吧。不够在pwm的duty-cycle设置中有个小坑,跟大家分享一下。
编程环境,mbed,添加mbed库即可。在库中可以找到pwm类的说明,还是比较简单的。下图所示的方法用用就够了
另外write和read可以简单的用实例=和=实例来完成。废话少说,先来试试这个duty-cycle到底是数字大亮还是数字小亮。既然是百分比,那么肯定在0-1.0之间取值。我们给两盏LED都点上
- #include <mbed.h>
- PwmOut L_red(P0_20);
- PwmOut L_blue(P0_19);
- int main(void){
- L_red=0.1;
- L_blue=0.9;
- while(1){
- }
- }
复制代码实验结果:红灯很亮,蓝灯比较暗。但是因为IO口接的是LED灯的阴极,所以这个duty-cycle数字表示的是高电平的比例。然后就是咱们的呼吸灯了,定时改变占空比咯。蓝色比较优雅,就选它了。不过很奇怪 ,现象并不乐观,首先使用这段代码,预期是灯从最暗变到最亮,然后再回到最暗。
- #include <mbed.h>
- PwmOut L_blue(P0_19);
- int main(void){
- L_blue=1.0;
- while(1){
- wait(1);
- L_blue=L_blue-0.2;
- if (L_blue==0) {
- L_blue=1.0;
- }
- }
- }
复制代码结果实际情况是:从暗变到最亮,然后就停在最亮状态不变了!!开始以为是0值比较问题,可是把第三行变成L_blue<0也没戏。参考了下mbed的PWM例程。也是失败。
但是while(1)中,使用这段代码可以。
- wait(1);
- L_blue=1.0;
- wait(1);
- L_blue=0.8;
- wait(1);
- L_blue=0.6;
- wait(1);
- L_blue=0.4;
- wait(1);
- L_blue=0.2;
- wait(1);
- L_blue=0.0;
复制代码想了半天,最后使用了一个中间变量dc,严格保证给到L_blue的值一定在0和1之间。于是就成功了。最终完整代码如下:
- #include <mbed.h>
- PwmOut L_blue(P0_19);
- int main(void){
- float dc=0.0;
- L_blue=dc;
- L_blue.period_us(10);
- while(1){
- wait(1);
- dc=dc+0.2;
- if (dc>1.1) {
- dc=0.0;
- }
- L_blue=dc;
- }
- }
复制代码看来mbed也是有坑的啊,官方例程也靠不住。当然也许在底层实现中,有些mcu会自动检查duty-cycle的范围,有些就没有?如果误写入了不合理的数值,可能就引起单片机的奇怪状态了。库的源文件并不可见,所以也不追究了。