|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
6 b' i7 t) ^. A3 z% \& P8 P0 |8 Q2 q
void TIM3_Int_Init(u16 arr,u16 psc)6 W% i2 t7 o) k! `3 _3 A) L+ I0 ~+ d" d! X
{
( u; `2 M/ B _+ z TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
% I& w8 j5 \7 }5 o8 m# X$ Z8 E NVIC_InitTypeDef NVIC_InitStructure;, v6 Q9 Y; u/ W" t- n4 _6 H) I
3 h& h2 G) _ P7 [ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能9 J% W1 X m W2 r! R* ?4 {
9 }# g0 H3 U$ y7 E8 I0 [2 V9 c8 ` //定时器TIM3初始化# h; N& O4 p4 ^) w. g- t1 x( \
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 0 ]- T% t- i) X0 A) x B9 h! [
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
2 ^% D; p) w; `8 ^& B2 F TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim$ V. \8 j c0 M: o9 a) s7 |
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
% r& k n- I8 K- M' l TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 . p Z* M$ \& }1 G8 Q) R J
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
$ Y3 V- `* L4 K TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
1 F3 J. M) `( j( s+ r4 W$ A8 d- |( w. }( z3 R( ~
//中断优先级NVIC设置! C* I9 }& ~1 E4 ]& W' _( p
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
1 N. B: b- p0 ?0 N NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级. s9 m6 @- p6 x. q' z
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级# S1 t0 }- k0 k$ u% F) X m
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- s+ t4 A7 ^; q, ~. l2 f( `5 N/ P NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
; q$ W6 f! Q8 k4 d' @1 b8 D% ], A1 z! c/ l
//TIM3_Encoder_Write(65416) ;3 y+ {1 }" p& N
- N: H, d# E$ G TIM_Cmd(TIM3, ENABLE); //使能TIMx 3 j' r# A6 Q3 u* k, Q& c1 b" W& D
}
) o$ p: m& L! v& ~
0 Q+ h: w9 {1 D9 n5 K/ r2 c& ^2 C) b
. `- i# ?( G% L. b$ u0 Q4 j* N2 G
4 o( b0 p1 p5 w4 d Y/**********TIM2_Encoder******/
0 z0 o% ~8 M, c. x# y1 I# }6 {) u/ ]3 _- h# {0 V
void TIM2_Encoder_Init(u16 arr,u16 psc)
8 A0 K/ h7 H% y: N{% j% g4 ~# T F
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
! A' z) G, C* r6 V( z/ f# B NVIC_InitTypeDef NVIC_InitStructure;
. b w5 ~, I$ K7 R( o- x TIM_ICInitTypeDef TIM_ICInitStructure;
" K3 |# o O5 g" \" [/ Q% ]. X7 J" \& O4 y( H- P1 K3 S0 X' l) G
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能6 N# x* s$ P1 D+ G: m
?0 P1 Z; E8 {) x* i& }& @ //定时器TIM2初始化7 q% s: P" m0 p l# g
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 1 F5 \. w: t" l. [1 P
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值' l* ^9 C$ m) [+ Z
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
! q! F4 u2 K8 Q TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
0 W. R/ v. d& r$ f' N x8 c TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位1 C2 s, _& T, m& F# ~* ?
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
6 d9 l3 M5 r2 g4 j3 Z5 E7 B9 E" Z7 L1 Z* L" a
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,
1 [' |5 N8 z/ r$ C1 K TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);; Y) j- h/ W. G0 Z
TIM_ICStructInit(&TIM_ICInitStructure);
" Y2 M) @1 C0 i G$ `- E TIM_ICInitStructure.TIM_ICFilter = 6;- Z( ]( q3 d! n$ W8 |
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
& s) R9 Y6 |) R* t& K E TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
1 M6 ~1 h! `1 x TIM_ICInit(TIM2, &TIM_ICInitStructure);
% M% ` ]2 k' ^$ J% {. b //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
7 ^0 \) e$ ?# ` TIM_ClearFlag(TIM2, TIM_FLAG_Update);
. D6 U2 z- ~, y4 L% d9 Z TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断* P' E v) `6 ?) @- G8 w
//TIM2->CNT = 120;
* s& Y' q* s" J' E //中断优先级NVIC设置3 E4 u3 h) I% X ~$ H ~
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断/ J) m. z4 I& f: O" Z4 ~: H
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
7 e y: b. z# |. E$ E NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
3 I, [! H% h+ Q% I4 p9 ^+ l _ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
, n# s3 C! t) l6 h( Q NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
3 q1 H0 p& T% B0 a
* {3 d3 g7 t/ B2 G' a //TIM3_Encoder_Write(65416) ;- y+ Q3 o4 K T6 U! z: D" k
9 D& x6 ^ D `' U TIM_Cmd(TIM2, ENABLE); //使能TIMx . Y5 O6 F, Z; u: `" }
}
( B" p6 t! g' J0 E M. C4 X
2 j) s3 `( x+ F3 v) D9 y* {9 l% I) m; s3 V. s
//定时器3中断服务程序* Z$ J1 Q! S* }1 {+ F: Z4 Y1 {% N
void TIM3_IRQHandler(void) //TIM3中断
9 y5 G8 H7 y% N- ~& E+ ?1 {, [{
" m6 g( a; }6 J- u3 l: ^, J5 r if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否5 k0 v' L0 Y( v
{/ t: Q' n- {' O2 X. u( e
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
) i7 l: }3 u c2 s# S: I* W: Q3 W TIM2->SMCR ^= 0x8000 ;
5 H" f6 i3 ]6 W" `3 A& t8 b3 Z
; I0 c* w) }4 L* d8 q- f EncVal = TIM_GetCounter(TIM2);% ^4 p# C5 a: C4 g* K3 \6 r
% E% P5 i2 b. I7 N' s% B6 p
if(EncVal>=240)
$ ]3 u( ?5 Q4 u4 k- L/ r3 Q; H {
" G. U# Y* h: ^+ h# M EncVal = 240;
4 E+ W/ ?# ?( ~- I8 b }( o# [1 y: B5 J
LCD_DrawPoint(i, 5+EncVal);
7 n r4 E4 B. ^, p4 p if(i==320)
9 x0 Q6 l2 X* {% }5 [ { : v, \: N8 e# `) {, ] `/ M
i =0;* J$ _$ k, _) M7 U7 M2 B
LCD_Clear(WHITE); 2 e# N* z# |9 r
coordinate() ; //横坐标 - r$ g- b2 Z, U# w) I: m
! Y7 m# k1 j i: `+ i
//delay_ms(50);
5 @7 c8 _5 K* o9 v: T8 \0 b3 V# K }+ r) T& p: Q: B5 X, X$ b2 J
i++ ;
( k+ z* t5 u4 a/ ] M x TIM2->CNT = 240; ; g- ?/ O3 [* m- E" k
Frequent() ;
* j0 V# V2 F6 N% } //fre = 1000/(90 /(720*100/72)) ; 5 P6 z/ v( L1 R5 r1 D c% {
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
" L6 g: d; j) w, ^9 ~ //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
( V" _: C% P4 o" M" h //LCD_ShowString(200,200,200,16,16,"EncVal"); Y+ z" q( J9 Q- ]9 j# [2 E' M
LCD_ShowxNum(250,200,EncVal,5,16,0);
) Y" g& z. H% p) N printf("%d\r\n",EncVal) ;
% d/ m* h# C' h# h* d/ V TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值! U3 ]% C% x! C+ W
}9 i" H/ B; d1 j: o3 j8 F% q5 L
}
) S9 W% X/ ~) F. i) j' ^0 d1 {1 w! S8 k4 b2 F X' _; C
|
|