|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
8 _% m1 N# ~& J% v: h& D- ^' @5 X2 Z. W2 c- [" N9 b6 G
void TIM3_Int_Init(u16 arr,u16 psc)5 J1 r) g) B& z3 e
{
$ Z# w0 o/ ]2 v2 n TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
2 |" i# E( H5 B* ?- a* o- O& \ NVIC_InitTypeDef NVIC_InitStructure;7 [/ \ D' ]) I1 f) m
3 l* D& h4 A. ?8 I" }% A
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能& K u1 G {7 s6 f D
) J/ I7 @* b2 N //定时器TIM3初始化
. W3 g K. M! f4 y$ R# s* L TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 ( t: t. a! E4 O
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值8 I& a, I" X( A5 j: N( _
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim+ \7 m- p3 Q, W. j$ \7 G
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
$ P1 P: f: Y& \# O TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
# V; `: k! Q8 ? z- l. B// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
w2 D# W3 ]* h# o( g p; c9 A4 ~ TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断4 e( w2 e' j+ S6 i
. a5 C; {! b x+ C/ O7 B
//中断优先级NVIC设置
8 ^( s, h5 \) _8 J* { NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断, K0 K( s: y- Z1 F/ V* T
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级4 r2 H6 X- i9 a6 w
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级9 \' i9 m) G( S, C$ C
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
/ Z: ]0 R1 Q, |' b NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
0 A6 f+ @( W* s' D: |( T, l
1 \. ?3 B; A1 {- l //TIM3_Encoder_Write(65416) ;
|1 a: T4 |0 f5 r
7 T9 `3 |- V2 o* K# J/ n TIM_Cmd(TIM3, ENABLE); //使能TIMx
3 q2 m$ s& Y* B( h* E}
; m# n4 V1 A7 [0 l/ V7 P6 N9 q, f" O9 S
0 n& X2 q& h8 i) ]' m* v+ S4 j
2 P9 y4 ^, ]$ b. p! @( k
! n# }2 }3 @* D% c3 d/**********TIM2_Encoder******/9 h- K, p* E( E
7 e8 |5 \) D' Z
void TIM2_Encoder_Init(u16 arr,u16 psc): A/ U( M9 X9 h' f0 k: u# `
{
- j7 i: u T C TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
* T2 x3 g( L; I) S5 h% _ NVIC_InitTypeDef NVIC_InitStructure;
2 \ W5 H: u( }; H9 H1 ~% W& x& h TIM_ICInitTypeDef TIM_ICInitStructure;
5 {; w/ M ^; G: V# S) J% `# r
; R3 ~" [- }8 @3 j. ~- y RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能 ^. r) G) p' n0 g& [
2 B: n n0 T& v8 Q: v0 ]
//定时器TIM2初始化# y& P1 S% ?! ~
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
# J' E* A: z: _9 ~& w TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
0 X, N' j% B+ |* F TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
) Q% a- K% e u; B" y0 b, `% } TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式+ A2 I V) N Q& z/ i, ^ g
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: K9 q0 M5 r! B* U
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值5 _1 D" k- A' q1 c* @8 b1 j. j. e
& ^) `, A8 T) G& J7 x2 @
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
& v6 e$ K& ?$ T7 b: _ TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
2 F' Y" D- g0 s2 j7 O6 n# H TIM_ICStructInit(&TIM_ICInitStructure);; y/ L" ]" P2 k. p) }
TIM_ICInitStructure.TIM_ICFilter = 6;9 n% u( ~( X% z' H; h. K. ?
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获4 J4 `; |& l: y# O
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
4 _8 b- @& D3 ~0 i5 l TIM_ICInit(TIM2, &TIM_ICInitStructure);: d, T7 P3 `, L: j7 G
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
- n5 I1 b+ B2 _$ W TIM_ClearFlag(TIM2, TIM_FLAG_Update);( q) s+ J( N5 y- x0 g% Y% `
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断- k4 K5 W3 K6 u) @3 B3 j
//TIM2->CNT = 120;9 Z) r& [" d) a; ~" g
//中断优先级NVIC设置
8 p: q8 ]$ C/ j4 G% q8 _ NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
" r, M4 n( `$ O8 P! l4 \* W* | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
" z9 G9 _3 [# W; ?, _) W2 i NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
$ k- m7 m. Y0 p! j9 _ y4 c NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
; ^% z! }9 {* o7 C. o NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器- e8 G6 |$ ~2 `3 ]1 M8 T
4 z3 s& E8 o. N) H //TIM3_Encoder_Write(65416) ;
3 b3 h5 g$ z4 c7 @ 4 u" d2 V4 W3 T: b( o5 m* x
TIM_Cmd(TIM2, ENABLE); //使能TIMx 8 w; [6 q' R+ M$ D1 ^
}# ~. O+ Z( S$ I% o) N7 i1 d/ W
5 ^0 U' h2 O& S0 W( {
6 G3 \. \* R5 P* R//定时器3中断服务程序
5 V F& z: i% ]/ Yvoid TIM3_IRQHandler(void) //TIM3中断
: x; g ^ w# A0 S8 u2 w1 C{
7 a; E5 S( t \- M { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
+ [' _# Q- Y4 p4 m+ \5 E/ I% F {
) }7 ? C# K9 A/ q( g' X TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
( A+ t1 { ^! e TIM2->SMCR ^= 0x8000 ;
, v8 |' f5 N# p8 X: o9 a8 b7 a
EncVal = TIM_GetCounter(TIM2);* l" u4 j' M9 Z4 h
! p3 Y$ d# g6 V4 p8 v3 S if(EncVal>=240)
, E# [0 ?- c: U) R0 D/ { {
" U* |$ \- p- U& Z; j# \4 T9 s1 w EncVal = 240;
* A% Q, M1 l6 l& U$ q' _. k8 y }9 Y8 e$ ^ D2 n4 Y' h$ ^) S( [3 n% l
LCD_DrawPoint(i, 5+EncVal);
' @( o k; K- b7 V- u% }& @ if(i==320)
) `. b% v% C1 E. { { : o ~+ g5 m5 P% Q8 B* }5 i
i =0;: C, y. Z5 V6 H1 x
LCD_Clear(WHITE);
" x [1 N* _% ]: P coordinate() ; //横坐标 9 @% \1 j* i, v8 M% T
+ W4 M' ^& h- ]* c u3 X+ k //delay_ms(50); ( l% f' \' x2 t; P2 ]$ S
}7 u7 ^, V3 B, V0 Z+ l
i++ ; 2 d2 P( h4 M% c8 p J* Z" J
TIM2->CNT = 240; 2 x. C* T' O2 S! x3 Z% i: y
Frequent() ;
# _' Q; T$ U* b2 A# L! [* O //fre = 1000/(90 /(720*100/72)) ;
" k$ M" ?& A( e2 n0 V7 |9 G( k8 F //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 ^- S/ O' B. M) z) O5 F9 W //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
6 h7 w! Q- H) Q$ X! h //LCD_ShowString(200,200,200,16,16,"EncVal");$ |, z) l# H/ R8 L' g+ R
LCD_ShowxNum(250,200,EncVal,5,16,0);1 j$ |% X8 {! Q3 g% ?, D- k- N
printf("%d\r\n",EncVal) ;" D6 \* M$ w @; Z. Y
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值2 G! L; `' Y# p* j
}
. }1 B6 G3 K/ c; I, a1 J}
- C- L+ O' J* B, a9 N' t% @+ [
) k: ?& T6 F4 C) a& ~0 a- M$ ^3 O |
|