07 编码器测速

07 编码器测速

  1. 1、认识编码器

    1. 编码器:一般按照电机尾部、用于测量电机转速、方向、位置
      在这里插入图片描述
  2. 2、那么编码器的输出信号具体是什么?我们如何根据输出信号测量转速和方向?

    1. 转速: 单位时间测量到的脉冲数量(比如根据每秒测量到多少个脉冲来计算转速)
    2. 旋转方向: 两通道信号的相对电平关系
    3. 就是看a上升延的时候b是高还是底来区分正转反转
      在这里插入图片描述

A上升沿,B低(顺),A上升沿,B高(逆)

  1. 2、单片机定时器的编码器功能
    1. 那么知道编码器输出的波形,我们如何通过单片机读取波形,然后计算出速度那?
    2. 这里STM32单片机的定时器和通用定时器具有编码器接口模式
    3. 在STM32中文参考手册13章中有详细介绍(-第200页)
    4. TIMx_CNT(计数器寄存器):记录单位时间脉冲数量、
    5. TIMx_CR1(寄存器):表示计数方向
      在这里插入图片描述

STM32中文参考手册-第267页

  1. STM32中文参考手册-第226页
    在这里插入图片描述

  2. 这个是计数方向与编码器信号的关系、我们拆开来看

  3. 仅在TI1计数、电机正转、对原始数据二倍频(上、下沿计数一次)
    在这里插入图片描述

  4. 补:TI1计数,看第一个上升沿,看到向上向下计数,此刻TI2电平为低电平,所以是向上计数

  5. 在TI1和TI2都计数

  6. 可以看到这样就对原始数据四倍频
    在这里插入图片描述

俩个每次边沿触发一次

  1. 计数方向(向上向下计数)
    在这里插入图片描述

  2. 3、获得单位时间计数器值变化量
    在这里插入图片描述

  3. short类型的取值范围通常是从-32,768到32,767(即-215到215-1)。

  4. 因此可以看数的正负判断方向

  5. 上一次说的方法:

    1. 这次编码器计数值 = 计数器值+计数溢出次数 * 计数最大器计数最大值
    2. 计数器两次变化值= 这次编码器计数值 - 上次编码器计数值
    3. 然后根据这个单位变化量计算速度
  6. 还有一种方法:

    1. 计数器变化量 = 当前计数器值 ( 每次计数值清空)
    2. 然后根据这个变化量 计算速度
    3. 然后我们再看具体到哪一款电机和编码器上如何测速
  7. 4、JGA25-370电机(减速比1:9.6)
    在这里插入图片描述

  8. 即外面转1圈,里面转9.6圈

  9. 里面一圈有11线同时转 里转一圈须11*9.6*4脉冲

  10. 边沿触发(四倍频)一共~32768到32768(正负各一圈)

  11. TIM3----PB6\7 TIM2----PA0\1
    在这里插入图片描述
    在这里插入图片描述

  12. 5、设置TIM2(编码模式,65535,TI1\2都计数)
    在这里插入图片描述

  13. 设置ITM2滤波器 6(最好也开个中断)
    在这里插入图片描述

  14. 同理设置TIM4
    在这里插入图片描述

  15. 设置TIM4滤波器
    在这里插入图片描述

  16. 设置引脚上拉(GPIO的TIM)
    在这里插入图片描述

  17. 生成代码

  18. 6、开启定时器和定时中断
    在这里插入图片描述

  19. 定义两个变量存计数器值(short类型编码器计数1、2)
    在这里插入图片描述

  20. 每2ms读取计数器值->清零计数器
    在这里插入图片描述

  21. 接好电池、烧录代码、串口一连接电脑

  22. 用手转动电机1或者电机2 、串口助手可以看到输出信息了
    在这里插入图片描述

  23. 7、主函数周期测量转速

    1. 上面我们测量出来了溢出值,我们再根据当前计数器值就可以测量出计数器变化量
    2. 我们通过单位时间变量就可以计算出转速
    3. 下面是电机和编码器的参数
      在这里插入图片描述
  24. 我们先测试的结论是否有问题?

    1. 编码器计数器会不会在计数时间内溢出?肯定不会
    2. 车轮旋转一周,单片机编码器计数器计数多少?9.6乘11乘(即计422.4个脉冲一个周期

两毫秒(main所延迟的函数)转77圈才溢出

  1. 根据计算方法计算电机转速

  2. 定义两个float变量(来放速度值)
    在这里插入图片描述

  3. 下面是代码(一定要把主函数没有用的删除掉)
    在这里插入图片描述

10ms(设置的延时10ms)*100=1s

  1. 编译烧录代码就会输出结果
    在这里插入图片描述

  2. 8、定时器中断定时测量速度

    1. 上面我们实现:在主函数main.c周期,读取计数器值然后计算速度,但是如果函数加入其他内容这个周期时间就 很难保证
    2. 所以这节我们通过定时器1,周期读取计数器,计算速度
      在这里插入图片描述
  3. 我们先开启定时器2ms进入一次定时器中断中断回调函数执行咱们的代码即可。

  4. 为什么充分利用单片机 我们使用TIM1

  5. 设置内部时钟源

  6. 使能自动重装载
    在这里插入图片描述

  7. 开启定义更新中断
    在这里插入图片描述

  8. 代码开启定时器1 中断

  9. 定时器回调函数中添加 速度计算内容
    在这里插入图片描述

arr和psc都是MX TIM1已经设好的值了

  1. 把main之前的变量定义放这里
    在这里插入图片描述

  2. 主函数就输出速度大小就可以了
    在这里插入图片描述

  3. 把变量需要声明一下

  4. 然后打开串口助手
    在这里插入图片描述

  5. 根据电机和实际小车调整速度测量与占空比设置函数
    在这里插入图片描述
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值