本教程来至 FlexLua 官网 ShineBlink 开发板教程,即使不懂单片机开发也可很容易用FlexLua零门槛开发各种 IoT 硬件。
注意:本教程仅适用于C2,C1目前暂不支持。
一、前言
当我们需要实现驱动更多的电机、舵机等需要更多路PWM信号的情形时,我们可以考虑利用Core芯片自带的8路PWM扩展输出功能,以下介绍了该功能的特性:
- D0~D7端口可同时输出8路PWM信号,TTL电平
- 8路PWM信号的频率(周期)一致,范围为: 30Hz ~ 10000Hz(100us - 32367us)
- 可随时改变8路PWM信号的频率,并且可以随时改变任意一路PWM信号的占空比
涉及的库函数如下:
--配置8路PWM信号基本信息的初始化函数
LIB_PwmConfig8()
--配置8路PWM信号的有效电平时长(占空比),该函数可在PWM输出过程中随时调用
LIB_PwmUpdate8()
--配置8路pwm信号的周期(频率),以及有效电平时长(占空比),该函数可在PWM输出过程中随时调用
LIB_PwmSetPrd8()
注意:一但使用了该PWM扩展功能,D0-D7这8个引脚就无法作为GPIO来使用了。
二、接线图
三、示例代码:动态改变8路PWM信号的占空比
以下代码实现了:D0~D7 8路同时输出频率为100Hz的PWM信号,当开发板上BTN1按键按下时,设置D0-D7的占空比分别为:10%,20%,30%,40%,50%,60%,70%,80%;当开发板上的BTN2按键按下时,设置D0-D7的占空比分别为:80%,70%,60%,50%,40%,30%,20%,10%。
--设置按键"BTN1"(占用D10口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN1","D10","L")
--设置按键"BTN1"(占用D11口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN2","D11","L")
--配置D0~D7这8个IO口为PWM功能,周期10000us(100Hz),高电平为有效极性
LIB_PwmConfig8(10000,1)
LIB_PwmUpdate8(0,0,0,0,0,0,0,0)
--开始大循环
while(GC(1) == true)
do
--轮询按键1事件
key_value = LIB_ButtonQuery("BTN1")
--如果按键1短按过
if key_value == 1 then
--设置D0-D7的占空比分别为:10%,20%,30%,40%,50%,60%,70%,80%
LIB_PwmUpdate8(1000,2000,3000,4000,5000,6000,7000,8000)
end
--轮询按键2事件
key_value = LIB_ButtonQuery("BTN2")
--如果按键2短按过
if key_value == 1 then
--设置D0-D7的占空比分别为:80%,70%,60%,50%,40%,30%,20%,10%
LIB_PwmUpdate8(8000,7000,6000,5000,4000,3000,2000,1000)
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。
实现现象:
当BTN1按下后,可通过示波器看到D0-D7这8个引脚输出的信号如下图:
当BTN2按下后,可通过示波器看到D0-D7这8个引脚输出的信号如下图:
四、示例代码:动态改变8路PWM信号的周期、以及占空比
以下代码实现了:当开发板上BTN1按键按下时,设置D0-D7的PWM周期为500us(2KHz),占空比分别为:10%,20%,30%,40%,50%,60%,70%,80%;当开发板上的BTN2按键按下时,设置D0-D7的PWM周期为1000us(1KHz),占空比分别为:5%,10%,15%,20%,25%,30%,35%,40% 。
LIB_ButtonConfig("BTN1","D10","L")
--设置按键"BTN1"(占用D11口)以低电平有效的方式检测按键动作
LIB_ButtonConfig("BTN2","D11","L")
--配置D0~D7这8个IO口为PWM功能,周期10000us(100Hz),高电平为有效极性
LIB_PwmConfig8(10000,1)
LIB_PwmUpdate8(0,0,0,0,0,0,0,0)
--开始大循环
while(GC(1) == true)
do
--轮询按键1事件
key_value = LIB_ButtonQuery("BTN1")
--如果按键1短按过
if key_value == 1 then
--更新8路PWM波形的周期为500us(2Khz),
--D0~D7的占空比分别为10% 20% 30% 40% 50% 60% 70% 80%
LIB_PwmSetPrd8(500,50,100,150,200,250,300,350,400)
end
--轮询按键2事件
key_value = LIB_ButtonQuery("BTN2")
--如果按键2短按过
if key_value == 1 then
--更新8路PWM波形的周期为1000us(1Khz),
--D0~D7的占空比分别为5% 10% 15% 20% 25% 30% 35% 40%
LIB_PwmSetPrd8(1000,50,100,150,200,250,300,350,400)
end
end
实现现象:
当BTN1按下后,可通过示波器看到D0-D7这8个引脚输出的信号如下图:
当BTN2按下后,可通过示波器看到D0-D7这8个引脚输出的信号如下图: