一、建立思维导图,将功能分析近而转换成技术要点,逐步实现。
二、编码器
1、机械编码器
(1)机械编码器是什么,张啥样?
如下图,这个就是我们生活应用中常见的机械编码器,我们又叫旋转编码器,常应用各种调节,比如音量调节、温度调节等等场合
(2)内部构造与其原理
如上图,我们可以到这个编码的引脚情况;我们通常把编码的C端接地,然后我们队编码器进行旋转,此时我们来分析A、B两脚会出现什么情况。
根据左边的图片分析:
上图绿色与黄色对应的是A相与B相输出的波形
由于我们公共端接地,我们将MCU两个管脚设置上拉输入分别接至A、B两脚,此时就会呈现出上图的波形。从波形第一眼可以看出两个波形图的A、B两相出发位置不同,如果从第一张图看,A相先出发拉低,然后再是B相;而第二张波形图则是B相先出发,那么显然我们立马可以根据出发顺序,判断旋转编码器顺时针还是逆时针旋转的。
综上所述:根据A相、B相出发顺序得知编码器正反转的信息。
再来分析波形
正常A B相她们是间隔90度的相位差的,也就是8等份。我们采集可以根据电平的出发进而得到对应的二进制数据,如下图
而我们也从图片知道在一个周期上A 、B相的脉冲数,在根据手册提供旋转一圈有几个脉冲,即可计算转速。这里先提下,在计算转速我们正常在上升沿和下降沿触发进行计数(看上图是不是4次),也就是4倍频
(3)如何使用,硬件搭建与软件设计思路
硬件搭建:外部引脚上拉机加上硬件滤波
软件思路:正反转识别
使用状态机进行正反转判断。
这是第二种方法,抓换成二进制进行正反转的判别。
软件思路:举例温度调节
我们应用中通过旋转编码器是的调节温度升压与下降,电烙铁。
那么再程序中实际就是扫描A、B触发在进行消抖,确定识别到是一次转动,通过不断转动,你识别到一次,就温度变量加加或者减减;其实就相当于按键不断按下进行调节,所以这就是旋转编码器我们常用到的功能。程序中主要是消抖处理。
2、带编码器的直流减速电机
1、什么叫带编码器的直流减速电机
直流电机我相信大家都清楚是什么东西,但偏偏这个东西不仅减速,还带编码器。先解释下为什么带编码器,毕竟我们要测速,就需要一个传感器来完成这样的功能,所以编码器就来充当了这个传感器。不过有时候编码器和电机是单独分开的,比如做过智能车的朋友就会清楚。而我们用的这个电机却把编码器和电机做成了一个整体。而为什么我们需要减速呢,学过物理的人应该清楚这个公式P=FV,即在输出功率相同的时候,力和速度成反比,也就是说,电机的转速越慢,转动的力量就越大。所以这个时候你们就应该明白,为啥你们买电机的时候,厂家会有各种不同减速比的电机
另一个参数概念:
编码器线数: 就是电机旋转一圈你的A(B)会输出多少个脉冲 ,这里的A B就是上面的输出脉冲信号线,它们A相和B相转一圈发出的脉冲数一样的,不过存在90°相位差。通常都是360线的,线数越高代表编码器能够反应的位置精度越高。所以,你们想追求精度,就尽量选择线数越高的电机。
如上图就是直流减速电机带编码器的参数信息。
而A相、B相就是与上面介绍的机械旋转编码器一样,可以输出对应的脉冲波形
看到这里应该都明白了,机械编码和电机上的编码其实原理是一样的,我们使用本质就是要采集脉冲,在电机场合上,我们要主要采集转速与电机此时转动方向信息。
下面我们就进入STM32使用硬件编码器对电机进行速度采集控制等。
三、STM32硬件编码器使用
参考这位厉害的博主:关于STM32定时器中TI1FP1 与TI1FP2及相关话题_tim_ts_ti1fp1_zoe512622789的博客-CSDN博客
整体来讲,STM32各个系列的TIMER外设基本框架和功能是类似的,大体分高级定时器、通用定时器和基本定时器。除了基本定时器外,每个高级定时器或部分通用定时器都可以产生4对中间信号,分别是TI1FP1 与TI1FP2,TI2FP1 与TI2FP2,TI3FP3 与TI3FP4,TI4FP3 与TI4FP4,即每个输入通道可以生产1对信号。
这里以STM32F103系列为例聊聊这个 TImFPn。
在SMT32各系列的参考手册的定时器部分,在描述高级定时器或通用定时器时都可以看到如下的一副图。图中对那4对信号被清晰地描绘了出来
这四对信号可以统一写为:TImFPn,其中 m代表滤波和边沿检测器前的输入通道号,n代表经过滤波和边沿检测器后将要接入或者说要映射到的捕捉通道号。 比如:TI1FP1,是来自于通道TI1,经过滤波器后将接到捕捉比较通道IC1;
TI1FP1,是来自于通道TI1,经过滤波器后将接到捕捉比较通道IC1;
TI1FP2,是来自于通道TI1,经过滤波器后将接到捕捉比较通道IC2;
TI2FP1,是来自于通道TI2,经过滤波器后将接到捕捉比较通道IC1;
TI2FP2,是来自于通道TI2,经过滤波器后将接到捕捉比较通道IC2;
TI3FP3,是来自于通道TI3,经过滤波器后将接到捕捉比较通道IC3;
TI3FP4,是来自于通道TI3,经过滤波器后将接到捕捉比较通道IC4;
TI4FP3,是来自于通道TI4,经过滤波器后将接到捕捉比较通道IC3;
TI4FP4,是来自于通道TI4,经过滤波器后将接到捕捉比较通道IC4;
那每一对信号到底是什么关系呢?比如TI1FP1与TI1FP2。说实在的,这个地方参考手册里就没有个明确的表述,让人很费解。但是可以从一个地方可以推理得出来,那个地方下面会提到。其实,二者都是来自同一TI1输入通道,经过输入滤波和边沿检测器后所产生的具有相同特征的信号,然后映射到不同的输入捕捉通道,本质上还是同一路信号。
同理,TI2信号,经过滤波和边沿检测后产生了2路滤波信号,分别是TI2FP1与TI2FP2,它俩也是具有相同特征的信号,只是TI2FP1映射到捕捉通道IC1,TI2FP2映射到捕捉通道IC2.
那么对于TI3、TI4输入通道,经过滤波和边沿检测后,也分别产生两对滤波信号TI3FP3与TI3FP4,TI4FP3与TI4FP4,分别前往IC3和IC4输入捕捉通道。
STM32定时器部分,有个PWM输入模式的应用介绍。专门介绍如何利用PWM输入模式测量某一路外部输入信号的频率和占空比的话题。这里正是利用TI1FP1与TI1FP2来自于同一通道TI1且TI1FP1可以作为从模式触发源的特点来完成的。通过该实例不难理解TI1FP1与TI1FP2的实质就是一个东西。【在不做过滤和反相处理的前提下,TI1=TIF1P1=TI1FP2】
下面是利用PWM输入模式对TI1输入信号的周期和占空比进行测试的大致过程。特别注意图中红色标注的那些地方。
显然,这里的PWM输入模式正是利用2个捕捉通道针对同一信号进行的捕捉,只是分别针对上升沿和下降沿进行捕捉。
要注意的是,利用上述PWM输入模式方法对外部输入信号的频率和占空比进行测量,只限于TI1或TI2通道。因为只有TI1FP1和TI2FP2接到了从模式控制器。这点,资料上有讲得清楚,有人有时无视了这点,将待测信号接到TI3或TI4后使用上述方法自然就不灵光了。
另外,STM32的部分定时器中还集成了正交编码控制器,这个应用与TI1FP1和TI2PF2有关,换言之,要使用STM32内部正交编码功能的话,只能使用TI1和TI2两个输入通道。所以,应用时不要随便乱接。
是哪个通道绑定这编码,我们要框图中的Encoder。
而且,并不是只要有TI1和TI2两个输入通道的定时器就内置正交编码接口。其实不然。比方32F1系列中的TIM9和TIM12就不支持。所以设计时需要查看下相关定时器的框架图。
关于正交编码器应用,有个编码信号与计数方向对照关系表经常让人觉得看起来费劲。【注意,正交编码接口用到的信号是TI1FP1和TI2FP2。即一路来自TI1,一路来自TI2】
结合上面的关系表和计数阶梯图我们来一起看下。
假设我们选择的是模式1,即计数器仅在TI1的边沿处计数。我们观察TI1的上升沿,若此时对应的TI2信号处于低电平(下图红框),于是根据表格我们可以得到计数方向为递增,假设计数器递增时电机正向转动,则可判断此时电机正转。
再譬如,假设我们选择模式2,即计数器仅在TI2的边沿处计数。我们观察TI2的下降沿,若此时对应的TI1信号为高电平(下图蓝框),于是根据表格我们可以得到计数方向为递减,假设计数器递减时电机反向转动,则可判断此时电机反转。
也就是说,当以TI1为计数信号时,需要根据TI2的电平(也就是第二纵列的“相对信号的电平”)来进行判断是向上计数还是向下计数。TI2也同理。
那么根据上面的说法,我们来对下这个梯形图,是不是就可以一一对上了啊。
再例如,如果“仅在TI2计数”时,当TI2为下降沿时,如果TI1为低电平,则为向上计数(上图左侧);当TI2为下降沿时,如果TI1为高电平,则为向下计数(上图中部);当TI2为上升沿时,如果TI1为高电平,则为向上计数(上图左部);当TI2为上升沿时,如果TI1为低电平,则为向下计数(图中中部);
到这里,我们了解了硬件编码的器他的计数原理。下面来讲下我们在配置过程的常见的疑问。
正交编码器有两路A、B正交的输入信号,根据实际需要,可以设置只捕获某个通道的上升沿或下降沿,也可以设置同时捕获两个通道的上升沿与下降沿,这样就可以提高编码器的计数精度,实现倍频。那么倍频的意义是什么呢?为什么大家都用这个?
那是因为这样能提高分辨率,你想,A相和B相是一个相差90度的脉冲,意思就是说每90度就有一个上升沿或者下降沿,这样就是每90度计数一次,而你用模式1或2时,你就是360度才计数一次,假如你有个段时间编码器输出不正常,明明A相和B相只相差90度,而这时你信号不稳定,这段时间就会计数不正常,你用了编码器模式3后,就会把误差缩减4倍。
所以我们第一点肯定是选择使用模式3,即4倍频。
编码器模式配置时,定时器的重装载值对计数有什么影响。相信看过很多帖子的人会知道一个四倍频的东西,就是它定时器的重装载值为(线数-1)*4,然后又有很多代码他的重装载值为65535-1,还有少数的代码是一些其他值,当时我看到这些代码我就很疑惑,为何他们重装值不同,然而最后他们都说可以完成测速,我试过,我改变重装值,计数会不一样。
这里面的重装载值就是你最多能记录A相和B相的脉冲数,假如你的电机转1圈产生800个脉冲,而你的重装载值为1,就是说你电机转一圈,你的定时器会溢出800次,假如你重装载值为400,那么你电机转一圈,你的定时器就会溢出2次。这里大家可能就明白为何四倍频时那里的重装载为(线数-1)*4,你想,我前面讲了,你用编码器模式3,产生的脉冲数就是你的线数*4,这样意思就说,你转一圈,产生的脉冲数恰好是你定时器溢出的时候。
对于你要设置重装载值多少,其实是不影响,如果溢出,我们就在中断服务函数进行在加加即可,到时候规定时间内,我们计算总共有多少次脉冲就OK。这个可以我们代码中体现出来。
其次是分频系数,这个我郁闷了好久。
我们通常在定时器时原来预分频系数分的内部时钟,但是当你是编码器时现在分频系数分的就是外部时钟。这个外部时钟就是你A \B相输入进来的频率,这样说应该懂了,如果你这时候分频系数为2,假设现在输入脉冲的次数是8 ,原本我们是想得到8的,但是由于你设置了分频系数,此时你得到的是4,所以正常大家都不分频,就是为了方便计算。
接下来:这句编码配置,搞了我好久找了好多资料才清楚
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );//编码器配置(定时器、编码模式、上升沿、上升沿)
前面两个参数,大家都能理解,但是后面两个参数就把我搞懵了,不是要4倍频吗,理论上应该要采集双边沿触发才对呀,怎么这里配置成了上升沿触发,那不是矛盾了吗?
接下来解释下:
(1) SMCR寄存器配置触发模式
SMCR即从模式控制寄存器(slave mode control register),查阅STM32F4的参考手册,可以找到类似如下信息,现在我们只需关注SMS这几位:
-
位 15 ETP:外部触发极性 (External trigger polarity)
-
位 14 ECE:外部时钟使能 (External clock enable)
-
位 13:12 ETPS:外部触发预分频器 (External trigger prescaler)
-
位 11:8 ETF[3:0]:外部触发滤波器 (External trigger filter)
-
位 7 MSM:主/从模式 (Master/Slave mode)
-
位 6:4 TS:触发选择 (Trigger selection)
-
位 3 保留,必须保持复位值
-
位 2:0 SMS:从模式选择 (Slave mode selection)
-
000:禁止从模式––如果 CEN =“1”,预分频器时钟直接由内部时钟提供。
-
001:编码器模式 1––计数器根据 TI1FP1 电平在 TI2FP2 边沿 递增/递减计数。
-
010:编码器模式 2––计数器根据 TI2FP2 电平在 TI1FP1 边沿 递增/递减计数。
-
011:编码器模式 3––计数器在 TI1FP1 和 TI2FP2 的边沿计数,计数的方向取决于另外一个信号的电平。
-
100:复位模式––在出现所选触发输入 (TRGI) 上升沿时,重新初始化计数器并生成一个寄存器更新事件。
-
101:门控模式––触发输入 (TRGI) 为高电平时使能计数器时钟。只要触发输入变为低电平,计数器立即停止计数(但不复位)。计数器的启动和停止都是受控的。
-
110:触发模式––触发信号 TRGI 出现上升沿时启动计数器(但不复位)。只控制计数器的启动。
-
111:外部时钟模式 1––由所选触发信号 (TRGI) 的上升沿提供计数器时钟。
-
TIM_EncoderMode_TI12查找库函数,对应的数据是
那03-> 011:编码器模式 3––计数器在 TI1FP1 和 TI2FP2 的边沿计数,计数的方向取决于另外一个信号的电平。所以这个配置是没错。
(2)CCER寄存器配置极性
通过编程 TIMx_CCER 寄存器的 CC1P 和 CC2P 位,可以选择 TI1 和 TI2 极性。实际上就是设置TIxFP1 是否与TIx反相,来设置正转时是向下计数还是向下计数。
-
位 15、11、7、3 CCxNP:捕获 /比较x 输出极性 (Capture/Comparex output Polarity)
-
位 14、10、6、2 保留,必须保持复位值
-
位 13、9、5、1 CCxP:捕获 /比较x 输出极性 (Capture/Comparex output Polarity)。
-
00
:非反相/上升沿触发电路对 TIxFP1 上升沿敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作), TIxFP1 未反相 (在门控模式或编码器模式下执行触发操作)。 -
01
:反相/下降沿触发 电路对 TIxFP1 下降沿敏感 (在复位模式、外部时钟模式或触发模式下执行捕获或触发操作), TIxFP1 反相 (在门控模式或编码器模式下执行触发操作)。 -
10
:保留,不使用此配置。 -
11
:非反相/上升沿和下降沿均触发 电路对 TIxFP1 上升沿和下降沿都敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作),TIxFP1 未反相(在门控模式下执行触发操作)。编码器模式下不得使用此配置!!!。 -
0:OCx 高电平有效
-
1:OCx低电平有效
-
CCx 通道配置为输出:
-
CCx 通道配置为输入:
CCxNP/CCxP 位可针对触发或捕获操作选择 TI1FP1 和 TI2FP1 的极性。
-
-
位 12、8、4、0 CCxE:捕获 /比较 x 输出使能 (Capture/Comparex output enable)
注:在编码器模式下,极性的作用是设置TIxFP1 是否反相,不要被”上升沿字眼“误导为是只捕获上升沿信号!
”上升沿敏感“是在非编码器模式下的功能。所以,编码模式下,只能配置为00
或01
。
另一方面来看,编码器模式下,只能通过SMCR的模式设置倍频,要么是2倍频,要么是4倍频,貌似不能设置1倍频(只对1个通道的上升沿或下降沿计数)。
所以看了上面寄存器,我们可以明白“TIM_ICPolarity_Rising”这不是代表上升沿触发的意思,而是设置极性是否要设置成反相的意思。
从库函数,我们可以看到这里的数据是00-> 核对上面的手册代表TIxFP1 未反相,即计数数据还是我们之前看到的梯形图
如果设置成反相,那么你的梯形图就变成如下
当然在手册别的地方也有说明:
上图红框更多描述的是反相还是不反相而不是上升沿还是下降沿。蓝框为TI12模式,即模式3,设置模式3时已经确定上升沿和下降沿都有效,所以也没必要再配置上升沿还是下降沿有效。更进一步说明TIM_EncoderInterfaceConfig函数的后两个参数设置的不是上升沿或者下降沿,而是反相还是不反相。
综上所述:TIM_EncoderInterfaceConfig函数的后两个参数命名为TIM_ICPolarity_Rising实际使用的是反相和不反相的功能。
四、转速的测量
1、M法测量
2、T法测量
3、M/T法测量
1、编码器
在讲测量方法之前,我们先接电机的霍尔编码器。
常见的编码器有两种,分别为霍尔编码器和GMR编码器。
霍尔编码器圆盘上分布有磁极,当圆盘随电机主轴转动时,会输出两路相位差90°的方波,用这两路方波可测出电机的转速和转向。
编码器线数: 就是电机旋转一圈你的A或者B会输出多少个脉冲 ,这里的A B就是上面的输出脉冲信号线,它们A相和B相转一圈发出的脉冲数一样的,不过存在90°相位差。通常都是360线的,线数越高代表编码器能够反应的位置精度越高。所以,你们想追求精度,就尽量选择线数越高的电机。
GMR编码器利用巨磁阻效应进行测速,GMR编码器一般是500线的,转一圈每项会输出500个脉冲,精度比霍尔编码器高得多,适合对精度要求高的环境或者最求完美的人
2、常用测速方法
2.1 倍频技术
编码器会输出两路方波信号,如果只在通道A的上升沿计数,那就是1倍频;通道A的上升、下降沿计数,那就是2倍频;如果在通道A、B的上升、下降沿计数,那就是4倍频。
使用倍频可以最大程度地利用两路信号,提高测速的灵敏度。
下面说的三种测速方法只是在软件计算上的区别,硬件上是没有改变的
2.1 M法测速(周期测量法)
简单地说就是根据单位时间一共有多少个脉冲来计算转速。
M法测量有个缺点,就是当M0脉冲数很小,那么转速的变化很小,误差大,所以M法比较适合于高转速环境。
2.2 T法测速(频率测量法)
T法测速是这样操作的:是指先建立一个频率已知且固定的高频脉冲,当编码器读到一个信号,开始对高频脉冲进行计数,编码器第二个信号到来后,停止计数。根据对高频脉冲计数的次数、高频脉冲频率和电机转一圈编码器产生的脉冲数进行速度计算。
电机转一圈产生的脉冲数为C,F0(Hz)为编码器输出脉冲的频率,M1为高频脉冲的计数值,设转速为n(r/s);
以上可先得:一个脉冲周期所需时间 = M1/F0;那么一圈有C脉冲,其转一圈所需时间为CM1/F0,那么每秒转的圈数:1s/(CM1/F0) = F0/CM1
由于频率是固定,电机每圈的脉冲数C也是固定,所以当转速慢,脉冲计数值M1越小,从公式可以看出M1在分母,M1越小,这个公式计算误相当于不变,所以误差大,当转速很小,M1越大,所以公式结果一直在变化,所以T法适用于低速场合。
总结:
M法:一个是在固定的时间内测转动的圈数
T法:一个是测转一圈用多少时间
2.3 M/T法测速
M/T法综合了M法和T法的优势,计算公式如下。
- M/T法:综合了M法和T法各自的优势,既测量编码器脉冲数,又测量一定时间内的高频脉冲数。在一个相对固定的时间内,计算编码器脉冲数M0,并计数一个已知频率F0的高频脉冲,计数值为M1,计算速度值。设编码器单圈总脉冲数为C,则转速n的计算公式为:
- n = F0*M0 / (C*M1)。
- 这么理解:在规定时间内以高频脉冲计数进行表示,这个时间就是M1/f1,在这个时间内霍尔编码器输出个数为M0,电机完整转一圈霍尔应输出的C个脉冲,所以用M法表示就等于
(M0/C)/T0 = n
T0又等于 M1/f1
综上合并公式n = F0*M0 / (C*M1)
所以电机使用场景应看转速的值,在决定用那个方法。
不过据我所知,使用过程中计算转速好事存在数据抖动,比如会出现500r/501r/500r\499r,这样子的,导致在PID调速存在影响,所以对于这个种数据应子啊进行处理,处理方法我还没想好,打算在参照别人的程序看看。
stm32f4编码器模式_stm32 编码器模式_云端FFF的博客-CSDN博客
带霍尔传感器编码器的直流减速电机测速原理讲解(附源码)-OpenEdv-开源电子网
电机控制基础——定时器编码器模式使用与转速计算
STM32编码模式TIM_EncoderInterfaceConfig函数参数含义_stm32 tim encoder_编程小辣鸡~~~的博客-CSDN博客
PID 控制_百度知道
PID的增量式与位置式_增量式pid_Autism_Huang的博客-CSDN博客
【基础知识】PID(比例微分积分)控制_pid积分_Hz1213825的博客-CSDN博客
【STM32】【HAL库】定时器编码器模式测速_hal库 电机测速_Hz1213825的博客-CSDN博客
我的PID学习历程---PID位置式和增量式_藕粉-的博客-CSDN博客