第六章:STM32CubeMx定时器编码器模式基本使用方法 前言: 增量式编码器在实际应用中还是很常见。stm32的定时器带的也有编码器模式。所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号。AB相根据旋转的方向不同,输出的波形如下图所示: 增量式编码器在实际应用中还是很常见。stm32的定时器带的也有编码器模式。所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号。AB相根据旋转的方向不同,输出的波形如下图所示: 第一步:具体配置如下图: 重点说明: 一、如果编码模式设置为 Encoder Mode TI1 and TI2 则会默认检测AB相的上升沿与下降沿; 每一个上升沿和下降沿都触发计数,所以每转一格计数器就会+4;那么上图计数周期设置为400;也就是编码器转100格,计数器就会置零,重新开始计数! 二、关于Polarity参数:这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检测AB相的上升沿,下降沿还是同样会计数的。 第二步: 可以根据自身需要在NVIC 中断控制器中配置中断响应优先级。这里的配置方法可以参考前面几章! 第三步:代码分析: - static void MX_TIM4_Init(void)
0 m' h! A: s3 Z/ u/ h2 n- w - {! ~2 C+ c; X' O- I, I& P& @
2 y. b c5 U4 }! y% Q- /* USER CODE BEGIN TIM4_Init 0 */" a4 v" ] }9 V* p' U, _
7 ^9 j) p7 Z) P$ F* j8 L: a2 w; b' y- /* USER CODE END TIM4_Init 0 */% O" I6 n$ k) J4 g) r
3 \6 _3 B$ t% S W+ a- TIM_Encoder_InitTypeDef sConfig = {0};6 |7 a9 c9 {3 \3 V
- TIM_MasterConfigTypeDef sMasterConfig = {0};) G6 V D; @0 w5 y4 }
/ F2 K7 G- s0 O, f! g7 U @; J5 }- /* USER CODE BEGIN TIM4_Init 1 */
. o1 s$ `3 f+ ^! G+ q% j - + Y0 X# d( g! \; P
- /* USER CODE END TIM4_Init 1 */
4 ~- [; a9 A/ s3 P# Y9 ? - htim4.Instance = TIM4;% o1 w( i' K$ d1 h# m
- htim4.Init.Prescaler = 0;
. v: h: f1 n2 A - htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
/ [/ L3 ]+ Y8 J+ G; o - htim4.Init.Period = 400;9 e5 ?$ [+ O; l
- htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;% R# t2 B7 r% H4 [7 i" J( Q) [% ]# L0 e) v
- htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
: l. u3 S- T, D- {4 q - sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
2 B* D; m" j" k4 t4 V( F9 r" H - sConfig.IC1Polarity = TIM_ICPOLARITY_FALLING;
4 D2 f) T8 x" u0 l k* _2 M9 E) n - sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;# a$ |8 U* I9 p! W! ?! B
- sConfig.IC1Prescaler = TIM_ICPSC_DIV1;* s, a% p! |8 O% {! Z$ S
- sConfig.IC1Filter = 15;
9 X5 u, [2 {' \' | t/ x; v - sConfig.IC2Polarity = TIM_ICPOLARITY_FALLING;
; Q3 |# Y2 x% ~( ?5 z - sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
: q4 M- ?7 C/ t& g - sConfig.IC2Prescaler = TIM_ICPSC_DIV1;- W9 _4 q3 S2 t% Y9 |
- sConfig.IC2Filter = 15;& j* w* o* p) Z/ H( \8 s- e5 `; H
- if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)4 E) V5 e: Q1 \1 s5 l) H- s: p
- {. i& C2 W+ N7 b6 m
- Error_Handler();
% n7 N: Y4 {, T' u q - }. y- t1 [" Y* _' d. W
- sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;' U1 `) m- c9 l2 l
- sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
, y( q3 H: {" } - if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)- j7 M+ ?4 l0 r K4 z. |. q! P
- {6 b3 v& v+ @ k1 r O& {4 J+ T
- Error_Handler();
) |. D, f8 G" k4 a v - }
+ G$ t- \ N4 A6 R - /* USER CODE BEGIN TIM4_Init 2 */4 I( l# w9 J$ @$ ?) S- V+ k0 d
- HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL); //启动编码器接口
9 l' S, x! f! {! S$ W0 Z4 y- t - /* USER CODE END TIM4_Init 2 */7 O4 M1 K3 D8 X: V' N7 }
- }
复制代码- //主函数里面调用计数值
" K6 c+ i8 U+ T8 S7 x$ {4 A( C - while (1)
3 ~& Y6 j, a+ V) o1 }: |$ V - {
. @0 c* _' E6 b' r) L - // Enc_Count:获取计数个数
( M4 t$ Q: ^. c! _8 | - Enc_Count = __HAL_TIM_GET_COUNTER(&htim4);& h1 o6 k( z& x& D( M! a
-
l$ E; m1 {, E - //若需要检测编码器转了多少格,记得要/4,因为转一格是+4;
( X& Q6 v+ T! G) `3 M8 c) [ - //Enc_Count = __HAL_TIM_GET_COUNTER(&htim4)/4;
+ ]- g1 M0 B; t1 L) f! o! m - 0 e9 Z% b& z6 j. }+ @7 C
-
( h: R3 F+ T2 q3 F0 T - + |; }, q& }0 q0 l+ A5 _
- /* USER CODE END WHILE */$ R0 a: z: Z3 @% i/ E. ~9 Q+ z4 E5 V
- X) Z! }# r3 g8 f9 ?9 I- S
- /* USER CODE BEGIN 3 */9 N, o2 a( U; Z* ?
-
4 p) s- t2 O; Z& d- s) h) ?+ b - }
复制代码 文章出处: 电子爱好者 # \+ j3 i9 Z" [
|