本人最近查找资料时,发现ESP32上的使用MicroPython的编码器电机相关程序较少,闭环控制程序都是Pyboard上的,与ESP32不完全兼容。本人通过micropython编程 esp32+drv8833+霍尔编码器_micropython 编码器_青右的博客-CSDN博客
上的程序读取编码器计数,然后另写了控制程序,有两个版本。程序把目标速度与实际速度的差乘以预设的倍数载加到PWM占空比上,相当于PID控制中的P,后续视实际需要做其它功能。
这个程序每隔一段时间取随机目标转速,并且可以从串口输出相关数据,主要用于调参。文章来源:https://www.toymoban.com/news/detail-566596.html
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)
这个程序用于通过串口输入目标速度并调速文章来源地址https://www.toymoban.com/news/detail-566596.html
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)
到了这里,关于ESP32(MicroPython) 编码器电机闭环控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!