|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
7 ^/ a5 P6 z' P" P7 L8 J7 ]( I: r& S0 C
void TIM3_Int_Init(u16 arr,u16 psc)4 t$ d9 i0 X! b% L0 n) l
{" V, j, X( ?% O7 s/ J+ C7 H! `
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
; t" }- e/ n) ]) R. P. b NVIC_InitTypeDef NVIC_InitStructure;
$ D0 b7 V) l3 X
$ j$ J$ a' u/ k2 O. Z RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
0 i5 ?; H/ P% ~" R/ Q8 G ) i5 F# \! y8 U5 B8 n( |
//定时器TIM3初始化) m8 @* e; D* }
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 & N/ F( a' u; E0 h: T9 T
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
' K' R( N B7 E. ` TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim. v# U8 ]& @4 G( T
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式! F8 B( q" s* P; }8 j& S
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 $ M2 _% N& ?9 ]) F4 W* V
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式/ F1 w7 k/ U6 v$ h4 d* I
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
?3 N: M# K# p( q* i. b
6 D" P$ ]. G0 G5 @ //中断优先级NVIC设置- z/ _5 {9 o' r1 v
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断6 Y: ]5 S& b2 t! \/ s
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
% \# E; I) O, O& [' u7 S4 m! |: g! D NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
0 @8 Z: m& [" { t1 K6 N* Y! G NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能6 h) F( p7 f* P/ c
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
% |9 o/ ]' `8 n9 P
" A* r m: G+ p/ K6 a1 l) x //TIM3_Encoder_Write(65416) ;
2 r8 c4 J% m! c1 u1 Y5 V" b
* T3 t/ V \4 X% n TIM_Cmd(TIM3, ENABLE); //使能TIMx
2 w1 u6 l2 N5 W r}
$ Q+ b3 T' F! z8 L$ m# L: A3 Q6 e6 p# ~, ^9 |( I. r4 M
1 g" G8 f# j. e8 L; K
! M1 l6 E7 k& W6 ?/ `% b! \/**********TIM2_Encoder******/5 `' {3 ]! O* _/ D
$ Y5 p* j) o, P. W! j; Q6 dvoid TIM2_Encoder_Init(u16 arr,u16 psc)
+ F3 G( {, d; a{
: Y4 v8 P2 V6 ~ F5 |3 w: ^ H TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;! d5 l9 _- |" z, |
NVIC_InitTypeDef NVIC_InitStructure;! Z# v! O0 e$ [/ U$ `/ ^8 F
TIM_ICInitTypeDef TIM_ICInitStructure;0 |0 K8 _# g9 n
: J f% y0 ]/ g: Q/ ?- v" } RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
: U P! ^# {- V e' O 9 N! E7 w1 T2 l* e" n) W
//定时器TIM2初始化, z+ }; U: K# m# c! m' T3 {
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
7 A9 h6 `" E6 a* b TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值6 `6 s/ Y& G. q, X: }" v# D
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( ]) E; {+ {: N( A. _' M7 o" L
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式/ J* x7 {5 r9 D5 q! e0 Z+ R0 h
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位. }5 h# d4 n3 H
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值9 _( {- ^* ]8 m2 H- `* I
& j- s# {! j e6 x" b g* e3 j; y TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,
! a5 @: U5 p6 a% X9 x TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);1 @& h5 J3 l) ^) |% O
TIM_ICStructInit(&TIM_ICInitStructure);
' P) v* u: W* I9 F, }5 k; u TIM_ICInitStructure.TIM_ICFilter = 6;: [1 |- y. D$ |3 j
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
+ ?! f; V7 j- T; W5 R% j TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 . s* \: ?* F1 l @# h. N4 p
TIM_ICInit(TIM2, &TIM_ICInitStructure);
( ~8 T. h, M3 G3 H2 O //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式# C3 f/ q8 j- P
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
# ^: W5 F! P O2 |* C$ |. V Q, D! V TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断$ D) i, f, b4 \3 V: |2 K
//TIM2->CNT = 120;$ [+ F% f8 {6 l
//中断优先级NVIC设置
9 q! f5 b% z! L NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断3 O6 ~; I$ g1 G% {* z: t
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
+ E `- ~" V! l2 G NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
; A" | E5 R/ L NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
1 [' k+ Y; E o# A* P NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器, ]& d* Q: w1 L* d& ?- b
5 B+ Y- t5 f/ c+ n3 h; p //TIM3_Encoder_Write(65416) ;+ C* T! j. u3 F" d$ |. I
2 }& I; A' d1 O0 J TIM_Cmd(TIM2, ENABLE); //使能TIMx & S% M- X- W) ^. v
}) e, z7 I* C3 n
9 {$ j* g3 N4 Q- m9 [) u( T) R5 l! l+ U: w: ]$ I
//定时器3中断服务程序+ C' Z. j! K* z! R0 z
void TIM3_IRQHandler(void) //TIM3中断
" C3 X; K5 A4 K1 L{
7 r! Q* h9 f5 A7 P if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否* k ]; n# C ~9 V6 }$ p. n
{- P0 E* C8 h+ p& g# j6 W1 d
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
0 u/ p. M4 `3 {2 _4 v TIM2->SMCR ^= 0x8000 ;. Z7 T& z. y6 x+ o: j( L
8 j% t9 c2 ~& o1 j# Y- A EncVal = TIM_GetCounter(TIM2);) J+ V3 k2 V9 ~ g- Z* f! @, V3 ^
7 x5 _0 `- r( B if(EncVal>=240); b: c$ r8 h" b# l- ?* Q( }: D' n
{
( l6 I4 ]! R$ r2 M+ R% g% _" z EncVal = 240;
! ~& c' q! j; W, R6 q' b }
0 X: ?) B+ `" T7 ? LCD_DrawPoint(i, 5+EncVal);
3 z6 [4 F" C1 _6 V% l1 B if(i==320)5 i! r+ c! G7 i& J7 Q0 W: [+ p
{
9 z/ R9 H& _& x8 [' f3 t! x6 q: z i =0;
, L, Y4 G9 M8 I V: l4 f LCD_Clear(WHITE);
; S2 e7 B2 L! p2 R! e" z, ~ coordinate() ; //横坐标
0 P# k5 K8 l* ?! W( i9 U ' D- f( A1 v9 c1 t
//delay_ms(50); 4 m# Q7 A( [" |" D/ g. Q# G
}* M% `9 `7 _ ~# N
i++ ;
$ }( |: R8 p- ~4 _# d' e TIM2->CNT = 240; - p, O6 a1 [% v5 P$ K
Frequent() ;6 z" b! W" z. x* F' O! z, G- c
//fre = 1000/(90 /(720*100/72)) ; : s+ T6 x' O& O0 G) g) |4 o! g$ h
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
- {: x! D i% i: j/ f7 V //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
$ ~* u+ Z- H8 E: q6 X: y( c7 q! O //LCD_ShowString(200,200,200,16,16,"EncVal");2 h: o$ M; M1 ^: h
LCD_ShowxNum(250,200,EncVal,5,16,0);8 S3 t" C3 p) C! k( z$ C
printf("%d\r\n",EncVal) ;/ Y# B/ ]* l0 T: x" m$ f
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值6 H$ L- M% \/ d5 p, A
}, a" ^/ b o. U5 P! U* M; E+ T `
}
9 E* ~& b5 L* i/ v9 m
. L+ e5 T6 |! b$ J0 s9 K0 F |
|