|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
: n& C! w! y6 S- {' ~' M- y# W3 T; I# U% C
void TIM3_Int_Init(u16 arr,u16 psc)! E3 g# p# ?' J" U5 k; |& O
{- X) a1 I& y: U4 Y; X
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;& S* k# X# ^' g, A$ @0 U
NVIC_InitTypeDef NVIC_InitStructure;
" L+ k1 S2 Y+ ^# F) K1 x( e; l% m% u+ R0 R) ], B0 E. P
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能! S3 T, D9 ^* j4 |4 Y
7 _' H) L; ~, F' p' M. Z& g$ [. g //定时器TIM3初始化9 @5 F9 ~; l! U% s+ b
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 - ~% u$ K1 s5 L1 j: m
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值. g4 t1 _% p/ _. R8 X, G, R/ @; `
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( j9 C& A7 ]% S8 S# b
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式! t4 N) z! H, ]) H5 J7 H V9 }! G! M
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 + c6 f0 y9 c p+ Z [& W& J
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
, { G% G5 |8 O! d3 U TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
' T! h# ^0 Y4 Z: ~/ J" p1 U. q- B, R" q9 ~
//中断优先级NVIC设置
1 A* e7 l" a X: H NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
7 n* x8 T* `2 x5 `+ x* M5 [$ E+ b NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
5 W) P; k* C: j* |0 h( R( q NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
5 v2 e% N4 g9 B" W) U7 `. b/ Y/ t j NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
7 q3 g# R6 X' }8 x8 t NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
3 ]! S3 d0 T4 P k
1 s* T: z4 A8 r7 n9 h" n //TIM3_Encoder_Write(65416) ;( A0 H( F9 w& a$ L) b! E, T
4 p4 x& H/ H- x7 I2 t
TIM_Cmd(TIM3, ENABLE); //使能TIMx ; w4 x; ]4 I3 N( Q! H* ^
}2 s* E6 g1 W, X6 Q
3 G- N, c& r {" l
: S1 b; Y6 V0 n, T8 z
7 I+ t( e/ T3 n3 m2 ]/**********TIM2_Encoder******/# l5 g7 [# s) O( a5 T! I/ \# P
3 s5 Q- P' J- g; Tvoid TIM2_Encoder_Init(u16 arr,u16 psc). o4 I# ?& Y5 Y; v/ T$ P* ?
{4 c) x/ Y( R( `5 p1 B4 z. K% e
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;! k7 M- @$ m9 l2 W
NVIC_InitTypeDef NVIC_InitStructure;) r% `$ D7 y4 ` u9 D% H! [
TIM_ICInitTypeDef TIM_ICInitStructure;
, }$ [2 x' Y/ D4 E K3 I
6 v$ r- S4 }4 p/ C) i" Z RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能 [. y/ ]- ?' L0 f9 }6 t
; Q0 {8 f; ~: _6 ?7 ]5 c5 H0 @6 o, ^/ ~3 d //定时器TIM2初始化
+ V, N' W* |- |% I, V TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
- j0 ]- D* T+ t9 e TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值6 ^! h4 D9 |4 E+ [+ X8 ^
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim8 n: C9 ?' J6 T$ ~0 A( x# r
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式1 z" Z4 j& R- W4 R+ Y1 T/ v0 N: V
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: Y4 Z8 `! N/ z+ { y
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值" Y8 R5 X! X# E( [
( X" \5 {7 P" X TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,* |' d+ I( I" G% F; X- L B _0 x
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
. q" W7 H% S1 J1 L TIM_ICStructInit(&TIM_ICInitStructure);
7 x, D8 s# Z( N) e+ c TIM_ICInitStructure.TIM_ICFilter = 6;
, g3 T7 W7 a2 P0 c" \- D/ b TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获8 X5 M F% M u
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 - B1 l# Q& M3 Q' \6 l1 H% C
TIM_ICInit(TIM2, &TIM_ICInitStructure);& N- g* l, I8 Q: q! c" f
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式% [0 t% A( S" c0 W
TIM_ClearFlag(TIM2, TIM_FLAG_Update);" |5 i7 `) E `5 D
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断& c) e" T8 E, Q9 J$ T0 J; y
//TIM2->CNT = 120;2 P( D6 l- s) \7 G5 l& A5 `
//中断优先级NVIC设置
1 \: U+ D' f8 |2 i( y) u NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断2 P7 Y2 R. t+ u" h7 t( c \
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级
/ K' X# i4 Y; A NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级& G' g! r) v( H
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
) e7 w9 N4 }: ~( U. h9 ] NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
! Z* f$ ~& n) c5 }6 J* p' Z( d4 i7 `
//TIM3_Encoder_Write(65416) ;9 I% b# v. f! g+ |
3 [6 u! [8 K# m$ e% k; ^) b TIM_Cmd(TIM2, ENABLE); //使能TIMx - U, t) f4 s9 d
}
}6 F& q8 u; U# Q# i/ t- I6 W# D# F7 q; R9 U) U/ u$ R
7 i3 I# R& [1 U& \
//定时器3中断服务程序
- }4 N2 ]& t; m% T: Gvoid TIM3_IRQHandler(void) //TIM3中断6 B/ f, P$ ^( }9 p
{: J4 L& G5 k# y
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
* ~ a$ p( u. y" e& i {
: R- ] }, Z* ?/ m/ t, I TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 9 V- y/ z5 _$ R$ Z
TIM2->SMCR ^= 0x8000 ;2 o$ Z. o8 k$ H6 C. Z# D t9 |! Q
- {% E& ~7 ?! J) s! R
EncVal = TIM_GetCounter(TIM2);
# m2 N4 M7 k9 N: O; c
1 }7 \* M2 w. m, p( G: t8 U if(EncVal>=240)4 r7 m$ o' e- b# I6 i6 G5 O+ ?
{
% ~" |' K( x. C8 I+ D9 f$ ^ EncVal = 240;
- u9 T) m) h2 ?/ g }6 E: _. K: B- R/ ^$ C
LCD_DrawPoint(i, 5+EncVal);0 r1 _. ?9 Q7 q) c n$ J1 w, `
if(i==320)
0 z3 _0 P& M9 r& Q" v { / F: q. |( a+ H/ i* i3 ]) E
i =0;! Z9 g7 \5 \. _0 g: O
LCD_Clear(WHITE); 2 h: z. R/ w! z( F# i
coordinate() ; //横坐标
( t3 y! J% a0 \1 Z8 i# S- h
7 z# \; p7 X: ?. e8 L5 x //delay_ms(50); & x" M R7 d0 r5 a( k' z( S
}4 q; }' t" H1 e2 o
i++ ;
. U& w8 y& ^% ]! l1 g) M* e TIM2->CNT = 240; 8 D: M- r9 z; q6 p
Frequent() ;( k8 W# P& o! j( t& H
//fre = 1000/(90 /(720*100/72)) ; : b a+ {5 h* ]! J+ i
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。0 d! h2 M$ t0 S/ p$ M- ]( e/ }( l6 G1 x
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
5 v+ m+ Y* ^7 f //LCD_ShowString(200,200,200,16,16,"EncVal");5 y2 V/ V7 b* Z' h4 g1 t
LCD_ShowxNum(250,200,EncVal,5,16,0);
4 ^: q, k2 ^$ x" u" r5 | printf("%d\r\n",EncVal) ;1 ]: {2 Q. E( \" H% E; _/ Y
TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值3 n" v# G' n6 _
}
) a H: }4 _# g}
3 u% u+ |- Y. u% n: S5 s( B( {0 e1 B, W0 v7 ~9 i
|
|