STM GPIO不一样的玩法--会呼吸的灯

STM GPIO不一样的玩法--会呼吸的灯

                

  -                                                    2014酷玩创意电子

 

     GPIO学电的人都知道,这个东西确实比较初级,玩过嵌入式的兄弟一定会鄙视我还把这么简单的东西拿来讲。那我就先讲讲在GPIO在我们手机里的高端用法吧。

        手机、pad是嵌入式的高端产品,它的运作依赖于强大的CPU和稳定的操作系统;CPU负责算数运,系统则实现任务的管理、调度以及系统资源的管理,用户的所有操作比如拍照、看电影、听音乐等都依赖于系统硬件及驱动。同样的我们今天主角GPIO也是手机的必备外设之一,我们手机的背光控制和sensor灯、充电指示等都是GPIO模块的功劳!

        Android系统采用设备模型来管理系统中的设备,就是最简单的LED也不例外。在kernel/leds中就专门实现了leds-class这样的类在管理系统的led devices,每个led硬件和驱动都需要通过platform device和platform driver注册系统……

        系统提供如此复杂的接口来驱动devices是有理由的。因为消费电子的运行环境非常复杂,需要系统能够更智能管理设备:动态加载、移除以及最关键的做好电源管理。是不是说得有点飘了呢,下面回到今天的主题--呼吸灯

        呼吸灯在电脑,手机上都有,一亮一灭的变换就像机器也在打呼噜一样甚是好玩,时间和光线的相逢绽放出CPU的智慧魅力。我们今天就来借助android实现用几块钱的MCU来做一个这么高端好玩的东东来玩玩。有图有真相,小生先上个图吧:


会呼吸的“灯”

        在高端控制器中我们可以通过设置GPIO的电流值非常容易的实现灯光亮暗的控制,但在低端MCU中去做这件事却不是一件容易的事。MCU要实现对对电流的控制一般通过PWM方法实现:包括使用器件PWM外设驱动和GPIO模拟PWM控制。这两种方法区别在于PWM的实现,但对灯光的呼吸效果设计算法还是一致的。如下我们来说说这个“呼吸”的实现吧。

        如下图,我们把一次呼吸的过程分为delay_on、 呼、吸、delay_off四个阶段,要做的好的灯光效果很明显是要对呼吸的过程中的灯光亮度做好控制,即通过时间变化来改变LED驱动的PWM占空比。



        上面那一条红色线条实现最简单,但效果很不好;较好的效果是灯光由慢长暗到短高亮再由短高亮到慢长暗如图中下面的红色曲线,在软件上要做到这一点我们采用了如下实现:


呼吸灯控制

     1我们设定PWM的周期是1ms 呼吸过程的亮度分100级;

     2控制亮暗变化的快慢采用改变输出该亮度的PWM个数来实现,暗时间最长,随亮度的增加亮度的时间逐级递减 。一个亮度周期为1ms,根据传入的呼吸时间和等差数列知识求出每个亮度的PWM数量(高中的知识都搞忘完了,为了做这个小东东小哥还专门复习一下, 囧!)

        根据以上思路在编译调试后就有了上面那段代码:PulseLight是输出一个1ms周期的脉冲波,呼吸效果在SleepLight函数里面实现,代码同样分对称四段,其中ao,do是PWM脉冲个数控制变量(首项和等差)wide是亮度控制变量。

    除了亮度时间和PWM控制外,代码的关键还是使用了Delay_us和Delay_ms的精确延时,这在MCU实现里面实现相对比价困难,这里涉及到系统时间戳的设计了,我会在下一模块给大家分享。同样先附上福利代码:


基于MCU的时间戳


完整代码工程可通过http://shop108911095.taobao.com/?spm=2013.1.0.0.Z8tf8S取得

 

更多趣味算法、应用更新中。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值