ESP32(MicroPython) 编码器电机闭环控制

本人最近查找资料时,发现ESP32上的使用MicroPython的编码器电机相关程序较少,闭环控制程序都是Pyboard上的,与ESP32不完全兼容。本人通过micropython编程 esp32+drv8833+霍尔编码器_micropython 编码器_青右的博客-CSDN博客

上的程序读取编码器计数,然后另写了控制程序,有两个版本。程序把目标速度与实际速度的差乘以预设的倍数载加到PWM占空比上,相当于PID控制中的P,后续视实际需要做其它功能。

这个程序每隔一段时间取随机目标转速,并且可以从串口输出相关数据,主要用于调参。

from machine import *
import time
from moto import *
import random

# 编码器初始化
pin27 = Pin(27, Pin.IN)
pin14 = Pin(14, Pin.IN)   
encoder = encoder(pin27, pin14, 0)   # 参数(编码器A相引脚,编码器B相引脚,定时器序号)

# 电机初始化
motor=PWM(Pin(15),freq=1000,duty=0)
duty=0
target=50
count=0
  
while True:
    count+=1
    speed = encoder.read()
    offset=target-speed
    adjustment=offset*2
    duty+=offset
    if duty<0:
        duty=0
    elif duty>1023:
        duty=1023
    motor.duty(duty)
    print(target,speed,offset,duty)
    time.sleep(0.05)
    if count==100:
        count=0
        target=random.randint(0,70)

这个程序用于通过串口输入目标速度并调速

from machine import *
import time
from moto import *
import random
import _thread

# 编码器初始化
pin27 = Pin(27, Pin.IN)
pin14 = Pin(14, Pin.IN)   
encoder = encoder(pin27, pin14, 0)   # 参数(编码器A相引脚,编码器B相引脚,定时器序号)

# 电机初始化
motor=PWM(Pin(15),freq=1000,duty=0)
duty=0
target=50
i=0

def set_target(duty,i):
    global target
    while True:
        target=int(input("input target"))
_thread.start_new_thread(set_target, (duty, i))

while True:
    speed = encoder.read()
    offset=target-speed
    adjustment=offset*2
    duty+=offset
    if duty<0:
        duty=0
    elif duty>1023:
        duty=1023
    motor.duty(duty)
    time.sleep(0.05)

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路易斯720

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值