STM32 F1PWMLED调光·

PWM实现LED调光

Hugh

Hugh

4851 0

背景

众所周知,在我们的日常生活中有许许多多的场景需要用到LED亮度调节,比较常见的场景包括(不仅限于)手机屏幕亮度调剂、电视亮度、汽车仪表盘亮度、家用电器等。这一讲我们介绍如何利用单片机实现LED调光。

原理

介绍调光之前,简单回顾一下点亮LED的工作原理,如下图左侧所示。在电源与地之间串联电阻R和LED,我们这里以3.3V电源进行讲解,根据高中物理欧姆定律可知,调节电阻R的大小,便可调节流过LED电流的大小,又因为LED是电流驱动器件,发光亮度与电流成正比关系。因此,调节电阻便可实现LED发光亮度的调节了。但,这种调节方法在许多场景中是不太适应的,例如手机背景亮度的调节。原因是,电阻R是安装在电路板上,每次调节亮度需要重新焊接一个电阻,为了一个调节背景亮度还需要手机开盖换电阻,显然是不太合实际的。因此,我们希望可以通过软件直接调节亮度。

另一种调节LED亮度的方法称之为PWM调光。如下图右侧所示,直接将LED连接至单片机的I/O口,单片机I/O的状态只有两种要么是0V、要么是3.3V。当I/O输出0V时,LED点亮,当I/O输出3.3V时,LED两端无电压差,并无电流流过,因此不亮。而单片机输出的到底是0V还是3.3V,在软件中可以设计的,因此,可以实现软件调节LED了。

  • 如下图①所示,当单片机I/O口输出一直为3.3V时,LED处于常灭状态。
  • 当单片机I/O口输出为0V时,LED点亮,如下图② 所示。
  • 当单片机I/O口先输出1s的0V、再输出1s的3.3V,如此循环往复的周期信号时,如图③所示。此时我们将观察到的现象为LED先点亮1s,然后熄灭1s,接着又点亮1s,再灭1s,看到的是一种LED闪烁的状态。上面单片机I/O口输出的实际上是一个,周期为2s,0V和3.3V持续时间各占50%,既0V占空比为50%的周期信号。
  • 试想一下,假设我们保持占空比50%不变,而将周期2s缩小至1ms,相当于0.5ms的0V,0.5ms的3.3V的周期信号,如图④所示。此时,LED实际上也是闪烁的,只不过闪烁的太快了,人眼无法分辨。由于人眼的视觉暂存效应,看到的LED一直是点亮的,只不过亮度没有图①那么亮,大概在一半作用。
  • 我们回过头来看一下,当0V的占空比为0%的时候,不就是图①的常灭状态,当0V的占比为100%,就是图②的常亮情况。那我们是不是通过调节输出的0V的占空比,让其在0%~100%之间变化,就可以调节LED的亮度了?没错,这就是PWM调光原理,即脉冲宽度调制技术(Pulse Width Modulation),即通过调节每个周期内点亮LED的时间长度,来实现LED亮度的调节。
  • 通过调节占空比可以实现LED亮度的调节,那么PWM调光有什么缺点呢?屏幕是否闪烁和周期,也常说频率是有关系的。当周期为上面的2s时,频率为周期的倒数,即0.5Hz时,人眼很轻易分辨闪烁的效果。当周期为1ms,即频率为1KHz时,人眼就无法分辨是否闪烁了。人眼可分辨的周期大约为25ms,既40Hz,一般认为只要频率大于60Hz,对与人眼来说其实是一样的,都看不出闪烁效果。所以,对于手机屏幕来讲,大于60Hz就可以了。如果你的手机是PWM调光的,使用高清的摄像机去拍摄屏幕,可以看清闪烁条纹。
  • 单片机的I/O口如何实现PWM信号输出呢?请参见“STM32F103C8T6 TIM4 同时配置4路PWM输出”

呼吸灯的实现

根据上面的介绍,参考“STM32F103C8T6 TIM4 同时配置4路PWM输出” 。通过设置占空比就可以让LED显示某一个亮度了。这一节我们要在上述基础之上实现呼吸灯的效果,既0-2sLED灯由不亮逐渐变到最亮,2s-4s 由最亮逐渐变到不亮,如此循环往复。 原理简单,在0-4s的时间内平均分成40等份,1,2,3,....20等份的占空比分别设置为5%,10%,15%,....100%,即逐渐递增,后21,22,23,....40等份的占空比分别设置为100%,95%,90%,....5%,即逐渐递减。因此只需要在主程序中启动一个定时器即可,在相应的定时器中断函数中设置PWM的占空比即可。工程代码如下: LED呼吸.mp4

所属系列

从当前文章继续阅读它所在合集中的前后内容。

STM32单片机 第 5 / 9 篇
查看合集

本专栏嵌入式C语言开发为基础,旨在深入解析32位单片机技术开发,掌握STM32单片机工作原理、开发流程,熟悉ARM Cortex-M3处理器架构。 订阅了本专栏您将可以收获的技能: 1.系统学习STM32单片机开发 2.掌握嵌入式C语言开发流程 3.ARM Cortex-M3处理器工作原理 4了解Thumb-2指令集 适宜人群: 1.所有想了解单片机开发的人 2.一线程序员、嵌入式产品设计师 3.片上系统(SOC)工程师 4.嵌入式系统发烧友、学院研究人员等 作为订阅福利,我们建立了微信技术交流群,大家在这里可以认识更多做朋友。需要的朋友加微信:「RYMCU交流1群」。欢迎关注微信公众号「rymcucom」,订阅最新内容。

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人