一、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通讯,都有相关的文档,有时间我会再写一篇