|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
0 n4 A" Y1 r+ q
( e6 Y C' N/ N$ evoid TIM3_Int_Init(u16 arr,u16 psc)- ~$ o$ E( q, g' U$ a
{5 H* [/ z& s5 a
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
+ }& |. ` P6 b9 D( S7 y( v$ p NVIC_InitTypeDef NVIC_InitStructure;
% r; [" z8 _) Y
6 K; v0 h+ Y, |( j6 ~6 u; `4 c6 X RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能; T& [ c, ~8 M
8 g& B y$ H& \' A& P5 n" E2 R
//定时器TIM3初始化
/ W2 [( T4 x' \' C- ~& ~ TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
$ C8 j" X; A4 C2 A! G& u9 W! n TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
# Y u" }5 {8 n% D) y4 \, } TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
% s; W% _% N/ Y. l4 F TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
0 `) Z$ t7 R; P TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 9 }" d7 h# b& i9 E: s
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式, Z& B% Z9 [3 N, E% D
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
. s1 j% J8 |. E. G# \" x. u, s* O( n+ v6 O1 s" j' J, C W1 ]
//中断优先级NVIC设置
5 @( j! \# u4 V. \$ S5 f6 p( v NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断7 l* m; J' H3 N! P; I8 f; {* F
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级8 R' I# p3 T- T: [' C+ p' K L
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
. {/ a5 z6 M+ P NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能$ g2 k1 Y* Z, h7 R7 z# L
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器# ]) S, V8 Z: w: Q, t8 ]* i9 c) ~
" M9 z5 x5 T/ y5 w& \6 p# o
//TIM3_Encoder_Write(65416) ;
! ]* P3 Z" @3 z( D
0 r1 Y2 u8 y% u% j% q& J X9 a TIM_Cmd(TIM3, ENABLE); //使能TIMx
" T3 Z7 x0 y8 j- b}7 x4 M- Y2 ]5 U7 x# l9 y
- G% z7 P$ I% ^4 o; E& x. L+ I) r- V0 @8 W1 g% W9 k/ `
9 y/ m$ {; C! ]/**********TIM2_Encoder******/% z5 `# F. y! G9 X; `
' d' F( S+ [5 ?4 X% Lvoid TIM2_Encoder_Init(u16 arr,u16 psc)
% o6 A' i q9 b{
8 P. i( I3 g" @ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
8 I3 }; G" k0 b# O2 {# P NVIC_InitTypeDef NVIC_InitStructure;6 W* B5 m5 c, _( [/ x" H4 u! N' A
TIM_ICInitTypeDef TIM_ICInitStructure;
% j" M( r! u# ~2 z7 M3 }: s2 L! g
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能, R4 Y/ e) X# j9 v& i# U9 d8 T
; n, \0 C- d: t
//定时器TIM2初始化& j& {$ [" B: |7 ?5 {5 ]' [/ K
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
' v" b O4 {: ~ p) j" [ TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
; b4 l( g. T# M TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
0 [9 O! {4 [8 ^, {4 a TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
8 d1 a# t) G0 N/ Y6 x TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位, ], ~/ G& Z: |+ ~: K) i: u
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值5 \% f! Y& ]$ M* v C4 H6 i$ `
i/ Q/ ^4 H* y0 d+ ~6 k+ c TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,( \! J' I0 \' h. K# Q8 s+ x5 z: o
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
; {3 ?! a2 r. ~ TIM_ICStructInit(&TIM_ICInitStructure);
. h1 |0 c4 }- n4 c8 }% M: ~: v TIM_ICInitStructure.TIM_ICFilter = 6;
- V3 ]' d/ n. |' j TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
. u' G3 b! R6 ?+ E# S" Y# f TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
, B$ A% K5 n1 P8 G$ t TIM_ICInit(TIM2, &TIM_ICInitStructure);9 i, k6 A9 @3 h; H5 h0 h
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
% m$ Z) M* Z4 R% j3 M- H. f3 D6 f" p TIM_ClearFlag(TIM2, TIM_FLAG_Update);
" a% [ Z; H7 u/ |6 g TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断+ P6 f( ]/ x. E, l2 ?
//TIM2->CNT = 120;
6 [! F- J9 Y: R //中断优先级NVIC设置5 j& B& l1 V7 i4 \# [
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断9 c, X7 [9 E# m& O) Z
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
$ K) b2 o9 l9 R3 O, E5 V NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级4 L0 c' u) C m( j: ~* ?
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
W9 j; M7 d/ P B6 @ NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 y5 @" P- R1 S+ r4 Y+ A1 ?. ^
8 r7 \1 O) ^9 z0 n9 a- X9 @& S //TIM3_Encoder_Write(65416) ;
1 y9 n+ e& g4 ]) O 4 ]+ c! S0 z/ j* j% E
TIM_Cmd(TIM2, ENABLE); //使能TIMx # m0 d8 d4 P1 E% x4 A2 w0 m+ G( t' Y
}7 ~, M" o/ H9 ?& K M `8 E! m8 l
( `$ X& v* l: X) a. i! W2 i
3 W, x/ m3 Y7 X' a/ C8 K//定时器3中断服务程序 u& k' y" g. w2 h6 P
void TIM3_IRQHandler(void) //TIM3中断
( Z/ i) f1 }: G n# j' Q{4 ~( {: _* r4 @* K' E
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否7 ?1 S, p" p f @# T6 q+ ^
{
+ C# o6 T* t1 ?, E9 b1 p8 u$ |1 ~ TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
( A* `; S9 p. N/ ]5 ] TIM2->SMCR ^= 0x8000 ;
2 F5 g$ k2 _5 Q' W2 C- x% |# r2 v! f& _2 d% a8 W p) ]% ]6 P
EncVal = TIM_GetCounter(TIM2);
5 ]' ]$ g7 d- B; Y+ L( B2 t6 a: J% M4 |4 g% g3 g* I( Q
if(EncVal>=240)# T# M4 r' R# h* t- O
{' s3 [) e0 M+ U, s7 \, e
EncVal = 240;
) \6 r1 {7 r3 i1 `8 ] m }3 w" ^# |5 ^# p0 {0 z3 @8 n0 J5 [$ R
LCD_DrawPoint(i, 5+EncVal);4 ~& h8 R! }+ h! H
if(i==320)
8 D! P4 t7 l7 c7 k* k% V5 X: T {
7 {6 n2 w( c. m2 F. o6 a* p i =0;
2 R# G3 @; @3 Z _6 o2 v: a0 g LCD_Clear(WHITE);
a" u. H: S$ ~$ M coordinate() ; //横坐标 Q" e B4 U8 j
6 a: U6 l' A9 M
//delay_ms(50);
* r% }" H& c7 t# f; B# E }7 l: w' Q( X1 M3 d1 G
i++ ; - _$ m5 I! U \. q* ~ w; ~
TIM2->CNT = 240;
. v; K7 e# b7 S' W; v7 K% c4 Q$ K3 c Frequent() ;
2 d: m8 }8 z0 c! h //fre = 1000/(90 /(720*100/72)) ;
2 Z# M% m0 D) P9 u //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
; o1 T- n# N0 _9 [: g3 J' x" c* S* l //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);4 T8 h: m6 E& P. ?- N9 V. H
//LCD_ShowString(200,200,200,16,16,"EncVal");3 A, q! g8 e6 k* |$ @
LCD_ShowxNum(250,200,EncVal,5,16,0);9 X9 @" ~% \( e" X
printf("%d\r\n",EncVal) ;% n+ B! k L. l
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
5 _1 t% Q8 b- N( ?% m( D }. R* Q9 k1 S2 S A! w
}* H" v7 z6 }* {- c; f6 \
4 W6 \3 L9 q$ U
|
|