我的硬件连接是PA0->TIM2_CH1,PA1->TIM2_CH23 Z4 b$ n8 h A% L7 ]6 y
需要注意的是编码器需要接上拉电阻,下面是代码
# g4 z0 q8 ^3 Q9 t) s c5 v9 h6 R
- GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量
& Q+ j; }+ Y1 K& H; d* @2 p1 E2 v - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义一个定时器结构体变量. u% C) g5 N f! k
- TIM_ICInitTypeDef TIM_ICInitStructure; //定义一个定时器编码器结构体变量
' f' t8 I$ K9 p
/ j3 {7 @# r1 U- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟5 {! j W& S/ \; z% s7 c' D* B
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器28 [5 E6 h+ j, M+ ]( w. Y- Y! e! R) K
- : H+ c0 @2 {+ y$ S% }# C) c
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //配置PA0->TIM2_CH1,PA1->TIM2_CH2/ r" o, w7 E: l5 X7 b' `
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置50MHz时钟6 f* j% a5 c3 i5 {
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置为下拉输入模式
, g) |/ D2 N% k" u' N- { - GPIO_Init(GPIOA, &GPIO_InitStructure);6 N0 u4 C; E1 M, p" X' J0 s l, r
* {. W+ c" c! s- TIM_TimeBaseStructure.TIM_Period = 0xffff; //计数器最大值 * b- a1 I! T. ]& E5 c$ Z& o/ K
- TIM_TimeBaseStructure.TIM_Prescaler = 0; //时钟不分频
2 k5 P$ c% O% [; }, y9 Y8 m - TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 使用的采样频率之间的分频比例
+ y1 I9 u! E. d2 Q7 |; Q - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
6 V$ m: t' d P8 R/ T - TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
7 O; ~& ?9 q; T7 F$ A - & I2 ^8 ?/ S+ y a
- TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
) ]1 C9 N; E$ V$ s+ } - TIM_ICStructInit(&TIM_ICInitStructure);+ E$ i0 T# i' ?6 W% B' T* F5 y
- TIM_ICInitStructure.TIM_ICFilter = 6; s3 R, }4 F& g9 c p. G; l
- TIM_ICInit(TIM2, &TIM_ICInitStructure);/ E5 g. h1 j4 }- b0 I; }; h/ Z
- 3 j8 E0 S1 b; v p' h( [
- TIM_SetCounter(TIM2, 0x7fff);9 g. ]! F: T2 A+ Z' l4 d) Q& _' p
- & G# }$ |( _7 K5 [
- // TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除定时器2中断标志位; E3 y7 T, M; L. d! |
- TIM_ClearFlag(TIM2, TIM_FLAG_Update);3 J; v# g- m0 Q+ X) K7 N0 D) ]
+ c/ j, |2 |* n% A" G. v5 o; d- // TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开定时器2中断! z& z7 q9 M1 k+ s- a" L
- TIM_Cmd(TIM2, ENABLE); //计数器使能,开始计数
复制代码
+ U x& ]0 S ~% i2 P( w) |; i获取计数值- encoderCount=TIM_GetCounter(TIM2)-0x7fff;- T7 M# s" i& h, x( H6 L5 _
- TIM_SetCounter(TIM2, 0x7fff);' S! }, f. L. y5 R( c' l: W. h% [
复制代码 " A8 P, m% O% N) ~* f7 A+ X
减去0x7fff是因为区分正反转,正转值为正 反转值为负 |