2021-04-13

Micropython——基于Openmv的霍尔编码器电机测速与使用

因为在Micropython的Timer库中有专门的编码器读取模式,该模式是在CH1和CH2改变时改变,所以技术方式为4倍频。

Timer.ENC_AB — 配置编码器模式下的定时器。定时器只在CH1和CH2改变时改变。

``本电机对应的脉冲计速方法
减速比为30:1,线数为390,即在一倍频、单相的情况下,每圈会有390个脉冲;在四倍频、AB相的情况下,每圈会有1560个脉冲。

编码器电机接线

电机-------------------------PYB
编码器A相-----------------P7(TIM4,CH1)
编码器B相---------------- P8(TIM4,CH2)
编码器5V------------------ V+(Vin)
编码器GND----------------GND
电机12V---------------------12V电源
电机GND--------------------电源GND

encoder.py

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=30000)
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 = (30000 - self.tim_A.counter())

        if self.encoder_A == 30000:
            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


car.py

from pyb import Pin, Timer
inverse_left=False  #change it to True to inverse left wheel
inverse_right=False #change it to True to inverse right wheel

ain1 =  Pin('P0', Pin.OUT_PP)
ain2 =  Pin('P1', Pin.OUT_PP)
bin1 =  Pin('P2', Pin.OUT_PP)
bin2 =  Pin('P3', Pin.OUT_PP)
ain1.low()
ain2.low()
bin1.low()
bin2.low()

pwma = Pin('P7')
pwmb = Pin('P8')
tim = Timer(4, freq=1000)
ch1 = tim.channel(1, Timer.PWM, pin=pwma)
ch2 = tim.channel(2, Timer.PWM, pin=pwmb)
ch1.pulse_width_percent(0)
ch2.pulse_width_percent(0)

def run(left_speed, right_speed):
    if inverse_left==True:
        left_speed=(-left_speed)
    if inverse_right==True:
        right_speed=(-right_speed)

    if left_speed < 0:
        ain1.low()
        ain2.high()
    else:
        ain1.high()
        ain2.low()
    ch1.pulse_width_percent(int(abs(left_speed)))

    if right_speed < 0:
        bin1.low()
        bin2.high()
    else:
        bin1.high()
        bin2.low()
    ch2.pulse_width_percent(int(abs(right_speed)))

调用方法

main.py

import encoder
import car

if __name__ == '__main__':
    # 编码器初始化

    enc = encoder.Encoder(5, encoder.tim_A)

while True:
    car.run (50,50)
    print("enc.encoder_A:",enc.encoder_A)
    speed_A = enc.get_speed_A() # 获取当前速度值

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值