STMCU小助手
发布时间:2022-3-24 22:23
|
增量式编码器. d% _6 I1 ^0 g2 S" o$ e 增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号 通过读取单位时间脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器的码盘的周长(转一圈对应距离) 便可以达到计算行走距离的效果(s=n*d)9 E# K; _5 x8 \ 4 A$ x6 L6 u( @6 M 编码器信号: A 脉冲输出 B 脉冲输出 0 N9 _+ d( }9 U' m' f T Z 零点信号 当编码器旋转到零点时,Z信号会发出一个脉冲表示现在是零位置 表示编码器转了1圈,可用来记录编码器转了多少圈,从而知道运行距离 VCC 电源线- c$ ?" N- `1 a( q+ w1 R GND 地线7 Q( F$ b; _! L3 F ) Q6 v5 u6 U6 E- N/ y' H1 x+ R% ]
4 V1 v4 L/ y( D8 c 编码器线数: 编码器的线数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,说明这个编码器转一圈对应的信号线会输出500个脉冲, A B两相转一圈发出的脉冲数一样的,不过存在90°相位差 线数越高代表编码器能够反应的位置精度越高 Z# u3 E, c/ ^& s" P# ? 0 [$ R$ k8 r4 w& C 编码器原理:' P( S) T* n- z3 p$ k* r, R 增量式编码器有两个脉冲输出,A相和B相,并且两个相位永远存在90°相位差。 如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、并且可以根据AB相脉冲信号数量测得速度,位移等, [( p/ M; }8 A! {! @$ T/ E# B 编码器正反转:. y: q9 x) A) ~' B" W7 }3 \4 P& F
9 W9 z s/ C$ ~ 正转的时候信号线A先输出信号,信号线B后输出 A相超前B相90度 证明是正转 0 C. R8 e K2 j4 C 反转的时候信号线B先输出信号,信号线A后输出 B相超前A相90度 证明是反转 STM32定时器编码器模式 3 n3 ^% ]5 h- _$ r! X* }
/ f/ E9 w, Q3 z) c+ U& ~ STM32的编码器模式共有三种:* ^7 r- {4 O3 n1 a5 Z8 u % ]" ~* C1 _+ {: v8 C 仅在TL1计数(A相) 仅在TL2计数(B相)8 @: m" }9 v( b$ a8 @3 L 在TL1和TL2都计数(A相和B相都计数)- w1 k( K |1 }+ H8 f 仅在TL1计数(A相)8 b3 m# n/ O( s, R/ L3 O5 \% a' i5 k % {# Z, O- U! Y: R- p
, R9 [4 H8 s( C4 E, w* M. j TI2(B相)为高电平时: 1时刻: TI1(A相)下降沿, 则向上计数(正转)。 ! @, U, H7 S3 B- u4 X' c9 q/ C 2时刻:TI1(A相)上升沿, 则向下计数(反转)! l! a/ W. A; d" {1 x) Q9 K T $ l: b( [2 a4 A% z TI2(B相)为低电平时: 3时刻: TI1(A相)上升沿, 则向上计数(正转)。 ( t# h) a/ v0 f: v: [ 4时刻:TI1(A相)下降沿, 则向下计数(反转)1 f' O0 |6 m9 A$ u 仅在TL2计数(B相): J( e0 w/ W! I; q: D
8 [) U; V2 l) ^0 j+ u$ G9 ] TI1(A相)为高电平时:2 W, ?0 L) @5 D; j$ H , E! F: a E9 n* H r 1时刻: TI2(B相)上升沿, 则向上计数(正转)。9 q4 N; J% q" G1 J! O _ ' P" y9 B# w( u 2时刻:TI2(B相)下降沿, 则向下计数(反转)* F1 q- P1 q, R( r1 z% X/ F4 I TI2(B相)为低电平时: . }* {6 f% k9 s, n: T8 x5 U 3时刻: TI2(B相)下降沿, 则向上计数(正转)。. ?4 C+ F8 p# r |* H1 I4 J 7 Q+ ?" @9 H, i7 [6 R2 g6 f 4时刻:TI2(B相)上升沿, 则向下计数(反转)3 s7 e5 h1 R6 f# T: }3 | ; e; u8 k O9 L) f$ S 在TL1和TL2都计数(A相和B相都计数) * f' R0 I4 u! M% p% Y2 h: f
; V7 D- f) s- H 一个脉冲信号周期完成4次跳变。精度提高: G# r; G1 C7 q8 ?' \, d7 k 1时刻:TI2为低电平,TI1上升沿跳变,计数器向上计数;5 ^# j& R) T* `; ]7 w ! E( F; \% z- M 2时刻:TI1为高电平,TI2上升沿跳变,计数器仍然向上计数;7 Z( O5 w+ b8 j, R' O& t 3时刻:TI2为高电平,TI1下降沿跳变,计数器仍然向上计数; , q3 j" d5 \% v% y( p+ ] 4时刻:TI1为低电平,TI2下降沿跳变,计数器仍然向上计数。4 k& h7 y \# |$ R 9 Q+ r) A+ p& _' L- \ / J% X5 Z) h" _5 f+ K- R4 ^ 毛刺:只有一个相位脉冲 过滤掉 编码器转动过程中可能产生的毛刺过滤掉2 h3 ]; A; |' ]9 X7 W ! J) K3 E; o4 F, R' x! y- q 计数器向下计数原理相同 看图即可很好理解。 计数器向下计数:1 e: K- C! C( j4 t- U9 n + i9 d: U$ W7 h) v' F+ ^) e A下降沿,B低电平 B下降沿,A高电平* p% J( o4 L, V) y/ E2 X! V) M5 s& D! w4 C B上升沿,A低电平; s! \+ S) F% ` ]2 P5 J A上升沿,B高电平8 r& j, x0 ]2 Y 注意事项: 1.需要增加测量的精度时,可以采用4倍频方式,即分别在A、B相波形的上升沿和下降沿计数,分辨率可以提高4倍,: e( d4 s) P8 A 2.如果只是测速,不要求方向,那么只需要用单片机随意选择一个信号线就行了,,然后定时器边沿触发,检测脉冲计数即可" x1 w1 o* r% t! } 3.一般是定时器的通道1和2才能作为编码器输入口,对应编码器输出的两相。 4.GPIO配置为配置为上拉输入模式 5.一个定时器做一种工作,如果你配置了编码器模式,那么剩下的通道就不能配置其他模式 6.两相计数模式下, 读出来数需要/4 一个脉冲信号对应四次计数 编码器配置标准外设库8 \: {( I! O& g! T TIM_EncoderInterfaceConfig,它就是编码器接口的配置函数。简单的只需要配置该函数,使能TIM,即可实现采集编码器上面的信息
TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。0 d' |, h, h s6 ?5 o" w, z& L ! z' p* y+ k' }. Y0 Z8 T9 f TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)。 0 s; ^* [6 u& s9 `+ r, X TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。1 N* R' |3 @. n H + P+ A- o$ M- J/ Q 相关寄存器配置 ● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)7 }0 N3 Y$ r4 C4 U" S$ N- q. h% u , w/ n7 J; N( B1 b8 e$ r6 v ● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2) / d, ~' @- Y* } D4 c4 p ● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1). U5 ?. r+ U0 j% ]+ m3 D/ M! w ! E/ b s' ?: L- O6 _ ● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2): c8 j$ X- L$ |7 D+ I ( n& D! D7 c8 [1 V ● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效)., K( N! e9 E, a8 n ! ]8 [9 o8 l) f' h+ l, i3 W ● CEN=’1’ (TIMx_CR1寄存器,计数器使能) ( a: j/ Q/ u8 z 如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011 $ P* n: S" {; M 编码器模式功能: stm32f407中定时器1、2、3、4、5、8提供编码器接口模式 可以对输入信号TI1,TI2进行滤波处理,数字滤波器由事件器组成,每N个事件才视为一个有效边沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域设置 也就是可以设置每产生几次脉冲才视为1次有效 各个值的计算: 转速计算方法:用捕获值(一秒内输出的脉冲数)/编码器线数(转速一圈输出脉冲数)/电机减数比(内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比 没有则不用除): V, X3 b5 S8 O% [4 x 运动距离计算:输出的总脉冲数 / 编码器线数*编码器齿轮周长; A, e* J t( x; b 3 u/ b: [8 K9 X/ K1 U# S 所转角度计算: 输出的总脉冲数 / 编码器线数 *360 或 溢出中断次数*360+当前计数值 ! N8 x6 w+ p( `! ^ 转动方向: 方向在定时器CR1的DIR位里 dir=(TIMX->CR1 & 0x0010)>>4; //取方向标志位0 |! |9 ]) D# Q0 A if(dir > 0) //向下计数 else //向上计数 9 E& o; v' ^9 f; s 那么我们直接看代码:: \9 K3 ~ U6 E 定时器初始化设置2 J* \% r4 X1 ?) a/ l* H$ z+ a% q
重装载值: (编码器线数-1 ) *4 因为我们是两相计数,一个脉冲信号4次计数,所以乘4,保证转完1整圈才触发中断9 k0 x9 {& r, a) h . o0 N; d2 }& w# ? 中断设置:4 P6 A3 f6 O- ?% m: L% Y. X) r ; g0 P0 _0 y& _1 M% j, B6 t$ ^
各个值的计算:# ^4 p) q% U% D3 J# d& | 4 z! p) ^$ @2 [3 m8 F5 L' h 脉冲数: TIM_GetCounter(TIM3)/4 3 C6 S4 D2 k) z2 C9 Z
" ?/ b" w' t' k2 y" p8 o& ?. b1 e ' O. `, Q5 E0 w$ g7 U0 f |
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
2025软件工具兔哥知道
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 一个基于TIMER事件的中断响应话题_续
经验分享 | 一个基于TIMER事件的中断响应话题
11张图学会STM32定时器!
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
微信公众号
手机版