跳到主要内容

PWM

一、实现功能

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

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

二、PWM功能简介

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

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

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

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

  • LIB_PwmConfig3: 初始化3个通道的PWM
  • LIB_PwmUpdate3: 更新PWM波形的占空比
  • LIB_PwmSetPrd3:更新PWM波形的周期以及占空比

三、接线图

layout

四、完整代码

--配置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周期

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

pwm_pitch

下面是一个示例代码:

--配置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