星瞳实验室APP,快速收到回复
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 编码器测速,为什么有脉冲有输出,速度没有?



    • 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)