STMCU小助手
发布时间:2022-3-24 22:23
|
增量式编码器 增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号 通过读取单位时间脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器的码盘的周长(转一圈对应距离) 便可以达到计算行走距离的效果(s=n*d)% r4 ]8 s, v9 O5 K7 ^ 编码器信号: A 脉冲输出 9 f9 j; h% {7 m0 s) x+ ` B 脉冲输出 Z 零点信号 当编码器旋转到零点时,Z信号会发出一个脉冲表示现在是零位置 表示编码器转了1圈,可用来记录编码器转了多少圈,从而知道运行距离3 {( p8 ~5 k' m' r" d4 ^; _9 a VCC 电源线: m2 W% n3 V4 I+ h; N/ [ R GND 地线 3 j6 a3 C( [- N
编码器线数: 编码器的线数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,说明这个编码器转一圈对应的信号线会输出500个脉冲, A B两相转一圈发出的脉冲数一样的,不过存在90°相位差 ?$ B S U" _. P / \* Y' n* l S 线数越高代表编码器能够反应的位置精度越高: ], J9 ^2 x/ ? M! b 编码器原理:. @$ B) G/ m! Y 增量式编码器有两个脉冲输出,A相和B相,并且两个相位永远存在90°相位差。 如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、并且可以根据AB相脉冲信号数量测得速度,位移等, 编码器正反转:
$ C7 u+ `( _9 w( i 正转的时候信号线A先输出信号,信号线B后输出 A相超前B相90度 证明是正转$ Z; C; Q& l2 M- y ! i, p$ o$ |8 Q 反转的时候信号线B先输出信号,信号线A后输出 B相超前A相90度 证明是反转 * H5 V0 F+ E [ STM32定时器编码器模式 : B* C0 v) b2 H w h
+ v( d( I U" O6 X- Q STM32的编码器模式共有三种:; D* |" n* n$ A/ B, @9 t0 l7 R8 R $ c; q) b- B% A6 _3 g 仅在TL1计数(A相)" S$ j( |$ o5 F; N2 @) k8 X 仅在TL2计数(B相)5 [5 E- ?- X* m% g5 a) _; C$ D 在TL1和TL2都计数(A相和B相都计数) + W0 I6 v! b7 b/ V2 s 仅在TL1计数(A相) R+ d* _7 @ l! u! X( q , g$ t7 f$ b) f4 ^2 s ]$ G9 V% Q
TI2(B相)为高电平时: 3 @' m* R9 f, }0 a 1时刻: TI1(A相)下降沿, 则向上计数(正转)。 2时刻:TI1(A相)上升沿, 则向下计数(反转) ; {3 V+ f1 U: j5 y3 Y- g TI2(B相)为低电平时: . y- x* @8 i6 q6 P" H2 i$ A& Y 3时刻: TI1(A相)上升沿, 则向上计数(正转)。0 S/ `5 P& ?* Z 4时刻:TI1(A相)下降沿, 则向下计数(反转)- T8 o- L, m. q! ]4 D 仅在TL2计数(B相)6 G1 F: j) I- P- U# ~( h7 \1 D* Q - t* r( D/ B! y. K- R
TI1(A相)为高电平时:0 @6 h! O! h2 c! f& I) Z: B 1时刻: TI2(B相)上升沿, 则向上计数(正转)。 $ m2 k* ^/ B) z& u+ m3 f 2时刻:TI2(B相)下降沿, 则向下计数(反转)# Y9 q8 V5 b: E E : G+ D/ P. g; m& b1 ^ TI2(B相)为低电平时:- a8 R6 h) u3 A/ z; w& w & b! X, `, S+ i1 S/ x 3时刻: TI2(B相)下降沿, 则向上计数(正转)。# s2 A" X, W! T , Z0 H" k: a4 w4 b4 y4 l3 F: W1 Q 4时刻:TI2(B相)上升沿, 则向下计数(反转) : q# }, ^+ h* H" @# x8 e 在TL1和TL2都计数(A相和B相都计数)
" m, ^5 @2 ~0 D: m2 O 一个脉冲信号周期完成4次跳变。精度提高/ l1 C- u+ k6 G, m+ i9 k0 \ 1时刻:TI2为低电平,TI1上升沿跳变,计数器向上计数;1 s6 h/ }# r- Y V; x6 \8 o, [- C( R ( {% z( a: l! i# I X! _4 |6 x 2时刻:TI1为高电平,TI2上升沿跳变,计数器仍然向上计数;* m8 t, K7 j- q+ w 3时刻:TI2为高电平,TI1下降沿跳变,计数器仍然向上计数; 4时刻:TI1为低电平,TI2下降沿跳变,计数器仍然向上计数。 1 a- U) }) B$ e5 }: @4 v' w: [# ` 毛刺:只有一个相位脉冲 过滤掉 编码器转动过程中可能产生的毛刺过滤掉 计数器向下计数原理相同 看图即可很好理解。 计数器向下计数:# E* E' p. ~ q5 S! W, C' H% D, L A下降沿,B低电平' P5 e# P4 E" v9 Z B下降沿,A高电平1 ]4 |3 T: G5 j4 Y9 F, \% S# M B上升沿,A低电平 A上升沿,B高电平) u" M7 S A) A6 X& ~ 注意事项:4 e% C6 X/ s, o4 }. P0 K. Q 1.需要增加测量的精度时,可以采用4倍频方式,即分别在A、B相波形的上升沿和下降沿计数,分辨率可以提高4倍, 2.如果只是测速,不要求方向,那么只需要用单片机随意选择一个信号线就行了,,然后定时器边沿触发,检测脉冲计数即可 3.一般是定时器的通道1和2才能作为编码器输入口,对应编码器输出的两相。; d. J, N" q' ^8 u) Y3 n; G 4.GPIO配置为配置为上拉输入模式 5.一个定时器做一种工作,如果你配置了编码器模式,那么剩下的通道就不能配置其他模式% B- e; E, A6 y. c# J* { c, _ 6.两相计数模式下, 读出来数需要/4 一个脉冲信号对应四次计数 编码器配置标准外设库 TIM_EncoderInterfaceConfig,它就是编码器接口的配置函数。简单的只需要配置该函数,使能TIM,即可实现采集编码器上面的信息 ) j1 v5 i/ t/ E0 {
TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。3 m& R: j o7 H % c* T' W8 L: t TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)。 TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。! D" s2 p: ?' W" C, v, T7 { 7 T. ~- r r$ g$ L, w2 w, X( [7 ~1 [ 相关寄存器配置5 }$ ^2 E, y1 ?9 D5 e( p. ~; d8 [ ● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)% j5 p' ]5 G# G+ W; Q% U ● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2) ; R, G- r ]5 v. D! y; V1 | ● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)+ N2 G8 F& \; l( x 3 P- }" t9 U% u1 X ● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2); d6 ~1 `- F+ @/ C ● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效). $ r: s0 P' K6 f3 t ● CEN=’1’ (TIMx_CR1寄存器,计数器使能) 如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011 编码器模式功能: stm32f407中定时器1、2、3、4、5、8提供编码器接口模式 可以对输入信号TI1,TI2进行滤波处理,数字滤波器由事件器组成,每N个事件才视为一个有效边沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域设置 也就是可以设置每产生几次脉冲才视为1次有效 4 U! I' J! Q5 e. K0 m% @4 a 各个值的计算: 转速计算方法:用捕获值(一秒内输出的脉冲数)/编码器线数(转速一圈输出脉冲数)/电机减数比(内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比 没有则不用除)5 f8 z% n& H( e- {. T3 L% |% b! i! Z 运动距离计算:输出的总脉冲数 / 编码器线数*编码器齿轮周长 & y% h* E1 `1 n& G h& B3 n 所转角度计算: 输出的总脉冲数 / 编码器线数 *360 或 溢出中断次数*360+当前计数值 转动方向: 方向在定时器CR1的DIR位里 dir=(TIMX->CR1 & 0x0010)>>4; //取方向标志位 if(dir > 0) //向下计数 else //向上计数 9 J! R, f) u0 D 那么我们直接看代码: 定时器初始化设置
重装载值: (编码器线数-1 ) *4 因为我们是两相计数,一个脉冲信号4次计数,所以乘4,保证转完1整圈才触发中断 中断设置: $ w4 ?) H7 m3 B2 P$ |' D
各个值的计算:* D A( L# s! P; E8 e" ~! O( V5 x 脉冲数: TIM_GetCounter(TIM3)/4 0 S6 U/ ]2 l! X# a! y % a& x7 t. ~& O
, c, _" R& H# ?, y ) K K! p' w; X/ C. N7 w" P ` |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版