STM32 对编码器读数进行线性化处理

发布时间 2023-08-10 21:57:34作者: Sound_Sleep

使用 STM32 的标准库和 HAL 库的函数读取编码器的数值,如果车轮向前转,编码器的数值从 1 往上增加,如果车轮向后转,则编码器的数值从 65535 往下减小,原因是定时器用于存储计数值的寄存器 TIMx_CNT 是一个 16 位的寄存器,可以正向或者反向计数,当 TIMx_CNT 从 0 开始反向计数时,TIMx_CNT 的值就会变为最大值 65535

我们不希望它这样变化,因为 PID 适用于二阶以内的线性系统,所以需要一种转换方法让其越过 0 后从 -1 开始往下减小,整个数值变化呈现线性

一种实现方法是将读取到的值强制转换成(short)类型,原理如下:以65535为例子,65535的编码是1111 1111 1111 1111,由于 short 是 16 位的有符号类型,所以转化为 short 型后,最高位从数值位变成了符号位,计算机中存储的是补码,原码才是它实际表示的数字,所以现在求 1111 1111 1111 1111 的原码:流程是补码>>反码>>原码,反码 = 补码 - 1,所以反码是 1111 1111 1111 1110,原码 = 反码的符号位不变其他位取反,所以原码是 1000 0000 0000 0001,对应 -1,同理如果是 65534,对应的就是 -2

这个 short 类型的读数可以用 int 型、long int 型等位数更多的有符号类型变量来承载,有符号型变量进行向上的隐式类型转换时数值位保持不变,符号位对应移动