本篇章以单通道PWM输出模式演示了PWM波形动态变化用法,源代码实现了简易的呼吸灯演示。
注意:代码中并没考虑Led灯亮度和PWM脉宽的非线性关系,如果需要做出呼吸更均匀的呼吸灯,请参考《基于CIE1931公式实现PWM对LED亮度的线性控制》,在这里就不详细讨论了。
Ubeeto开发板提供的PWM提供两种工作模式:
(1)单通道输出模式,输出口固定在开发板的D0口上,对应的库函数是:
LIB_PwmConfig1: 初始化1个通道的PWM
LIB_PwmUpdate1: 更新PWM波形的占空比
LIB_PwmSetPrd1:更新PWM波形的周期以及占空比
(2)三通道同时输出模式,输出口固定在开发板的D0,D1,D2上,对应的库函数是:
LIB_PwmConfig3: 初始化3个通道的PWM
LIB_PwmUpdate3: 更新PWM波形的占空比
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查询。
LIB_PwmSetPrdx(x=1或3)库函数支持实时调整PWM波形的周期和占空比,但是使用该函数时必须先初始化过PWM,即调用过LIB_PwmConfigx函数。另外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
简单、快捷、高效、强大的物联网开发板
© 2022. All Rights Reserved. 粤ICP备2021058065号