|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。5 r& z; \8 C! Z2 m
( W6 L+ `1 p, {) Ivoid TIM3_Int_Init(u16 arr,u16 psc)
3 j, ]! v: P/ B; ^{
5 f: ]7 @$ d! g+ ] T) r* ` TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;. _5 o/ T f; }8 [5 `! p* t
NVIC_InitTypeDef NVIC_InitStructure;7 _) j: ]9 f7 i) u
3 e5 ~5 V5 Z/ o; D RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能5 R) @2 } Y6 b1 g3 [2 A
3 @; P: @# p2 ~) A# ?$ @2 B
//定时器TIM3初始化) [9 Y: u5 ^* \! N; W1 a# {
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
, s( n5 E p" m* @ TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值0 `' C$ K0 A5 n6 |5 o) G
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim5 N8 V4 I2 p- T, w
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式( h8 c: K d. U: b' n1 c
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 ) s7 ]- q: ], A# h9 Q- m
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式9 D5 m: g/ B- s% u8 R! n
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 i5 w) e! `% W% u4 U
% @8 C9 k9 r* H% v2 ^0 y; @
//中断优先级NVIC设置2 b, F" I* F# J2 W/ k% W' d
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
) A8 t7 J4 N' [ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级7 x, }- ^$ I& v. k& s- G. j
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级3 V! B5 Q8 y/ H( `2 B h- I8 v
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能% [( e0 d6 W5 F2 d4 m4 l: M8 a
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器' c# _; T% L3 O- X
/ y! p- C1 s( O //TIM3_Encoder_Write(65416) ;
% O# M+ s: _5 n L0 J6 i
7 h+ G$ H1 J5 c* |4 o* C, I TIM_Cmd(TIM3, ENABLE); //使能TIMx
* a! M4 E3 ?3 M' u- c8 r- b# i}3 z* i1 [2 {5 b3 F. q
* l W* W0 i3 ?" {4 p5 t+ D
0 m6 }7 H! g& Q* ^0 l0 A7 ?
: y N- y3 U, k/**********TIM2_Encoder******/
. T* N) o% O. H8 F- k4 a9 B; ~8 R" Y1 J" h4 s$ t' _$ x3 [
void TIM2_Encoder_Init(u16 arr,u16 psc)
1 @: o T! l6 N' T1 B{2 g# P7 c$ x! k/ I
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; g! ?+ _1 J/ t6 n( z+ T
NVIC_InitTypeDef NVIC_InitStructure;7 W) g1 k6 i% L2 H% L; x" \; v
TIM_ICInitTypeDef TIM_ICInitStructure;
0 f4 Y# }! j6 e! i' O$ M2 a
6 V. h) k o( J! t RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能" A9 W4 |+ Y- p( T
% ]9 }* m) v% }$ U* N
//定时器TIM2初始化
4 S Q& Q# Z! C9 V, y( Q7 Q3 g, ^( B TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
+ W( R' T0 z7 G3 h TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
& o. U! h2 d: G( n+ c1 j5 a TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( P! F9 z4 c7 y8 }, H6 L, n n
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
$ e, i4 v; |6 D3 s7 y/ r TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位& ~5 O9 ^1 {9 M; `! v$ @
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
9 Q( H! c9 a4 d- k& z3 j
$ q7 Y# v3 }& z7 y- X4 f TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,6 ~" l! Y# B# b% a
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);% S2 E% x- F! q" Y2 v
TIM_ICStructInit(&TIM_ICInitStructure);; n5 I K& d, M3 b( `. R
TIM_ICInitStructure.TIM_ICFilter = 6;! K1 h7 @) L8 r
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
: ]* J5 {# [4 t TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 . v4 I- g8 n* k- _8 H2 z
TIM_ICInit(TIM2, &TIM_ICInitStructure);
5 o- s' j; { Y //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式, t- k7 H7 ^6 ?9 b+ Y) K4 `( O4 O
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
# I+ n7 W# ?" f1 ~' z& K TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
5 f+ d2 p, d& ]( [8 c& J5 @1 u9 W //TIM2->CNT = 120;
6 C; ^/ A, Z3 A3 H5 a: G2 t //中断优先级NVIC设置9 }: N. G7 z0 K
NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
/ ?( h t) R% D, B8 W NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级# m: g; _8 X' e$ D- p7 T7 J( `1 |
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
2 H1 Y2 J4 _. D; |" } NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能/ Z4 G: F) s; `2 y# z
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
1 [8 v0 R8 ?8 t( R9 R' z a) G( a8 q8 A' ~7 [. m$ E
//TIM3_Encoder_Write(65416) ;8 N: ^+ L" y/ N+ @9 }
/ R2 c. u" Q" N; u
TIM_Cmd(TIM2, ENABLE); //使能TIMx
' N M& V- E* x; n4 \2 o4 U}7 O, b$ g: c- F) `! N7 H
2 i8 {1 R/ {- b1 \ X% ?0 a
" l6 ~# X. R! z/ y; l
//定时器3中断服务程序
# r, T, H& i! M2 @ n8 xvoid TIM3_IRQHandler(void) //TIM3中断' d3 A! u2 T8 z y$ l5 o0 p) c( C
{. b2 q, | ~- W6 V; l
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否( N: ~0 u: l; g6 u
{) N' E# X4 w; o" \
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 1 e$ c: J6 D3 Y S; D2 y
TIM2->SMCR ^= 0x8000 ;( r2 X( E x+ b9 H
; A4 p2 @3 Y# b) k* h EncVal = TIM_GetCounter(TIM2);
, ~* ]0 u$ \' y3 }" P3 c6 Y- g* ]8 ]3 J" u% V
if(EncVal>=240)$ x! \: @; v* F/ J% J ?( k
{
# ~0 R1 F2 o( {6 V2 E$ y* a4 m7 M EncVal = 240;
$ {4 m \4 b5 p6 H4 S( b8 R( x }$ s/ z0 k" i; K( l% y
LCD_DrawPoint(i, 5+EncVal);
! R9 m4 {- _ d if(i==320)
9 ~2 V1 l& X# ]* \' n [ {
0 c& d% l$ g- k, |+ h7 s i =0;
2 p2 o8 k6 G9 p4 b/ y% U/ z( @ LCD_Clear(WHITE);
% f6 s5 d5 y( L. e& s, i coordinate() ; //横坐标
[5 \; p3 q) b( v7 w' N
; h% S0 N, e8 V+ W! H4 D/ K# [ //delay_ms(50);
% K$ I$ d9 b X% Y" U+ j }
u6 C, \4 ~& A6 A! f i++ ; ; {+ }1 A+ h, p+ |5 [
TIM2->CNT = 240; $ m- z3 [- S/ ?! X- l. B4 V
Frequent() ;
) M9 i: @. X5 Y+ Y" R //fre = 1000/(90 /(720*100/72)) ;
7 K+ S0 C7 H5 W$ { //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 x2 x$ P( ^" m u' K0 A+ I0 g //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);2 o0 a* E& r1 L
//LCD_ShowString(200,200,200,16,16,"EncVal");
) k* D3 N. f7 l LCD_ShowxNum(250,200,EncVal,5,16,0);
. L' o/ P" w$ p# ], v printf("%d\r\n",EncVal) ;$ Z' r6 d6 n5 [ @: c& h$ o# C9 J1 i$ K
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值! P% J7 v- G$ s( |% v2 ^# D* G; D
}6 K( m: { I, z3 W
}
9 w7 Z B1 n# C X$ S/ Z
6 i; M2 o5 ?* m$ u v2 R$ y |
|