|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。4 e1 F2 W& C; n* h4 j4 `% z! A
# S7 t* @" G" O
void TIM3_Int_Init(u16 arr,u16 psc)
7 r% v0 e! Q8 t7 N" H. i& }3 G{* C9 i. P. l: G
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;' C# H# v6 y; Z" j5 h& o' i
NVIC_InitTypeDef NVIC_InitStructure;) V- \# b# M& M
3 `. N9 l1 J+ k z' J- T RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
5 F* Z1 E% x) `9 V O' w
8 t0 f9 o9 Z6 c2 h1 t6 Z5 ~ //定时器TIM3初始化
$ y4 D& w" x. Y! d3 V6 v) P: T TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 0 M( k+ Z% [) _, o+ {2 o4 I
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值4 t1 V6 P, P4 R# a1 S. B) O4 C" [
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
4 V* ] u) h0 } P TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
8 b ]1 ?1 h! s4 f6 n# e TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
9 x3 U. w2 R) x! h: Q5 W// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式4 S! [' e; P9 I6 c$ [, N0 A
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
: o- M1 B- ~8 m# _8 U; m" [( F2 ]+ f; H/ x" ^1 i ?
//中断优先级NVIC设置
9 B6 I. q! X3 ?! W& d8 k2 f2 x NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断6 r( c m, B; y
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级& m: I- L& R- z' `% J9 z
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级0 X- @3 T2 d* P' f9 y
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能2 b C U& j+ w' s/ @
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器$ t8 `) M7 f$ D$ c( F% d8 `' u& g
& v$ U' I% A! m0 \* W //TIM3_Encoder_Write(65416) ;
: Z, Q# V# `9 `. T. P* p; G 5 {$ k0 B" D+ s) L. D9 c/ \
TIM_Cmd(TIM3, ENABLE); //使能TIMx
# Q" g; b3 u4 D/ S7 i7 ~/ e n; Q}% V" g3 t+ Y( o
& E% n+ e& p& s" u, Z5 N0 g% @+ H, z+ ~# V5 v- O
$ ^, m% E5 D2 u; r0 O1 }
/**********TIM2_Encoder******/$ o8 E1 o# B& c" P) x
3 B. _6 Z/ [- y" i
void TIM2_Encoder_Init(u16 arr,u16 psc)% S+ t7 V, m* w, [4 [
{! Z" E! Q5 J$ v
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
* ], S; T( J9 R1 @# A# G NVIC_InitTypeDef NVIC_InitStructure;8 n* l! j! F+ s' G# d! k
TIM_ICInitTypeDef TIM_ICInitStructure;
" K9 Z/ U7 b5 G4 \& d! k5 u
$ C& |' w- \: D RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能0 R) I8 Y1 n3 L4 N* _ ?0 ^
6 f, J" y7 t! ]6 Y
//定时器TIM2初始化
! D2 g9 V/ d- J6 ?6 f# S, F0 ~ TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
8 g) n4 x' [" f% q' u7 x" \ TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值8 s+ {& `$ z5 f. ~
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
2 n: r e m* f! f TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
H& G6 ^6 p/ G- t+ k. t TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位, F, _- H+ c/ Y7 t
//TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值% H' u6 ]! z( N C( T0 _
+ o0 T% ]$ s% N4 w1 a
TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,, q" k$ g+ z% `/ e
TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);: \9 g( O. _( ^/ O/ ]
TIM_ICStructInit(&TIM_ICInitStructure);
6 F& Q Z8 t9 C! r& R0 \, L" A TIM_ICInitStructure.TIM_ICFilter = 6; i1 h, t0 H7 g% `- k
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获( q+ |! g! \" U( M+ ~: X+ L: `
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 * E% Z- g* e8 H2 ~
TIM_ICInit(TIM2, &TIM_ICInitStructure);/ J* r# i; d% z* O3 d1 |) l
//TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式5 R: O- r7 A' H4 v A7 d0 b
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
6 q9 Z; P) L- L" J TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断" K7 l5 r$ B+ s B
//TIM2->CNT = 120;# j3 E3 m/ T& x9 Q2 E" b& K
//中断优先级NVIC设置
; k1 U# V/ I6 n$ ~; |" D- ` NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2; //TIM3中断* m, K% I, w3 `' K
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级3级2 {9 A$ ^5 _/ o3 G, `# V, K
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级6 e& w/ X2 r: g3 A# V" n2 a6 U3 c0 J
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能2 a) |+ t3 D) x' K& W! s! Y
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器+ v0 N' G G* j0 k' s# G( u4 e
3 _0 V4 K) F( }& j; y
//TIM3_Encoder_Write(65416) ;
1 S# ?4 V% L, k4 X3 W & R( |7 I* j# Z F. x- n% c. F0 G
TIM_Cmd(TIM2, ENABLE); //使能TIMx
) z- Y' o' ]/ U4 ^9 H; d4 h( @- ~}- Y! d1 i# B. w( Z) a+ u- t* g
6 h2 M8 {, O' `
5 r/ ?" a3 B @2 Q7 t//定时器3中断服务程序8 L9 w5 f. P7 T) Y r
void TIM3_IRQHandler(void) //TIM3中断
: `; N9 n* E2 J{
; h) p, u* M: Z, m* ^% @, ? if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
! E3 v$ W; X1 \5 x2 Q {7 z C- u$ j; `' v# T9 r- L/ @
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 % V; ] U7 \& n8 _5 c: r1 u/ v
TIM2->SMCR ^= 0x8000 ;) a9 e6 l) G' w9 H/ T/ E
6 r' y/ _0 i8 T# q& Z EncVal = TIM_GetCounter(TIM2);3 s8 c2 t9 u; u) v7 z" p% i4 y
0 ~1 R+ S; Z: h/ r. a. ~- I
if(EncVal>=240)6 }9 K o7 z7 h
{
# p- p# E6 r; ^$ d EncVal = 240;
- ^# p( [. K( z/ M, p' {, c [5 p }9 |( m1 t5 q+ O* m9 y
LCD_DrawPoint(i, 5+EncVal);) ^" ?6 T! a! A5 v0 B3 N" Q R/ o
if(i==320)
$ k; s" P$ J' U$ X { # D o2 J3 [) L
i =0;
+ Y5 g4 @7 ?: k) H LCD_Clear(WHITE); 7 @/ |+ k3 R0 b
coordinate() ; //横坐标
& {& \1 v9 s' m
3 y7 d# ?3 G- H0 x. _9 [ //delay_ms(50);
: D7 \" Q `% ]* P' l6 n: o) n }' b5 k* x* e* k0 B7 r' \5 \
i++ ;
9 N8 w" X% A6 t1 q6 V: J) i! I5 ` TIM2->CNT = 240; 4 l. |8 \4 x/ q6 `% d2 l) O
Frequent() ;* y$ m+ V$ z- n- a! e4 Q2 t
//fre = 1000/(90 /(720*100/72)) ; & ~ \7 o7 \. W" A9 K
//sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。4 y$ h' i1 s0 H L4 N
//sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);3 \& L. K$ ~! f" X8 | \' E0 {
//LCD_ShowString(200,200,200,16,16,"EncVal");+ a" U# U3 q9 G" o* h9 A6 n: k
LCD_ShowxNum(250,200,EncVal,5,16,0);6 v1 t) x* x& a$ [* Z
printf("%d\r\n",EncVal) ;
9 s" S; P" {% O) |1 } ^ TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
, ]) a5 e( ^0 v, Y# R( o* \ }
4 d; {) ~- u7 R5 p1 W2 ~}
0 g9 u5 ^7 I7 j% Q& Z4 r' A! [) {) y9 [% k" X
|
|