|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。# @1 n& T, m# \+ a: u
; M, i0 T, e% u& d" |
void TIM3_Int_Init(u16 arr,u16 psc)
6 P2 F6 @* g9 ]1 K- G$ g{* T. K2 H3 w8 Y1 G
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
0 C; p- c- u8 G4 d. y NVIC_InitTypeDef NVIC_InitStructure;7 q( `. H/ l& Y1 y) Z% w
% z, e: h- v/ D8 ]6 |8 [ ~( C RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
6 k5 L3 J; [$ n* E3 D, Z$ A& n $ t( p( E; E D+ D
//定时器TIM3初始化
! t G6 g9 D4 t i: o' \2 v TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
& @ {" I! t6 u) V: e TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
5 J2 U5 y) @" U/ |. I# M TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
: w+ A0 d. t/ Q, s! e. r& |! \1 D TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式6 I; w, T$ P! k
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 ! ~6 P! ~* W, F& w
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
: k Z# Z$ }8 b- I* p5 q TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
g) G) q; v4 t- i4 F4 U$ ?3 \ x( Z# M; c! E5 F$ Y
//中断优先级NVIC设置
2 d8 r1 v9 J S NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断. z% w _2 ^$ u$ Z) ~1 C2 X
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
( q9 ?2 q3 g3 h4 G NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
2 m7 ?8 g9 D6 o) _9 R NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
8 W- a) d. d" M: X NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器' ^( x3 I" D! b% j) K
[0 O8 b3 n9 c5 c( c7 Y9 o, h //TIM3_Encoder_Write(65416) ;* _5 |% |# g9 r9 I C) ]; r2 R
0 b$ o! b; e: y% U1 X TIM_Cmd(TIM3, ENABLE); //使能TIMx 0 k+ {4 _2 X7 v6 K9 U
}. x+ _" r/ L9 r! Q; Q! S
* z! e, ~, U' \$ H8 T& i' A7 c
' t8 K3 n% O) [4 i8 d' z3 p; o
, @6 o; M, f4 [, ]% v5 r: \% y/**********TIM2_Encoder******/; y* q1 ]7 W! s0 c, p
4 W# j, d) f" h! }6 [* e8 d& a D3 e
void TIM2_Encoder_Init(u16 arr,u16 psc)
& T9 K4 x% _( @' l V( c+ a{
8 W5 Z/ @0 C& V5 w TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
, M$ D" V* \; f& P( \+ `0 q NVIC_InitTypeDef NVIC_InitStructure;
K4 t- F, H' ]$ c: G2 w k/ U9 P TIM_ICInitTypeDef TIM_ICInitStructure;$ m* J1 r0 Z- P9 B F9 b
" o% ]4 p. i) r8 X RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
# p% M* l& }, O9 i* ?6 K 0 T7 B) k* o- F3 G) z5 q
//定时器TIM2初始化5 s* _& `# o2 z- X7 h2 B2 [
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 ( U3 S% j5 b! s+ K L
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值+ {# R0 ]) r+ o% b9 K# `& G) X* q
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
/ z4 j. R* @/ Y6 z# s; k9 j TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
. g! M5 }5 [1 E" u TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 F7 f% L7 T& z4 @' f) N- u% F
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值 r, b! M. I' a, {! h
( C8 q8 J' W _! w& f* O, ~
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,/ L- I- x0 M/ x6 \8 ^& V- C
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);" o& u: d; K5 W' d1 b
TIM_ICStructInit(&TIM_ICInitStructure);2 D" C. |7 H9 _/ [6 b
TIM_ICInitStructure.TIM_ICFilter = 6;
$ k3 y: |4 }$ }; ~ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获1 x: W: }+ s, z( ~% _+ Y( W
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
" y4 x$ i: [; N$ l, X6 u3 h TIM_ICInit(TIM2, &TIM_ICInitStructure);
3 j0 K+ ]# U6 c' }* K9 G/ W7 \. G6 ^# b- r //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
% @" J/ V# h3 g- }0 }0 m TIM_ClearFlag(TIM2, TIM_FLAG_Update);
, o t* t- f' g6 m& j0 B$ u TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断" j) q* s- h9 l; L
//TIM2->CNT = 120;
" q2 a4 u# p( h& l/ q6 ] //中断优先级NVIC设置2 b! K$ M" H T/ N
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
# ?- D% w) t9 n' D NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级4 u9 A8 F1 k6 ^3 W
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级- z3 ^4 r1 V/ A! A
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能5 x9 \8 f1 J% Q* B' i' h, @7 h! K
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器4 j1 V% o0 f8 E7 ?) a$ F) x# y: T
( N+ w9 C( c: I& w4 N0 p# ]: a8 N# J //TIM3_Encoder_Write(65416) ;) j) A( s+ j7 ~
6 o7 i4 o1 c& K* u) q" r% [ p y TIM_Cmd(TIM2, ENABLE); //使能TIMx ! o# G7 G9 J% U" j; N. ]
}
: Z" \7 S" F8 C F3 l. Z: z
# M) T5 w* I% j. J- {3 g' ^: z0 C# F/ g% y$ l T, q
//定时器3中断服务程序& _* e7 [; Z5 E; `* U; ~
void TIM3_IRQHandler(void) //TIM3中断
: M; t- U0 N1 U9 O( N{; z& t3 r& R# N! l
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否8 L! j" S6 w8 {5 y5 y3 v
{
6 B0 V9 m: c7 H* S; H6 L+ u TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
- r( _' R/ x) r! W) t& j TIM2->SMCR ^= 0x8000 ;
% a1 M8 M! Y" x# j& B( l5 R x5 p. s
EncVal = TIM_GetCounter(TIM2);1 v$ Q: w# S' t
3 f' {* Z3 T2 \ if(EncVal>=240)
, J3 X* L i1 E- s) W {# e6 C3 y# l% ^8 Q
EncVal = 240; + K$ T Q$ n4 j8 e6 c/ X1 D
}
$ @8 U L' n2 X/ b! [5 |4 @ LCD_DrawPoint(i, 5+EncVal);
2 M U/ T, {/ s) a/ h if(i==320)
0 |+ u0 ^0 D+ | {
- c M8 e! `) C- ]' v' X+ L/ ^ i =0;
$ d3 ^' Y6 ^/ E% c- t7 V LCD_Clear(WHITE); 8 ~+ S' B; X( j7 o' u
coordinate() ; //横坐标
4 J* b# Y2 x( `3 F6 d$ P; _ 2 M; x* o8 D+ m0 p7 v) X
//delay_ms(50);
/ O7 g) v" C% o }
0 c6 o) }! Y) T' y) N i++ ; u" x- v; S' C. Z
TIM2->CNT = 240; 4 E1 p; c( ~. z( A8 R# |: W8 q3 r2 j
Frequent() ;. a7 O7 z" c$ O% H
//fre = 1000/(90 /(720*100/72)) ; ; N/ y4 d2 R7 ^* Z: z8 y
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。 ~, [5 _* G# {# l4 `% N- x
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
" \2 ?$ i3 c; F+ q0 c //LCD_ShowString(200,200,200,16,16,"EncVal");( `, j3 E! }$ s
LCD_ShowxNum(250,200,EncVal,5,16,0);
; f; _4 O8 R' B9 I' b5 U6 V printf("%d\r\n",EncVal) ;
5 y4 t2 K2 O6 N TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
; y7 p& | r! h- b }* j' E( k2 v' D
}( M! I0 @# Y' u" l; D' v
% f' C; ?' S0 w! ^ |
|