打开soc接口文档,查看与PWM功能的相关函数
函数:pwm.open(channel, period, pulse, pnum, precision)
选择PWM通道channel,此板有5路PWM,选择PWM0,参数:0
选择频率(period周期),50HZ。参数:50
设置占空比,2ms的脉宽占周期20ms的十分之一,也就是10%,填写化成%号的数值,如参数:10,代表180°
选择持续输出还是输出一个周期就停止,选择持续输出,参数:0
分频精度precision默认为100,不填也许
最终:
pwm.open(0, 50, 占空比,0,100)
产生频率50HZ,即周期为20ms的PWM,驱动舵机
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = 'helloworld'
VERSION = '1.0.0'
-- 引入必要的库文件(lua编写), 内部库不需要require
local sys = require 'sys'
-- 用户代码开始---------------------------------------------
local num=0
sys.taskInit(function()
while 1 do
-- 仿呼吸灯效果
log.info("pwm", ">>>>>")
for i = 100,0,-5 do--从100开始,到0为止,每次减少5,0时也循环了一次,因此循环21次
print("i=",i)
pwm.open(0, 50, 2.5+(100-i)*0.1,0,100) -- 频率50hz, 占空比0-100,0°对应0.5ms,占空比是2.5%,180°对应2.5ms,占空比是12.5%,跨2ms,也就是10%
num=num+1
print("计数",num)
sys.wait(1000)
end
sys.wait(1000)
for i = 100,0,-5 do
pwm.open(0, 50, 2.5+i*0.1,0,100)
sys.wait(1000)
end
gpio.setup(pin.PB00,0)
sys.wait(1000)
-- for i=5,0,-1 do--实际做了6次循环,等于0时也做了一次
-- num=num+1
-- print("计数1",num)
-- end
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
```c
2022-04-30 21:40:15.5506 I/user.pwm >>>>>
2022-04-30 21:40:15.5526 i= 100
2022-04-30 21:40:15.5526 计数 1
2022-04-30 21:40:16.5565 i= 95
2022-04-30 21:40:16.5575 计数 2
2022-04-30 21:40:17.5592 i= 90
2022-04-30 21:40:17.5602 计数 3
2022-04-30 21:40:18.5625 i= 85
2022-04-30 21:40:18.5625 计数 4
2022-04-30 21:40:19.5659 i= 80
2022-04-30 21:40:19.5669 计数 5
2022-04-30 21:40:20.5681 i= 75
2022-04-30 21:40:20.5691 计数 6
2022-04-30 21:40:21.5723 i= 70
2022-04-30 21:40:21.5723 计数 7
2022-04-30 21:40:22.5746 i= 65
2022-04-30 21:40:22.5746 计数 8
2022-04-30 21:40:23.5774 i= 60
2022-04-30 21:40:23.5784 计数 9
2022-04-30 21:40:24.5807 i= 55
2022-04-30 21:40:24.5817 计数 10
2022-04-30 21:40:25.5838 i= 50
2022-04-30 21:40:25.5838 计数 11
2022-04-30 21:40:26.5866 i= 45
2022-04-30 21:40:26.5876 计数 12
2022-04-30 21:40:27.5897 i= 40
2022-04-30 21:40:27.5897 计数 13
2022-04-30 21:40:28.5926 i= 35
2022-04-30 21:40:28.5926 计数 14
2022-04-30 21:40:29.5962 i= 30
2022-04-30 21:40:29.5962 计数 15
2022-04-30 21:40:30.5988 i= 25
2022-04-30 21:40:30.5998 计数 16
2022-04-30 21:40:31.6027 i= 20
2022-04-30 21:40:31.6027 计数 17
2022-04-30 21:40:32.6051 i= 15
2022-04-30 21:40:32.6061 计数 18
2022-04-30 21:40:33.6083 i= 10
2022-04-30 21:40:33.6083 计数 19
2022-04-30 21:40:34.6108 i= 5
2022-04-30 21:40:34.6119 计数 20
2022-04-30 21:40:35.6147 i= 0
2022-04-30 21:40:35.6147 计数 21
安装舵机与PWM频率的关系:
0° ——0.5ms——0.5ms+0ms
45° ——1ms———0.5ms+0.5ms
90° ——1.5ms——0.5ms+1ms
135°——2ms——0.5ms+1.5ms
180°——2.5ms——0.5ms+2ms
即0-2ms的脉宽对应0°-180°
成比例关系,0.5ms/20ms 100%=2.5
当180°对应2.5ms,2.5ms/20ms100%=12.5%=2.5%+10%
因此占空比参数:2.5+i*0.1,i在0到100内
舵机不能精确到0-180°转动,是正常的,因为舵机本身的误差,单确保一下,使用示波器查看,发现占空比有点误差,不知道是咋回事,可能是这个函数的问题或者是我算错了,或者是正点原子示波器的误差,i=100时占空比对应的是12.1。i=0时对应的是2.35
设置占空比为2.5%
pwm.open(0, 50, 2.5,0,100)
pwm.open(0, 50, 12.5,0,100)
收获1:for的使用
for i=5,0,-1 do实际做了6次循环,等于0时也做了一次,类似c语言的for(int i=5;i>=0;i- -)
lua语法参考手册:for
for i=5,0,-1 do--实际做了6次循环,等于0时也做了一次,类似c语言的for(int i=5;i>=0;i--)
num=num+1
print("计数1",num)
end
结果:
2022-04-30 21:23:20.8955 计数1 1
2022-04-30 21:23:20.8965 计数1 2
2022-04-30 21:23:20.8965 计数1 3
2022-04-30 21:23:20.8965 计数1 4
2022-04-30 21:23:20.8975 计数1 5
2022-04-30 21:23:20.8975 计数1 6