FlexLua单片机几行代码实现8路PWM输出控制电机舵机

96 篇文章 0 订阅
32 篇文章 0 订阅

PWM

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

一、实现功能

本篇章以单通道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波形的周期以及占空比

三、接线图

3c9e524e4e4ada4f0fb263aeb7f2c0b3.jpeg

四、完整代码

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

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

a32c654210f1c53a3e035aa58cd9cd4f.jpeg

下面是一个示例代码:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值