|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
2 y; a( Q, r% ]2 }2 I( j& z. q6 c- f( F& O5 ^
void TIM3_Int_Init(u16 arr,u16 psc)0 O: q w' z* o5 I
{8 w1 |% L6 R9 L
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;. U" v, a; J, E0 z) T6 l$ i) Z
NVIC_InitTypeDef NVIC_InitStructure;1 ]. w) h! H i" ^
9 J: ?1 J' B9 Y% t& C8 E
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能/ w6 L- _6 O9 |' ?. r- S
& t0 u/ `6 u5 o6 Y //定时器TIM3初始化
% W0 c9 l \. A* G" h: m) v7 b TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 % L. N* g/ F- f- j
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
, S3 t- A0 J P& b3 o TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim1 h7 B7 H* U1 s/ C; H! E, k
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式' N- d; K( L7 f5 g a
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 * e3 E9 a2 F& A3 h/ R9 F. R0 j
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式. T7 f9 Y4 _. g$ `8 r7 F0 e5 o! O
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 a/ |8 D$ ?) V1 Z
* f/ `, n1 T* K: U4 t x$ F" B* a' N
//中断优先级NVIC设置( c! ~; F# A+ L( Z7 O0 `5 P& _
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
6 F; P- j+ \, x0 \. ^* ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级. V8 v$ N. k, Q. u/ L [' h8 d
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
7 n; [$ I# `, B, i6 c% `" d NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
( }$ g! O& v8 B NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
% f& w& H$ b7 o: g
# w$ U7 @6 k3 c' h- c //TIM3_Encoder_Write(65416) ;
" k4 }- T0 K/ H7 G 9 `# w7 S: @" H$ [4 H0 ?+ ]; i% \
TIM_Cmd(TIM3, ENABLE); //使能TIMx
- ^) U" w! M6 c}
2 O8 q/ d% G6 [. r# n9 h& W
' k; F' }. ^4 ` K/ n& z8 g
0 V9 B5 {3 {0 T3 v1 q& K6 z
/ Q* u6 \6 Y v* @7 _/**********TIM2_Encoder******// a8 R3 z9 q `. ^
1 e( D' u( f8 s1 q# ?+ G, p4 N7 r
void TIM2_Encoder_Init(u16 arr,u16 psc)
Y1 ^0 t- K0 W$ n7 e{6 C+ y: G( J% F [5 _( Q" o% B7 ^
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
4 S0 Q- C' [) g. m+ W NVIC_InitTypeDef NVIC_InitStructure;
0 J- V% V, m: _1 C4 k/ C/ Z1 n% K TIM_ICInitTypeDef TIM_ICInitStructure;% M F6 @# C. Q0 O
. y7 l% _6 T" x- W- p% X7 N( K7 v* Q# `
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能' Y+ t0 ]- w# a6 t+ G9 _6 Z
" o& X% p( ^, l3 e0 j$ m //定时器TIM2初始化+ d2 f( R: S- n
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
" b2 ?0 N1 P$ O4 M5 r TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值( T7 s, x! _: j/ `! B4 y$ M
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
7 C8 G* l, d6 a TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
5 ]+ S# h' n/ f. z \9 S* _) `$ H$ ], @ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位- W2 ^) |5 ^1 ]4 F8 ^; `1 T
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
3 E+ M9 A2 r4 T7 _9 F, X' V% |, H. b
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
- o5 e; |! \4 A$ v- o6 z TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
6 o; m, P: u# M5 i TIM_ICStructInit(&TIM_ICInitStructure);
6 B( ?1 N' B- v5 [ TIM_ICInitStructure.TIM_ICFilter = 6;$ M3 b4 n, n. R
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获; {) V" E' i3 m2 N
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
# y v0 T" F0 ^' m6 P6 R4 ] TIM_ICInit(TIM2, &TIM_ICInitStructure);) a" a! g+ y; L5 O
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
2 F% I+ q1 l. e$ @ TIM_ClearFlag(TIM2, TIM_FLAG_Update);9 f; U$ s. K; o0 Q6 g
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断' X$ f; u! c) V8 O$ x
//TIM2->CNT = 120;0 V/ _) p2 Z* P; j. V! A9 d
//中断优先级NVIC设置: l' `1 ~' C8 T
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
9 q9 ~0 I" Z5 y/ H0 e NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
' q1 _/ H8 ~+ j T2 N f9 D NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 l* v* R+ I( ? R' J' o* Y
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
, b$ I8 S% v5 b; _+ ]$ X NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器; T$ D! X( ?+ W0 E( r2 X! u
3 j1 r7 {( J+ x; a$ z1 K //TIM3_Encoder_Write(65416) ;* `3 U( B% K8 h
/ H0 w$ ^: f2 K( x
TIM_Cmd(TIM2, ENABLE); //使能TIMx & g, Y7 o- U- C+ }3 _
}$ s" P9 [: v, [8 D
6 N) ?) D9 ]* g7 ~) q3 g5 M p% X
4 `3 A5 L+ D5 G. p# R0 i//定时器3中断服务程序7 i1 Y$ | A2 a- n" @
void TIM3_IRQHandler(void) //TIM3中断3 b3 |6 ]( d$ |" Z1 M% q# O5 q; K
{. i/ W P& Y7 O9 u
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
; v j+ n: I9 Q1 J' X {
6 ^! v2 ^% e* L! m) {# z TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 6 @$ S8 Q( b* M" `
TIM2->SMCR ^= 0x8000 ;
. Z1 s4 v4 y9 l( u) q
+ e5 N+ F) [7 q. R EncVal = TIM_GetCounter(TIM2);
) \7 }. @2 a/ y7 }5 i1 k/ U$ d1 a: R: B3 J& c6 W: Z# ]5 C) h
if(EncVal>=240)! Q6 e% A9 }" n% B1 t
{
" S% P$ D: ?: q* j( a EncVal = 240; ) p. ~+ K" u1 S* A- g
}- n4 D y( T& M
LCD_DrawPoint(i, 5+EncVal);( h" n; u/ A0 V8 b% m& J. W! D5 n' t/ r$ [
if(i==320)
7 [! r* M4 B6 P2 @" O { * Q, @$ `! a( i
i =0;0 o4 g" |# r/ C, L
LCD_Clear(WHITE);
: e7 a1 J. E2 W0 ^! X6 C+ K9 X: A+ ? coordinate() ; //横坐标
$ p$ ~7 Q+ a; c1 f
7 q- w) J0 C# T' | ^ //delay_ms(50);
" v( V) Q1 R& i }
% ?/ d2 R0 I3 Y- ?5 E& \! A2 [5 _ N% K i++ ;
1 D% t- W! ]9 {( C. M TIM2->CNT = 240; " @( F& Z( P' j5 r: P
Frequent() ;
* i/ B# u) s L2 n6 B7 w( o4 g //fre = 1000/(90 /(720*100/72)) ;
' _& c* B7 W+ X- p) n //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 |9 {* \9 f% @( U- w //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
3 O) x5 x& o7 {. v" D //LCD_ShowString(200,200,200,16,16,"EncVal");
! s* m# K: A* Q X8 d LCD_ShowxNum(250,200,EncVal,5,16,0);8 o. q: U# v/ |' z" k* }9 ~+ V
printf("%d\r\n",EncVal) ;
# L" k3 M- ^5 P/ S TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值) Q+ {: t/ E4 r% f) ]2 P% r' H3 z% b) j
}: C: _( P% S: s" a% T; ?
}
4 f* Y) a( M1 o/ [% u- N; ?
$ ]0 U4 T+ T/ V3 G |
|