esp32使用micropython的pwm控制舵机和电调的方法

一、pwm的控制舵机电调原理

pwm原理

micropython需要先设置pwm的频率,就是1秒内有多少个高电平脉冲周期(PWM.freq(*hz)),然后再输出每个周期内高电平占的百分比(占空比),来实现控制

电调的频率和占空比

目前航模所用的电调控制开关的方式为1ms高电平脉冲为关闭,2ms高电平脉冲为开启,频率为50hz

所以控制方式为

from machine import Pin,PWM

# 电调输出引脚
pwm12 = PWM(Pin(12,Pin.OUT))
# 设置pwm频率
pwm12.freq(50)

#转速为50%
rpm = 0.5 

# 设置占空比 (1ms(油门关到开的高电平脉冲宽度) * rpm + 1ms油门起始高电平脉冲宽度) / 20ms周期(50hz频率每个周期为20ms) 
# micropython占空比范围为 0-1023 按比例输出要乘以1023
ts = int((1 * rpm + 1 ) / 20 * 1023)

#输出占空比
pwm12.duty(ts)

这样可输出50%的油门

舵机

舵机的高电平周期对应的角度:

0.5ms--------------0度;

1.0ms------------45度;

1.5ms------------90度;

2.0ms-----------135度;

2.5ms-----------180度;

代码为:

from machine import Pin,PWM

# 舵机输出引脚
pwm5 = PWM(Pin(5,Pin.OUT))
# 设置pwm频率
pwm5.freq(50)

# 如果要偏转60°
c = 60

'''
那么公式为
c / 180(最大角度) * 2(0°-180°高电平脉冲宽度) + 0.5(舵机角度0°时高电平脉冲宽度)/ 20ms(脉冲周期) * 1023
'''
ts = int((c / 180 * 2 + 0.5) / 20 * 1023)

# 输出占空比
pwm5.duty(ts)

这样可以使舵机旋转到60°位置

二、pwm的转发

这个一般用在增程上,比如443十公里增程,先从接收机捕获pwm信号,再通过433模块转发,飞机上另一个433模块负责接收,单片机再从433接收信号输出pwm

或者直接从遥控获取ppm信号(包含多个通道pwm信号的帧),再通过433通讯

因为也是兴趣,平时没什么时间测试,我这只贴出捕获信号再用其它引脚输出的过程,经过测试没有问题

from machine import Pin,PWM
import time
def irqtime(pin):
    # 记录高电平开始时间
    start = time.ticks_us()
    # 等待电平下降
    while pin.value() == 1:
        pass
    # 记录高电平时间
    times = time.ticks_diff(time.ticks_us(), start)
    # 将微秒转换成毫秒,保留小数点一位
    ts = round(times/1000,1)
    # 计算出当前的高电平占空比 ts / 20ms周期(50hz频率每个周期为20ms) micropython占空比范围为 0-1023 按比例输出
    pwms = int(ts / 20 * 1023)
    
    # 舵机和电调的输出 
    if pin == p25:
        # 电调,1ms为off,2ms为on
        pwm12.duty(pwms)
    elif pin == p26:
        #舵机,1ms为0°,2ms为180°
        pwm5.duty(pwms)
    # 打印
    print(pin,ts,pwms)

# 电调输出引脚
pwm12 = PWM(Pin(12,Pin.OUT))
# 设置pwm频率
pwm12.freq(50)
# 舵机输出引脚
pwm5 = PWM(Pin(5,Pin.OUT))
# 设置pwm频率
pwm5.freq(50)

# 通道1信号采集
p27 = Pin(27,Pin.IN)
p27.init(p27.IN, p27.PULL_DOWN)
p27.irq(handler=irqtime, trigger=Pin.IRQ_RISING)

# 通道2信号采集
p26 = Pin(26,Pin.IN)
p26.init(p26.IN, p26.PULL_DOWN)
p26.irq(handler=irqtime, trigger=Pin.IRQ_RISING)

# 通道3信号采集
p25 = Pin(25,Pin.IN)
p25.init(p25.IN, p25.PULL_DOWN)
p25.irq(handler=irqtime, trigger=Pin.IRQ_RISING)

# 通道4信号采集
p14 = Pin(14,Pin.IN)
p14.init(p14.IN, p14.PULL_DOWN)
p14.irq(handler=irqtime, trigger=Pin.IRQ_RISING)

ppm信号同理,可以自己去找资料

单片机和433模块用URAT通讯,都有相关的文档,有时间我会再写一篇

  • 11
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值