PWM

PWM

本文章参考 FlexLua 官网 ,基于 FlexLua 脱离复杂单片机C开发正逐渐成为一种快速高效的 IoT 硬件开发方式。让小白即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。

一、实现功能

一、实现功能

本篇章以单通道PWM输出模式演示了PWM波形动态变化用法,源代码实现了简易的呼吸灯演示。

注意:代码中并没考虑Led灯亮度和PWM脉宽的非线性关系,如果需要做出呼吸更均匀的呼吸灯,请参考 SBK006C2 《CIE1931 PWM LED亮度线性控制》文章,在这里就不详细讨论了。

二、PWM功能简介

二、PWM功能简介

Core提供的PWM提供两种工作模式:

(1)单通道输出模式,输出口固定在Core的D0口上,对应的库函数是:

  1. LIB_PwmConfig1: 初始化1个通道的PWM
  2. LIB_PwmUpdate1: 更新PWM波形的占空比
  3. LIB_PwmSetPrd1:更新PWM波形的周期以及占空

(2)三通道同时输出模式,输出口固定在Core的D0,D1,D2上,对应的库函数是:

  1. LIB_PwmConfig3: 初始化3个通道的PWM
  2. LIB_PwmUpdate3: 更新PWM波形的占空比
  3. LIB_PwmSetPrd3:更新PWM波形的周期以及占空比
三、接线图

三、接线图

打开网易新闻 查看精彩图片

四、完整代码

四、完整代码

--配置D0口为PWM功能,参数10000表示PWM的周期为10000us,参数0表示低电平有效
LIB_PwmConfig1(10000,0)
--更新D0口的PWM输出占空比为0
LIB_PwmUpdate1(0)
cnt = 0
while(GC(1) == true)
do
LIB_DelayMs(10)
cnt = cnt + 50
--每10毫秒更新一次PWM占空值
LIB_PwmUpdate1(cnt)
if cnt >= 10000 then
cnt = 0
end
end

如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

五、动态更新PWM周期

五、动态更新PWM周期

LIBPwmSetPrdx(x=1或3)库函数支持实时调整PWM波形的周期和占空比,但是使用该函数时必须先初始化过PWM,即调用过LIBPwmConfigx函数。另外LIB_PwmSetPrdx函数调用后,PWM的周期不会马上发生变化,而是等到该周期的PWM波形完成后才会生效,并且在生效的时刻会有大概13us秒的时间PWM处于关闭状态,这个需要在设计时有所考虑,实测失效波形图如下:

打开网易新闻 查看精彩图片

下面是一个示例代码:

--配置D0口为PWM功能,参数10000表示PWM的周期为10000us,参数0表示低电平有效
LIB_PwmConfig1(10000,0)
--更新D0口的PWM输出占空比为0
LIB_PwmUpdate1(0)
while(GC(1) == true)
do
if something happen then
--更新PWM波形的周期为500us(2Khz),占空比为50%
LIB_PwmSetPrd1(500,250)
end
end