|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
1 j0 f0 ` q4 q9 K
/ T- ]: M6 J# _1 d+ g- F' Xvoid TIM3_Int_Init(u16 arr,u16 psc)0 ^: s% g' C3 f" z
{
$ S7 b( q! A! o$ ?* b( S' G2 s TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; j# {% \: |" G
NVIC_InitTypeDef NVIC_InitStructure;
5 @3 u- F' i4 \! y
5 t2 {% [. P9 e4 ] RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能7 [) F4 Z( d) A! N5 ]. U
4 U$ U% `: P2 J! C. N
//定时器TIM3初始化8 g1 y. m! Q% Q( t. f; V! D
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
+ V$ u0 {; w9 v% h7 k' j! I TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值) p6 b$ N) ^. J5 J, c
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
0 M# A0 ~* i, M/ M; t1 _- C TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式: _+ A6 ]+ V( d& X) P' S* Y8 o+ A
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
1 s% A- I% O- F% l/ S1 N3 O// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式. I* P) s3 H a) w4 h
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断* a0 J1 H* r% d9 U3 s+ q& f4 A
9 l# Q6 p3 m# i& m
//中断优先级NVIC设置
0 s/ x+ U [8 g4 T NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
0 X6 f9 Z8 B8 \5 r G4 l& p NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级) x# ^- C3 v3 T; h; u0 D
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
, a6 C/ ^& c# x5 f& d Q0 }; h NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能6 e4 l& A4 H+ A+ T3 S! E- W
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器% f( M4 r& o6 ?% R+ M! {5 E
. ?! z+ p- K. Q2 I. w9 s
//TIM3_Encoder_Write(65416) ;
* H% Y2 ?4 _7 j
6 Z# P- R% X0 F* y& {( ^ TIM_Cmd(TIM3, ENABLE); //使能TIMx 9 N' T& y1 b ? O+ d
}
1 v) x1 @. w3 n) L( [% M' U6 W9 }! W3 F# ^0 t2 U
0 u1 R- x/ l' [, ~
E2 g7 k4 q) E# | |6 L) U9 H/**********TIM2_Encoder******/
4 O/ u2 h3 `$ b
, C, J: S. Q2 E6 K* R Bvoid TIM2_Encoder_Init(u16 arr,u16 psc)3 O" l& A$ }, {9 G7 B" `
{6 o7 g" L; J {# e3 y+ X
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;0 W, ]3 W+ A3 B: S0 E+ _& W+ K
NVIC_InitTypeDef NVIC_InitStructure;- y, |4 w' E2 Y: [ D$ v% L! j6 @
TIM_ICInitTypeDef TIM_ICInitStructure;
, _+ I" M# H1 J8 d& o/ j# y& u0 {. s2 D
$ L0 T8 b1 J5 u: ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能' h- S! r/ n6 S% R7 M
* k6 N3 x) z2 c* C
//定时器TIM2初始化
& _. b% m9 }: Q: k$ { TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
9 }1 V% V' y' T% U& i TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值# K: B" h9 M( E6 A3 H, b
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim% t+ N5 B3 Q/ w5 m: |
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式4 O. P9 u/ v" w5 h) S6 z
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位1 u) ~0 O% n! `3 X
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值( q! X' D! g2 s1 i5 M
6 Y/ L: H; T8 Z8 U+ e1 U. k
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,: K) e, d- D& `7 _
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);" j: C5 i6 m% J& _8 X( B
TIM_ICStructInit(&TIM_ICInitStructure);4 F# {2 b" B/ V! W% i
TIM_ICInitStructure.TIM_ICFilter = 6;
8 O# u$ f1 _4 o9 h/ } TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获# a* y$ u h9 H5 h! X3 }
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
2 h6 _ L& I3 {3 R TIM_ICInit(TIM2, &TIM_ICInitStructure);
. A' S; V& w' J- X' Q, y: W7 H //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
H4 b1 o8 `, r0 r/ f& } TIM_ClearFlag(TIM2, TIM_FLAG_Update);
2 c( t' F* q4 }2 ^ S6 _/ F6 t- A TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
5 P( }9 m( \8 f3 s; d+ n6 j; b //TIM2->CNT = 120;
5 L5 _3 i5 i5 m$ f+ Z7 r //中断优先级NVIC设置8 J/ \( G. n$ d: i9 n/ n7 ]+ }
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
3 \) M9 S/ ]7 E5 p NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
8 X: k+ B& G! D' p1 W$ H NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
* o8 T0 \& V. X( m1 F* f, O _ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能7 k: z% _6 E" T& J, L9 {0 L7 ?3 t
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
$ c7 j% |2 d& F) F' @' l$ I6 @* w; k0 }( T. G
//TIM3_Encoder_Write(65416) ;: c* Q' o8 q2 S7 i o8 O
- u6 a3 a8 r) Y8 N$ O4 H
TIM_Cmd(TIM2, ENABLE); //使能TIMx
; Q4 u3 q5 C% c% x}5 P' @/ V0 c( h9 [% e: s
' r7 D- u, J- `- o
6 N5 q% K, o- \" K$ s# R5 w. K
//定时器3中断服务程序' E, [; }$ k! x3 ]/ o: V; B
void TIM3_IRQHandler(void) //TIM3中断
( H7 D6 W, Q2 v3 i{7 }: ]4 p. u4 ~+ H" b
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否- C" p- I) v% J2 ]
{
- G7 f: g% f0 j9 ?. Y5 D TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
+ z5 |4 K# H" [3 y TIM2->SMCR ^= 0x8000 ;
' f; t8 p4 y2 Z4 \0 P& X! A# R- Y
EncVal = TIM_GetCounter(TIM2);5 F; c6 A5 \* T% I1 p
$ s4 O% U* O1 U& u* e
if(EncVal>=240)
4 R) X3 X' x7 V4 D {: t- w; W! o; e. o8 ~, {, o
EncVal = 240; / r5 I. l. b$ k/ D6 Y. v& U! c; N
}
2 n) B. Z' I3 _0 q. f9 m& D LCD_DrawPoint(i, 5+EncVal);
' }- y3 t! n% j6 Q if(i==320)
1 p. O* l6 C6 M* ~* _- D7 ^* [" ` { / E" w% @8 i4 U4 m2 I
i =0;8 r: G9 o3 `3 t% K; W! p
LCD_Clear(WHITE); 3 V1 s7 L; {9 H9 K0 n
coordinate() ; //横坐标
# C( s. T$ ?6 r& x" U; I7 |7 a # R0 ]. J4 a0 c6 ^, M1 p% S
//delay_ms(50);
0 }9 R+ n( p! ] }: n4 J- |; n7 U% r6 Q8 y$ a
i++ ;
5 j- L* |; l9 v S) w TIM2->CNT = 240; ' [0 b( X' v1 z! B' S W2 q
Frequent() ;: G$ o. R+ K" R$ V# w* X/ M
//fre = 1000/(90 /(720*100/72)) ;
' v+ H) p( K6 t0 s. E: }% l. B8 Y //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
: d: s( F% b. o- P# U //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);6 b: e# o- @5 k
//LCD_ShowString(200,200,200,16,16,"EncVal");
) \+ C. [- F$ V) Q8 e# V LCD_ShowxNum(250,200,EncVal,5,16,0);
) C: R6 x; F2 y+ P printf("%d\r\n",EncVal) ;2 j+ L+ s7 }2 _3 C( I2 Y2 V
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
( z3 _" j# z0 a$ m }
& P d& j0 C F, \4 W}
# l% Z, @7 l) b
% U2 G: h& _! ^4 F |
|