|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
; o8 J% s) o" F" b; M3 n: [1 p/ z: r( x0 b
void TIM3_Int_Init(u16 arr,u16 psc)
- Z' U h( ~7 b5 B+ E; o, R{
- {1 c# T6 k+ y& ~0 U+ a9 |& N TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6 p' G7 D7 A! o8 [ NVIC_InitTypeDef NVIC_InitStructure;* T4 W2 Y# d) G9 B1 v& y
/ v+ \7 v$ e& P1 ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能/ X8 @1 I; u, o# ?2 c: _
. M0 j, u* \4 a( J& O //定时器TIM3初始化
( v" \0 p; M* `& Y6 Y0 V1 p& k TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
. n3 k6 N2 C+ x7 X6 R H6 b TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值9 o5 j. o* o0 s( E0 W+ y. N2 S
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
' z" A( F) m( O/ t/ e1 Z TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
: J% z7 I& `/ y. M/ K TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 1 X: w' V; C" Q4 C$ C) ]
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
( e' k& Q! A5 M1 X$ d TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断, o% }( |- f! |4 i: G' j' G3 c
' d5 T3 A' j) w4 T' V4 [
//中断优先级NVIC设置
" D3 U& m2 V* M R NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断- U6 l! n Q9 |! K
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级2 Y/ `7 I# C! e5 f. ^- {
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级/ I# G4 b" u8 r. \$ K/ w; M3 m
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
$ T) m& \! _% M) H9 Q% P NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器: y8 b$ X6 D* O) b9 A0 G
' O8 v X' `. ]5 Z2 o //TIM3_Encoder_Write(65416) ;1 c% D* |0 I- H( ]4 {2 m0 L
; ?3 r! j! k) U8 p* v/ D6 n; X5 p& e
TIM_Cmd(TIM3, ENABLE); //使能TIMx
+ Y6 Z- V4 k8 \& c0 R9 J* V}5 f( C' p% Q. x- a8 k$ |
A! w/ N) h" K, k& T- o. S' A& @3 f" @
9 p$ q: s) k* M d# ]# b5 Y8 D
/**********TIM2_Encoder******/, v5 @0 N0 v' g% }& d
, M, [8 S' u% b3 d, M2 M
void TIM2_Encoder_Init(u16 arr,u16 psc)
: l! Z1 v- a8 ^- k" Z{
6 V4 V5 X4 p" V* Z, \. R5 [ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6 C7 b6 K% `* a/ h/ L) T/ ~" p3 p NVIC_InitTypeDef NVIC_InitStructure;: ^& o# K# d. f' p5 \6 m) i" L
TIM_ICInitTypeDef TIM_ICInitStructure;
2 p, x. \/ `/ f' q5 h" K$ U, V: e B C) D
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
( A# e* O) ]6 n2 B* F0 @& b7 l9 G ' U% a( \+ H" a: K
//定时器TIM2初始化8 K4 j% Z4 S1 u8 }. x6 k d2 `; h4 }; c0 Q
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
1 H! Q$ L+ i, L: J$ {3 J0 j1 x TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 i7 V) c, u3 W9 z/ F
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
" S0 @1 b4 R3 i4 D4 f TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式* q$ |1 F" s: H- Y0 R; \- X6 F' Z
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
* a2 I% q6 Z/ X; ~" b //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
* e( r5 O ?% S! ~* ~ E1 U4 H$ I; l/ ^4 A
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,8 ` h8 S7 H7 V# }8 @9 _
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
" R& O! z& E" p: _ TIM_ICStructInit(&TIM_ICInitStructure);4 g) S+ r+ v9 N) J' R/ m! C# }
TIM_ICInitStructure.TIM_ICFilter = 6;
# d6 c; M1 U! A% A0 n# k TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获- J5 n1 N0 V. ^; I
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
3 l' y" ^- w/ x& ]+ `& N; P TIM_ICInit(TIM2, &TIM_ICInitStructure);5 D1 J* ?6 g9 Z- Y0 ~6 ]+ \
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式$ a a- M4 ^& f: F) d
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
* }1 v" o; f1 r1 F TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断- @& S2 n3 x2 N
//TIM2->CNT = 120;
; c& P% b9 @6 k( L: \0 J/ V //中断优先级NVIC设置
$ A. Y- c ^5 j7 v NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
[% e/ ^! g0 U. Q5 o NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
/ `. ]" p6 S& B6 Z# j8 D. t NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级* `* d$ d! n/ p* A& z1 a$ m
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能3 r) k1 e) l' R& }2 k1 ]
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器; c. L+ f' {: b A+ w0 D
' l' a$ [4 d5 j0 o. h- b
//TIM3_Encoder_Write(65416) ;( X5 }$ T: `* ?3 H8 w
0 y1 ?4 E9 K2 V C. z d& k
TIM_Cmd(TIM2, ENABLE); //使能TIMx 5 ^" T5 t5 }# S6 J9 Q8 E/ ?" H
}; S1 P: G* @3 I1 Y
; L" D7 j: c" ]8 c
, K! ~- Y2 m2 Z8 q//定时器3中断服务程序
* K% a: i. J6 s6 [: gvoid TIM3_IRQHandler(void) //TIM3中断
( E0 L' I9 ] f- W. l/ T. h- f{. h# r8 s) h, K4 v4 A* o* V
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否4 ?+ i& M* H7 P3 Q8 T
{
; h! P; Y4 Q/ {( l5 G0 K: ] x TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 2 A' N, D; ]( ?) r% K6 r" t0 Z
TIM2->SMCR ^= 0x8000 ;
; [8 [+ x& u- P
/ |+ Z% h# e! i EncVal = TIM_GetCounter(TIM2);$ C! `. M: `, c
; M2 F9 A& `! {. J1 p4 e6 q* \ if(EncVal>=240)
( q% y* a3 {; }$ b4 W* C {, z+ w7 ]# W; v3 o/ ]8 ^& _
EncVal = 240; + {+ [9 Z: @" S4 i" E
}
, Y' H, i( }: ]( v7 F( ~ LCD_DrawPoint(i, 5+EncVal);/ ?! V9 R' c% d/ t) a) q
if(i==320)
$ E- N, ~; _" q/ p1 ^ b- ~5 X" F+ } {
6 C: _7 Y$ {/ \( j i =0;
5 d5 w, t7 J0 A$ ^! w# X LCD_Clear(WHITE);
2 |9 Y: }6 Y) T2 |8 I coordinate() ; //横坐标
: G" X6 [8 P4 F0 f6 J/ W& E6 x2 r- O
$ ]( l! O q5 n+ I6 V/ F) u. p //delay_ms(50);
/ N3 ]8 I5 S2 f# Z }
% t' b# Q2 E* _ i++ ;
. }' b- b% T2 u2 R2 i( W8 m3 }3 l TIM2->CNT = 240; , N7 D( [' w8 Y' f
Frequent() ;
- X. G: x$ ^ A8 u( p; T4 t) S //fre = 1000/(90 /(720*100/72)) ;
; k1 i) @; _" y- }2 Z2 @ //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。" s! O; P7 { ?3 h7 S
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
h- c% i: e. C2 c. u3 [ //LCD_ShowString(200,200,200,16,16,"EncVal");
! K( `6 A# c% r5 T5 w LCD_ShowxNum(250,200,EncVal,5,16,0);
# e3 B* w# {& H6 q8 q) `* o printf("%d\r\n",EncVal) ;
1 n8 K& }0 @4 R( c TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值# g1 v1 ]) r. I% d
}
+ ?/ t3 c4 w0 }% {# Z" H& U$ z}, b8 |/ i* I4 ~2 f# j8 y z8 [$ l
' w' W5 }$ {2 c* V
|
|