import pyb
from pyb import Timer, Pin
import cmath
#配置编码器AB相读取模式,利用定时器中断进行读取
p1_A = Pin("P7"); p2_A = Pin("P8");
tim_A = pyb.Timer(4)
tim_A.init(prescaler=0,period=10000)
ch1_A = tim_A.channel(1,pyb.Timer.ENC_AB,pin=p1_A);
ch2_A = tim_A.channel(2,pyb.Timer.ENC_AB,pin=p2_A);
class Encoder:
def __init__(self, encoder_freq, tim_A):
'''
入口参数:编码器读取频率
修改:
1.需要自行定义编码器引脚及其相关定时器配置
2.需要自行定义编码器精度
#速度值=(采集到的脉冲数/编码器分辨率)*轮子周长*控制频率
'''
# 初始化常量
self.pi = cmath.pi # pi的值
self.encoder_precision = 4*13*30 # 编码器精度 = 倍频数*编码器精度(电机驱动线数)*电机减速比
# self.control_time = 1/encoder_freq # 单位为 s
self.encoder_freq = encoder_freq
self.tim_A = tim_A
self.encoder_A = 0
# 定时器中断:固定时间读取编码器数值
timer_read = Timer(3,freq=self.encoder_freq,callback=self.encoder_cb)
def encoder_cb(self, encoder):
'''
函数功能:通过定时器中断读取编码器A、B计数值,并重置编码器
'''
# self.encoder_A = self.tim_A.counter()
self.encoder_A = (10000 - self.tim_A.counter())
if self.encoder_A == 10000:
self.encoder_A = 0
# print("encoder_A:", self.encoder_A)
self.tim_A.counter(0)
def get_speed_A(self):
'''
函数功能:读取编码器A计数值,将编码器A计数值转化为速度值,同时将编码器值置零
入口参数:编码器对应定时器
返回值 :编码器值
#速度值=(采集到的脉冲数/编码器分辨率)*轮子周长*控制频率
'''
print("encoder_A:", self.encoder_A)
speed = (self.encoder_A / (self.encoder_precision )) * (2*self.pi*0.03) * self.encoder_freq
print("-------------speed_A:", speed)
return speed
import encoder
import car
if __name__ == '__main__':
# 编码器初始化
enc = encoder.Encoder(5, encoder.tim_A)
speed_A = enc.get_speed_A() # 获取当前速度值
while True:
car.run (50,50)
print("enc.encoder_A:",enc.encoder_A)
print("speed_A",'%.5f'%speed_A)
M
ml4p
@ml4p
0
声望
3
楼层
383
资料浏览
0
粉丝
0
关注
ml4p 发布的帖子
-
编码器测速,为什么有脉冲有输出,速度没有?