合宙Air101产生PWM驱动舵机

打开soc接口文档,查看与PWM功能的相关函数
合宙Air101产生PWM驱动舵机_第1张图片
函数:pwm.open(channel, period, pulse, pnum, precision)
选择PWM通道channel,此板有5路PWM,选择PWM0,参数:0
合宙Air101产生PWM驱动舵机_第2张图片
选择频率(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/20ms
100%=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)

合宙Air101产生PWM驱动舵机_第3张图片
设置占空比为12.5%

pwm.open(0, 50, 12.5,0,100)

合宙Air101产生PWM驱动舵机_第4张图片

收获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

你可能感兴趣的:(lua,开发语言)