|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。2 \1 o% j8 g3 t# c! f' t# N3 q5 h
, j5 w5 I1 B! J
void TIM3_Int_Init(u16 arr,u16 psc)
! c, S( Z6 F' y9 _( t) a) V( S' `{ M) R* P( l& E9 v( {5 v
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
3 m8 Q5 S% Z0 }3 `. v A! w# s NVIC_InitTypeDef NVIC_InitStructure;" f2 ^2 B: u, ?# Y% {* r- {. ^; }
3 e& h- p4 T8 A
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能: e1 T, e+ S% _: [
8 U8 Y* V8 r. R% o+ G% h8 C
//定时器TIM3初始化# D9 T: H5 E3 a; G3 z5 s5 N8 V
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
O0 [3 ]' X. e- P* Y0 F, S! t TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值2 }/ u' j+ B' l! i4 H$ h
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim7 C5 b8 q% ]# w* m T4 z
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
1 N3 B: E& i1 o5 G- d TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 ! X4 k+ l/ B& @9 H# N/ \2 S
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式" e0 m3 x& `) Q0 H5 ]
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断1 X: X0 y0 l# O3 B
# K+ C' y9 f( u, r- h5 G0 v! f //中断优先级NVIC设置
/ J5 U" r0 i( ]0 y$ p# M NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
p; m1 z7 W1 f NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
/ b' G, z* U. _$ d NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级' i5 h/ d* I4 ?( n4 j0 B
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能) _" a% K n# x3 r0 [9 F
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器) Z5 g* f- R8 b: C5 j8 x# o: [
1 c0 [5 O2 i( g% o1 J
//TIM3_Encoder_Write(65416) ;
; S, _' I$ c0 |+ u
; E! i- @* E9 q: {3 ]; P TIM_Cmd(TIM3, ENABLE); //使能TIMx
/ K$ A$ K0 V0 C% J/ P}5 M, M* n$ O6 K
7 z/ e; |8 N% _$ f$ r
8 v6 ~# `3 x# d: ~3 Z8 f! W! N ~1 i: c, ?8 ?2 [
/**********TIM2_Encoder******/
4 \& O N/ X# k% R, U, Y$ C, g/ r- Q" n
void TIM2_Encoder_Init(u16 arr,u16 psc)
. j0 d. }. [9 k9 [! K9 d2 b{
/ g0 _9 {4 @% V, H& J Y TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;6 J! G. u9 H. N: C
NVIC_InitTypeDef NVIC_InitStructure;
7 P1 ]6 `1 N+ A3 [' E1 i TIM_ICInitTypeDef TIM_ICInitStructure;- X( _3 {: a6 {& |0 ~$ I6 }
; b5 ~* J2 S, I8 k. ]
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
1 }: Z, ?8 y+ r w4 R- Y. }! N$ r
8 x0 D4 c& T. r3 A1 v% r //定时器TIM2初始化
" H! W( A( v# O0 y& I1 k- X TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 / H8 _7 I3 a) F& }( M/ M
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
3 @! c1 W6 t* u, T" l TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim n. t7 T# L+ D# w7 i
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式/ `+ g2 q0 g+ |6 e
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: n% o V/ O4 C2 r
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
+ I% [& j: s5 i& k4 j9 ]8 p! |
' D6 [2 L- ?/ J- R* A7 U. N( @. q TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
! z. {8 [: c1 E; `8 S- h9 `0 B" r TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
( _; k' _* n7 h* B) {6 n3 r. Q. l# \ TIM_ICStructInit(&TIM_ICInitStructure);
5 u* G7 n! }# [" }* Q TIM_ICInitStructure.TIM_ICFilter = 6;
3 b3 s2 @' f, O* V: e TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获: B3 E6 o0 N3 A: s2 p) V; t; j5 H
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
9 S( }: @, t. b$ t TIM_ICInit(TIM2, &TIM_ICInitStructure);
& u5 y( k4 @4 @+ B5 v$ t* W //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式4 ?+ x; P! E3 K2 d. T5 V
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
& U* ?( q( ]3 p# f, g2 p; J TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断* g" S7 y! D3 G2 v* N
//TIM2->CNT = 120;2 `8 D* I& h8 R
//中断优先级NVIC设置
2 c0 m- E& J& B- V8 y NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断" r& ~) K9 V0 j
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
0 J, d, j4 w' { }! U9 P NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
5 x: `7 ]9 ]2 Y/ \/ u NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
/ E# @0 h: h9 U+ _6 y+ h NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
- J/ b3 |7 ]+ V) X5 d; o e
# Y0 z! U' Z0 x4 \. O //TIM3_Encoder_Write(65416) ;
5 X' C+ F9 m# o3 D
$ G: A/ W$ x: C7 u) L y. d4 S TIM_Cmd(TIM2, ENABLE); //使能TIMx - W$ U& T `* v. o. }* d: m$ H
}- R0 X7 w! k8 |# r
% a3 c" Q" G, K( J7 i& O$ n' o
5 K) }" n5 z: [8 U; \+ S//定时器3中断服务程序# @ b/ {$ X$ [: n0 q$ ~
void TIM3_IRQHandler(void) //TIM3中断! j- q0 J2 B- K+ T* g
{
1 ] B' A% V/ T2 m. Y" V! Z0 `4 c if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
( o& m3 M) B% i) H! E8 F; f* y- W {8 V- r) q9 L% ~6 J2 D; {4 v
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 0 j: C( Z4 _3 w9 j! G
TIM2->SMCR ^= 0x8000 ;
4 o/ ~) D" m1 ]( y2 b+ T8 @% X/ V1 v- ]. I5 g
EncVal = TIM_GetCounter(TIM2);
% L, ^8 A* q. }# ~3 d' h7 a5 |1 b+ @& ^/ F1 k9 f: X
if(EncVal>=240)) s9 A6 { ?5 L; S; O
{
! h, T4 C5 L5 F0 u EncVal = 240;
. E# J# F9 k' W+ I }
, R6 B$ g6 W$ w& V2 r3 X# q LCD_DrawPoint(i, 5+EncVal); S1 `8 V5 o0 E$ l U7 S. H j9 B
if(i==320) }6 D, [- D/ t+ h* ^1 J
{
6 W' i( _2 Q. L; l9 H/ k i =0;
0 k3 D2 F* n& M1 H. V% }& [ LCD_Clear(WHITE); 5 @# J" e; u# w0 u0 y. z) F7 l& s
coordinate() ; //横坐标 : \/ k, z6 ^4 b# s N
* [0 ^1 E6 |0 M6 I! p0 m2 E7 Y/ N( Q
//delay_ms(50); : U, S: \/ K: ?1 C p# v! C
}
; H# Q! \+ p0 m0 h' q i++ ; & n9 A' y7 T2 ~" w) S
TIM2->CNT = 240; 3 Q' V2 [3 P1 i8 Z& |; i, T
Frequent() ;
3 I& J) U- L6 u" t4 W* r& d4 X //fre = 1000/(90 /(720*100/72)) ;
! @& V. ~! r2 E$ ` //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
4 h& U z8 w. A5 n5 c* _ //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
4 ^& d) o$ U6 y j/ a //LCD_ShowString(200,200,200,16,16,"EncVal");
/ Z9 s( h0 V* ]2 e! e1 Y LCD_ShowxNum(250,200,EncVal,5,16,0);
" X( d3 B1 t' n/ k printf("%d\r\n",EncVal) ;3 }. B3 u! C! z2 Q
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
) M1 Q( ?1 s. F' }- q; | }
; D, c; g' ]( l* f( @! R# l}9 F7 t {& y- [6 F
; h" H. ]+ r5 C8 ]7 v( W
|
|