本人最近查找资料时,发现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)