|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
2 Y5 w/ G# `/ E4 z' G1 ~* i, r+ B, n7 `% ]9 x
void TIM3_Int_Init(u16 arr,u16 psc)/ K. a' s4 C$ z. c& q& ]+ i1 L! Q
{
h% a5 q6 V. M) }) q& ] TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;$ }' h4 B8 y4 f4 J) F
NVIC_InitTypeDef NVIC_InitStructure;
6 }. l2 e* e% [& G0 q7 d2 j1 {1 t/ r, l* [& q; g; f4 }; C7 K+ h
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
% e% ~5 Y* @- o& K
( z3 V( [* x8 _3 y1 a3 n //定时器TIM3初始化
, w( y7 H/ I5 A7 J TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
& `3 G0 F/ B2 T) |) c TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
- F9 N- ]* A# }; i" s! K p0 \, r TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
/ q' U- d, p3 u4 H$ P3 ] TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式6 {) N6 t+ l) G( m; {7 ]
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 ; L6 j# _2 g7 W
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
b& ?8 W7 K( d3 u1 }8 b2 P$ } TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
2 f$ [# Z( O) D. C2 I, ~. O, \5 ^; v S B* P1 i- I* E9 C
//中断优先级NVIC设置: P) Z1 |7 O4 R" U: h% o- r4 T
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断& S. I7 ~. j) h! t+ Q* i. G
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
' E& n# V1 T6 e, }. P NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级1 j/ m6 U* x; \2 R: N+ [
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
( m% j% ? ~. c: r* b1 w: L NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
0 H# U) B9 o6 j4 @( U% U; B! r, s. k, u6 \' j
//TIM3_Encoder_Write(65416) ;
& j8 i7 e9 W5 b7 R& E
, j& H2 ^/ h7 o4 y TIM_Cmd(TIM3, ENABLE); //使能TIMx : K/ @1 P0 D. J. e; W+ h4 ~
}6 ?1 a! \# r G: Q0 n6 z, n
% y6 {3 M' h- p, |
2 T m% F, c% U" s
& y' ?$ @3 ^% {/ N/ H8 M+ M$ E/**********TIM2_Encoder******/* g9 [+ z* Q) `7 v5 Q
# U. l6 v4 L& {) i6 n& P i7 ~4 i
void TIM2_Encoder_Init(u16 arr,u16 psc)
- Y+ }4 b! n' g( X7 S, [& G{
# R2 S; r& A1 L5 q- N/ m7 M- a TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;+ X6 X4 h O1 ?7 Y2 S* U
NVIC_InitTypeDef NVIC_InitStructure;
$ b% C/ M) J4 W# W6 { TIM_ICInitTypeDef TIM_ICInitStructure;
* J# ]/ p! `7 S) j& K! }7 z
. u2 {% }# }- @0 C' N: L RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
, ` \( }3 v- {& u5 D8 ^+ {' s% }; s " z% E/ J% @8 T( R7 K
//定时器TIM2初始化* }6 U" [9 {7 W5 d- C! q
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 ( _0 x" q1 L' j% K' G. n/ p" r \& X
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值+ G# T8 r) U1 a2 R7 `
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim/ Y# P0 v, g9 k3 R, e
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式, N" {! t0 N' f
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
& k* z# @( g) U q5 i //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值1 K* H+ [, b" X, w' F
+ f# S" w1 _( d. s2 O
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,. X/ ~8 d4 ?* c% O. b7 v# c
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);2 [ F1 f# N) g: t" k6 U' Z
TIM_ICStructInit(&TIM_ICInitStructure);
7 S+ ^6 C2 O) d' |9 E) o TIM_ICInitStructure.TIM_ICFilter = 6;. P7 S3 l* U4 T3 D' h& l
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
' h2 m+ Q( |0 K# ?& v TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 ) c8 G0 @3 n$ g8 M
TIM_ICInit(TIM2, &TIM_ICInitStructure);" ]: {: G& U% S) l0 H: Z5 M' M2 y% Q, n: Z
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式" D. N0 }! R; W& S$ S0 a
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
! {) V0 f; w, ?' I TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断1 t; }3 [3 r6 O: I/ ^
//TIM2->CNT = 120;
* R3 p& N1 p2 W //中断优先级NVIC设置
n- K* J% F# W r+ c# A/ V NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断8 h6 w4 ^8 D! b6 G! L
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
# G- }$ d' y: J' O. N: ~ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
7 x% Q2 C0 z5 F3 h4 } NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能& P0 q/ e% v% X3 |% ~* [5 D
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
1 ~( J L( |' S
/ t- G J3 H8 M$ b4 N# ]# G. g //TIM3_Encoder_Write(65416) ;
; A, M# `+ z! Q8 \0 x6 Q" o$ s # J3 R; X2 y/ m5 ]. c- a3 P9 s
TIM_Cmd(TIM2, ENABLE); //使能TIMx 5 Y3 w* ^* l; J- M; e& G
}
2 N/ @/ o9 P2 X4 ~8 `- K- C0 E: S% j. t" H4 W
- e. j7 a( B$ X6 n, o& O1 L( R//定时器3中断服务程序( P" F4 _$ G% h2 x5 X# v; f
void TIM3_IRQHandler(void) //TIM3中断
1 N p8 Z2 j- n7 A{
" o4 A9 ~( E) P# s if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
9 M) R7 j: |8 P {! k; a3 P2 t% i- n8 H( t0 S, w, O
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
{) C5 f3 D- b& U* e TIM2->SMCR ^= 0x8000 ;0 J0 M& C" f0 U/ N) y
/ [+ Q) m5 n( ?* s' w
EncVal = TIM_GetCounter(TIM2);' b( U8 n) l1 J3 p5 v2 V
a Z1 B( K/ W' N
if(EncVal>=240)) w4 y! n2 B5 r5 b! c' T! o! f
{% V! y3 M9 D# [9 f8 ?7 A
EncVal = 240;
* H4 `/ \' r4 H9 U, @/ i6 r }
0 b# Q& E- z) H/ t' H LCD_DrawPoint(i, 5+EncVal);0 E! Z: @" e" N* f% V2 z
if(i==320)( \! u: ?. E1 @; e' F
{ @. f/ w$ \0 ]% A% e, u. G# j
i =0;9 K6 z/ ?* h6 }% \& C9 ]
LCD_Clear(WHITE); + `: g1 m- o9 b' Z, {! S
coordinate() ; //横坐标
! B8 M: o2 u7 \, j7 f' z 7 Y7 i7 h+ h2 G8 r- V G L
//delay_ms(50); / U Q4 Y1 b$ W& i8 P& t
}
, i% R; h' K. P) C' Y i++ ; ( }- ~, U1 H& N
TIM2->CNT = 240;
1 o. v$ u% i Z* S Frequent() ;) `2 o# L8 t9 {8 P. ?7 V
//fre = 1000/(90 /(720*100/72)) ; 9 r z# S( G! Z+ K* W$ _
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。, P; }8 J6 V V; s
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
/ s, Q u( h5 ^ //LCD_ShowString(200,200,200,16,16,"EncVal");3 O* w _5 ~ l9 v/ j0 v% w! [
LCD_ShowxNum(250,200,EncVal,5,16,0);3 V( M6 |( u. M. r6 p" a
printf("%d\r\n",EncVal) ;
: c: {' v+ w% K+ x3 y+ Z TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
+ {& G, I: ^4 s1 `* E3 U( t }
3 j% P# O) h# ~}
! W' x6 E3 g+ v5 L, a) {& U: i2 u0 D
|
|