07 编码器测速
-
1、认识编码器
- 编码器:一般按照电机尾部、用于测量电机转速、方向、位置。
- 编码器:一般按照电机尾部、用于测量电机转速、方向、位置。
-
2、那么编码器的输出信号具体是什么?我们如何根据输出信号测量转速和方向?
- 转速: 单位时间测量到的脉冲数量(比如根据每秒测量到多少个脉冲来计算转速)
旋转方向: 两通道信号的相对电平关系- 就是看a上升延的时候b是高还是底来区分正转反转
A上升沿,B低(顺),A上升沿,B高(逆)
- 2、单片机定时器的编码器功能
- 那么知道编码器输出的波形,我们如何通过单片机读取波形,然后计算出速度那?
- 这里STM32单片机的定时器和通用定时器具有编码器接口模式、
- 在STM32中文参考手册13章中有详细介绍(-第200页)
- TIMx_CNT(计数器寄存器):记录单位时间脉冲数量、
- TIMx_CR1(寄存器):表示计数方向
STM32中文参考手册-第267页
-
STM32中文参考手册-第226页
-
这个是计数方向与编码器信号的关系、我们拆开来看
-
仅在TI1计数、电机正转、对原始数据二倍频(上、下沿计数一次)
-
补:TI1计数,看第一个上升沿,看到向上向下计数,此刻TI2电平为低电平,所以是向上计数
-
在TI1和TI2都计数
-
可以看到这样就对原始数据四倍频了
俩个每次边沿触发一次
-
计数方向(向上向下计数)
-
3、获得单位时间计数器值变化量
-
short类型的取值范围通常是从-32,768到32,767(即-215到215-1)。
-
因此可以看数的正负判断方向
-
上一次说的方法:
- 这次编码器计数值 = 计数器值+计数溢出次数 * 计数最大器计数最大值
- 计数器两次变化值= 这次编码器计数值 - 上次编码器计数值
- 然后根据这个单位变化量计算速度
-
还有一种方法:
- 计数器变化量 = 当前计数器值 ( 每次计数值清空)
- 然后根据这个变化量 计算速度
- 然后我们再看具体到哪一款电机和编码器上如何测速
-
4、JGA25-370电机(减速比1:9.6)
-
即外面转1圈,里面转9.6圈
-
里面一圈有11线同时转 里转一圈须11*9.6*4脉冲
-
边沿触发(四倍频)一共~32768到32768(正负各一圈)
-
TIM3----PB6\7 TIM2----PA0\1
-
5、设置TIM2(编码模式,65535,TI1\2都计数)
-
设置ITM2滤波器 6(最好也开个中断)
-
同理设置TIM4
-
设置TIM4滤波器
-
设置引脚上拉(GPIO的TIM)
-
生成代码
-
6、开启定时器和定时中断
-
在定义两个变量保存计数器值(short类型编码器计数1、2)
-
每2ms读取计数器值->清零计数器
-
接好电池、烧录代码、串口一连接电脑
-
用手转动电机1或者电机2 、串口助手可以看到输出信息了
-
7、主函数周期测量转速
- 上面我们测量出来了溢出值,我们再根据当前计数器值就可以测量出计数器变化量
- 我们通过单位时间变量就可以计算出转速
- 下面是电机和编码器的参数
-
我们先测试的结论是否有问题?
- 编码器计数器会不会在计数时间内溢出?肯定不会
- 车轮旋转一周,单片机编码器计数器计数多少?9.6乘11乘(即计422.4个脉冲一个周期)
每两毫秒(main所延迟的函数)转77圈才溢出
-
根据计算方法计算电机转速
-
定义两个float变量(来放速度值)
-
下面是代码(一定要把主函数没有用的删除掉)
10ms(设置的延时10ms)*100=1s
-
编译烧录代码就会输出结果
-
8、定时器中断定时测量速度
- 上面我们实现:在主函数main.c周期,读取计数器值然后计算速度,但是如果函数加入其他内容这个周期时间就 很难保证。
- 所以这节我们通过定时器1,周期读取计数器,计算速度
-
我们先开启定时器、2ms进入一次定时器中断,中断回调函数执行咱们的代码即可。
-
为什么充分利用单片机 我们使用TIM1
-
设置内部时钟源
-
使能自动重装载
-
开启定义更新中断
-
代码开启定时器1 中断
-
定时器回调函数中添加 速度计算内容
arr和psc都是MX TIM1已经设好的值了
-
把main之前的变量定义放这里
-
主函数就输出速度大小就可以了
-
把变量需要声明一下
-
然后打开串口助手
-
根据电机和实际小车调整速度测量与占空比设置函数