IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> esp32使用micropython的pwm控制舵机和电调的方法 -> 正文阅读

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:52:42  更:2022-04-22 18:55:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:37:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码