|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
3 w) J9 o( E! P) K# y1 H0 \+ b( Z& T( d" i2 d9 w8 ]7 ^4 g
void TIM3_Int_Init(u16 arr,u16 psc)/ ~! K0 G8 x3 T$ @: P1 m4 A1 x
{
6 i8 H! L: U( W+ D% }3 p- k+ X p TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; f. t& o( O) e. z# y* S2 x0 B# h
NVIC_InitTypeDef NVIC_InitStructure;
' v; }6 S0 |, |$ K; t% m" ^' ]% M) `4 E v. O
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
; T R* N9 _) ^$ l
' H; ^# {- y- r& d |; f8 h/ Y //定时器TIM3初始化
! U1 U* ^5 T! ~- I$ b+ I TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 6 i# N8 |. I% ?( [! @
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
$ l! y# d" g" O; ^ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
7 \# r2 U4 F1 k3 S+ H TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式( G# }( A+ p# O6 y
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 4 F% Y( B3 Y% L; H" v5 a
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式) C2 J& O' e5 l9 k! l0 Z A# N
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断+ F: ~! P6 I3 m1 G- J1 W& F$ z
$ m; d7 O. P8 M% n* I
//中断优先级NVIC设置" p! H" z. v5 h0 q# @( Z, {3 ?
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断; {, r9 C( {2 u, W7 G7 l
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级7 H9 s; v: l* _" D% K( a
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级+ _( q# l4 B( e5 O$ X
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能7 N+ k( w/ ]4 A8 a# p+ Q2 A: T# i
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器- C5 n% x* z, B% X
* V) `4 C7 a: ~; @
//TIM3_Encoder_Write(65416) ;
" P' P( ?2 t" J2 V# s7 X- @) Z & _ V6 {. c& ?* F( z
TIM_Cmd(TIM3, ENABLE); //使能TIMx
. h7 {$ v: Z4 o- J}5 q7 G/ x! K2 z) u+ g
1 j/ ?8 b) |6 K# z
6 \8 d1 d5 d) s# t% l( S3 g
9 H. I+ _% x( S2 K! F8 t+ G/**********TIM2_Encoder******/
" Q3 z+ O: x }# c X# U5 T. q; A! v
void TIM2_Encoder_Init(u16 arr,u16 psc)8 M. `- a# c% \& H+ x4 w* E
{
3 M9 c4 k$ l7 ^4 d TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;, s0 b9 a' y$ r8 g6 [
NVIC_InitTypeDef NVIC_InitStructure;
, O' _! `5 Y% W `" M$ E1 y TIM_ICInitTypeDef TIM_ICInitStructure;
, I3 p- M5 h1 [! B! Q
) x/ u& t- \0 B* m2 C) \6 [; ^ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能: F# z( g0 q! o( q: o& {
8 V' O+ }7 `7 W+ \7 s. e% h //定时器TIM2初始化) f% K5 p3 W; \/ f8 H' p6 e
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 9 [* e, t. A7 T" ]% U
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值# h+ E. c% |" p/ }
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim' q# x; n' p& k3 o8 q
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
0 J- M) b3 p7 p. t: W6 b TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
& P, A1 _. t( D% P //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值+ [1 \0 o% F+ j3 V+ o7 h
3 f! G. F* c" L% a: R! I( W. T TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,% c! Z7 d5 D1 t9 V
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
U4 ?) p' m+ [* O+ d7 b TIM_ICStructInit(&TIM_ICInitStructure);
9 E _( X' M/ B; ] w q! r TIM_ICInitStructure.TIM_ICFilter = 6;, _9 L- F8 M8 ]+ D. R
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
: g @6 i# x2 ~+ `: N- z TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
+ p l" A5 @+ f2 q& y( t TIM_ICInit(TIM2, &TIM_ICInitStructure);
5 l { e; j% `' \ //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式 I. e; Y$ h4 H7 _
TIM_ClearFlag(TIM2, TIM_FLAG_Update);) C- D2 Y/ f# \% F, P9 Q3 f; e
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
6 `! p* K+ Y: A7 o$ [ //TIM2->CNT = 120;
7 n' U/ E/ z; H' d' T2 r" v //中断优先级NVIC设置
" Y- L6 c$ V$ t* Q$ \3 S NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
- E6 E% ~2 [2 ~0 r. C3 O, m8 j- S* f NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级$ `$ f/ K. E& s+ X) r/ e
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级8 ?+ d. R0 n+ } l
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能# H# j6 \' f8 G
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
0 _8 |# }2 T2 p' c* o y& I9 ~9 T; e
4 ]1 M9 A* ^5 U1 _ //TIM3_Encoder_Write(65416) ;
+ J a! D) X# h) z& n; L$ H 1 d1 y" M9 M/ C5 B" H; z
TIM_Cmd(TIM2, ENABLE); //使能TIMx
: _7 G# w5 _) u* J8 d}
0 T4 u3 V, \) M d! {
+ x3 q9 U, b, j6 @! f7 z
/ K- W- _( C- y) d9 R5 f//定时器3中断服务程序
% h6 s+ ?5 w% k6 {- t2 p, k7 N8 B; pvoid TIM3_IRQHandler(void) //TIM3中断
c' U6 D4 D4 Y) O3 }{
' \/ W, h, ]# A5 } if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
2 y# g, k3 ^' e" L {
~6 H4 {9 G% s2 W6 D, P TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
2 ?" T: W; P6 C8 j! g/ W5 k TIM2->SMCR ^= 0x8000 ;& Y! b* r2 O1 h/ r
# H3 N. c Y1 [8 R
EncVal = TIM_GetCounter(TIM2);
. ?; D% k' z! {& d
) n! V& B* N8 J ? if(EncVal>=240)
! K+ }! @: e, s k% F" d$ D1 e% q {2 e9 ?$ L# ~6 n5 V- S% l6 D" n; p
EncVal = 240;
/ A* H# A5 Z" ^ }
5 u% k3 M8 W2 W8 s. t' Q LCD_DrawPoint(i, 5+EncVal);7 x' r6 F2 K4 X
if(i==320)
+ B: Z( }* V( f9 {# b4 w1 g {
& o" W3 \+ p+ W4 O i =0;0 ?9 f* I5 M" y4 }7 i* h
LCD_Clear(WHITE); - Y: i$ H' k& ~: n) f
coordinate() ; //横坐标
) ^' x( k, m* u C
g# d. }" m; ?$ S+ u& F, }( @ //delay_ms(50);
, n0 c* U2 B4 I }. [* s2 W) l: F; ^
i++ ; / k" d) g5 _& d5 b. D9 y m
TIM2->CNT = 240;
1 K+ B+ {+ |7 Z* J7 T4 N" n Frequent() ;; [# A5 E9 ?) [+ h& U# o! s) E) J9 D+ _
//fre = 1000/(90 /(720*100/72)) ; ! W, h7 ~2 v3 B2 e$ B# l+ `: D& z$ L
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
6 g ~+ O( f* @, d) H) A7 } //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
% ^2 a/ S& n$ E, U, k //LCD_ShowString(200,200,200,16,16,"EncVal");: _) H- x: B2 |( p
LCD_ShowxNum(250,200,EncVal,5,16,0);
. q$ R' j% y7 x8 S0 o2 ? printf("%d\r\n",EncVal) ;. x- v% B+ r- z
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
- H. I6 Q5 n- X& w }
8 N2 C# t* k+ W8 ^. S}
" z) h' [+ u+ V8 r$ u8 u0 U! \" @3 Q; ], k
|
|