|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
4 E* F: ]6 N! M+ u/ {# t
: j, c! s0 A7 V; S0 Ivoid TIM3_Int_Init(u16 arr,u16 psc)
5 S; T2 L" z) R4 K5 T! n {& q3 u+ G{
4 ~8 ~4 N" Y L7 C TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
, r( z' k( a4 C+ I+ S# W* @ NVIC_InitTypeDef NVIC_InitStructure;, n7 d5 D) X8 p3 ~8 e9 ?; m
# R K1 m% i0 v+ @/ K% c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
8 X$ t5 u4 P ^ 1 K' r* M% J' b7 ]# Y
//定时器TIM3初始化
, V/ _ K8 y# t5 d8 R3 ] TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 8 Q8 ]% z; Z& E; d6 a
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
2 a- [5 t+ Z2 A) h2 o TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
3 z! c" G$ }, z' i8 ^ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
* T x, h7 t! y& z, @ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 4 x6 O Y( b2 Y( x6 e8 s' Q8 F
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
3 L- [# _4 x W, b, U- H* A TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断& O; _) o2 c9 l. _8 m" p
/ b" P+ G& l! y5 c- w W
//中断优先级NVIC设置
8 u: M, Z m' |! V5 v0 v1 a NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断) @% m0 P2 i7 j% P% U1 V7 ?
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
% x4 j8 w" Z! ` NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级* }- G- k& V1 s- Q
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能9 I0 p. x# e- S1 u3 R
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器# r+ O( ] Z$ w+ K1 _( g
6 _( Z3 z; R3 j' L3 J' ] [. L
//TIM3_Encoder_Write(65416) ;
% k& S6 o' x, K; m: Q* O# r ~' ]
: w8 X- p! `3 Z, z- d6 [ c6 M- K TIM_Cmd(TIM3, ENABLE); //使能TIMx 8 Q1 c9 R. s) _$ _* w
}5 S2 `2 w5 [, Z w
, i7 O& z7 {% S/ p1 a
7 N% N8 O2 `! \8 q$ T' F! H: @
/**********TIM2_Encoder******/
1 N5 I. G" y9 J+ M6 ?
/ ]0 P$ u& `4 i0 Tvoid TIM2_Encoder_Init(u16 arr,u16 psc)
& w) Q# t# @+ }! p{
6 \) g8 u4 _/ g+ C5 X7 [+ T TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
# s# ?3 Y1 h; Z NVIC_InitTypeDef NVIC_InitStructure;
# l! R. k3 [6 m8 @ TIM_ICInitTypeDef TIM_ICInitStructure;
( m; e2 w2 K9 ]/ d4 d
& |2 i; H3 [, ~& j RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能, Z6 o8 x Q8 E% H; u$ f$ y
0 C4 ^% a' y b c( g5 c4 T: |
//定时器TIM2初始化
6 g7 s# Z7 W$ j0 p TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
+ M4 Y/ u/ Y8 j! G0 o TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
# c/ V: @; g j' m0 X TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim) w u) g1 f g
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
0 j: G" Y7 d+ M& |9 w! t! @ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
T( |) d; D$ { //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
$ B q) T. t6 ]$ A4 ]' Z$ ]/ m, t6 T* [+ F9 c. d1 H
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,
& c n* L; H( [" @1 d# J TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
5 I% T3 {8 s8 z; g" p4 J TIM_ICStructInit(&TIM_ICInitStructure);
) ?6 T; m+ H! t! x1 ^" s TIM_ICInitStructure.TIM_ICFilter = 6;( u1 P7 ]8 A4 L& g, I. e
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
' j- u/ n# ]/ A# `+ u3 m TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 9 G+ i& m4 a1 Z: C# e) n
TIM_ICInit(TIM2, &TIM_ICInitStructure);9 @9 f- p _- m( l3 e, H7 ]( x
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
5 l1 n0 R/ k+ _( N% z; _, L9 X TIM_ClearFlag(TIM2, TIM_FLAG_Update);) y+ g# G4 Y. T
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
# f. Y; G$ j7 o$ K9 N$ e //TIM2->CNT = 120;
1 Y! S" V) [9 y2 [4 e" P- \0 N //中断优先级NVIC设置
7 p. {7 M6 [- D+ W' P% s NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断
5 ?! j6 a3 _" `, D" s% u NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级& M+ S7 A4 W6 d# p+ A$ E0 D
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级7 ?. o6 l$ Z4 T5 }' Y; E
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
0 p9 G* v" \) B; r NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器+ S l8 E- e4 E7 |- d' V6 f' P
% d% O$ v1 C) @0 o, t; w, b
//TIM3_Encoder_Write(65416) ;1 S1 B4 T8 v# L
1 B3 |2 _5 s# N" N2 c% Y TIM_Cmd(TIM2, ENABLE); //使能TIMx
4 T( z; \3 Y- j6 @) V* r" y# P6 {3 r5 z}0 b9 Z/ k2 u! r& _& X' l
7 S0 U8 A; @1 t9 n6 ]
8 \3 }1 v( T# l8 ]: z9 g//定时器3中断服务程序
m3 w: V4 R& _1 F# B$ jvoid TIM3_IRQHandler(void) //TIM3中断
+ h9 E$ ?& F5 ^& `4 f) A{1 r4 {! {# s+ x7 f8 ` `) z
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
+ `8 R6 A4 n) n {9 J) C- v j' |) E5 [. X
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 : N5 z1 p+ Q' a" O! r. {" {
TIM2->SMCR ^= 0x8000 ;
3 f# G: u1 x# f! N1 C; e3 i( @7 I8 ~" J: \# I) n
EncVal = TIM_GetCounter(TIM2);
Q$ ]8 M/ a2 ]' E4 E1 H l/ U
if(EncVal>=240)6 T: l. u$ @5 c3 n' y- u' J1 B
{5 a8 h1 H1 c7 U8 l1 U( x: g7 E
EncVal = 240; - u; w+ x# s! ?6 a# ~4 \
}
l p; z I, o6 x LCD_DrawPoint(i, 5+EncVal);1 }2 ]- e. h- J) g7 F
if(i==320)
/ Q6 \2 O, t1 x4 j: s {
- ]$ v N+ f. `: S- Q i =0;, G; B9 H* s7 Q: P" B
LCD_Clear(WHITE);
+ G+ }1 U- [" c1 ]4 B+ f# y W: u coordinate() ; //横坐标 6 b9 U* T9 d$ M+ \& C3 @5 M
* k; Y# i( Y6 w3 C) J1 Y7 l9 |( ^
//delay_ms(50);
' e4 Z# Y" E' M; O Q1 ]; o/ l }* a' @# g) o5 r4 n: u+ ?
i++ ;
p4 w) P( j& b0 m TIM2->CNT = 240;
" B- B9 y5 B/ Y! Y7 L* A Frequent() ;7 m7 E( ?, s) q1 K# ~, L) S2 L
//fre = 1000/(90 /(720*100/72)) ; 0 h4 {# `+ e) p- h
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。5 o2 ~1 `* S" g; A: q" m
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);9 \& j$ A2 P$ B
//LCD_ShowString(200,200,200,16,16,"EncVal");
0 J; I: p. t0 D; x j- l LCD_ShowxNum(250,200,EncVal,5,16,0);
- P& K0 T6 h/ } Z printf("%d\r\n",EncVal) ;3 |/ q N% G( H* n
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
! g' p9 ^7 K% Z. z }
0 v6 N! N8 M+ J" W8 L% S}
3 N5 @) }2 B! L, C- ?1 U7 P: |6 W; ~, Z2 A2 q' M2 n# X
|
|