微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 05 LinkNode玩呼吸灯

05 LinkNode玩呼吸灯

时间:10-02 整理:3721RD 点击:
这个其实就是利用PWM的占空比来控制LED的亮度,对于单片机来说是很普通的功能,但在mbed下会发现更加无法想象的简单。在没有看官方例子前,总觉得该配置点定时器什么的,然后再得到PWM。结果并非如此。因为已经定义了PwmOut这个类了!官方例子是控制蜂鸣器演奏一首歌曲,那我们就改造成呼吸灯吧。不够在pwm的duty-cycle设置中有个小坑,跟大家分享一下。

编程环境,mbed,添加mbed库即可。在库中可以找到pwm类的说明,还是比较简单的。下图所示的方法用用就够了



另外write和read可以简单的用实例=和=实例来完成。废话少说,先来试试这个duty-cycle到底是数字大亮还是数字小亮。既然是百分比,那么肯定在0-1.0之间取值。我们给两盏LED都点上

  1. #include <mbed.h>
  2. PwmOut L_red(P0_20);
  3. PwmOut L_blue(P0_19);
  4. int main(void){
  5. L_red=0.1;
  6. L_blue=0.9;
  7. while(1){
  8. }
  9. }

复制代码

实验结果:红灯很亮,蓝灯比较暗。但是因为IO口接的是LED灯的阴极,所以这个duty-cycle数字表示的是高电平的比例。然后就是咱们的呼吸灯了,定时改变占空比咯。蓝色比较优雅,就选它了。不过很奇怪 ,现象并不乐观,首先使用这段代码,预期是灯从最暗变到最亮,然后再回到最暗。

  1. #include <mbed.h>
  2. PwmOut L_blue(P0_19);
  3. int main(void){
  4. L_blue=1.0;
  5. while(1){
  6. wait(1);
  7. L_blue=L_blue-0.2;
  8. if (L_blue==0) {
  9. L_blue=1.0;
  10. }
  11. }
  12. }

复制代码

结果实际情况是:从暗变到最亮,然后就停在最亮状态不变了!开始以为是0值比较问题,可是把第三行变成L_blue<0也没戏。参考了下mbed的PWM例程。也是失败。



但是while(1)中,使用这段代码可以。

  1. wait(1);
  2. L_blue=1.0;
  3. wait(1);
  4. L_blue=0.8;
  5. wait(1);
  6. L_blue=0.6;
  7. wait(1);
  8. L_blue=0.4;
  9. wait(1);
  10. L_blue=0.2;
  11. wait(1);
  12. L_blue=0.0;

复制代码

想了半天,最后使用了一个中间变量dc,严格保证给到L_blue的值一定在0和1之间。于是就成功了。最终完整代码如下:

  1. #include <mbed.h>
  2. PwmOut L_blue(P0_19);
  3. int main(void){
  4. float dc=0.0;
  5. L_blue=dc;
  6. L_blue.period_us(10);
  7. while(1){
  8. wait(1);
  9. dc=dc+0.2;
  10. if (dc>1.1) {
  11. dc=0.0;
  12. }
  13. L_blue=dc;
  14. }
  15. }

复制代码

看来mbed也是有坑的啊,官方例程也靠不住。当然也许在底层实现中,有些mcu会自动检查duty-cycle的范围,有些就没有?如果误写入了不合理的数值,可能就引起单片机的奇怪状态了。库的源文件并不可见,所以也不追究了。

汇总帖在此:

【linknode评测】—— by johnrey
http://bbs.eeworld.com.cn/forum. ... &fromuid=536508

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top