找回密码
 注册
关于网站域名变更的通知
查看: 1005|回复: 2
打印 上一主题 下一主题

STM32编码器模式计算减速电机AB相脉冲个数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-5 11:24 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。# @1 n& T, m# \+ a: u
; M, i0 T, e% u& d" |
void TIM3_Int_Init(u16 arr,u16 psc)
6 P2 F6 @* g9 ]1 K- G$ g{* T. K2 H3 w8 Y1 G
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
0 C; p- c- u8 G4 d. y        NVIC_InitTypeDef NVIC_InitStructure;7 q( `. H/ l& Y1 y) Z% w

% z, e: h- v/ D8 ]6 |8 [  ~( C        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
6 k5 L3 J; [$ n* E3 D, Z$ A& n        $ t( p( E; E  D+ D
        //定时器TIM3初始化
! t  G6 g9 D4 t  i: o' \2 v        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
& @  {" I! t6 u) V: e        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
5 J2 U5 y) @" U/ |. I# M        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
: w+ A0 d. t/ Q, s! e. r& |! \1 D        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式6 I; w, T$ P! k
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        ! ~6 P! ~* W, F& w
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
: k  Z# Z$ }8 b- I* p5 q        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  g) G) q; v4 t- i4 F4 U$ ?3 \  x( Z# M; c! E5 F$ Y
        //中断优先级NVIC设置
2 d8 r1 v9 J  S        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断. z% w  _2 ^$ u$ Z) ~1 C2 X
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
( q9 ?2 q3 g3 h4 G        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
2 m7 ?8 g9 D6 o) _9 R        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
8 W- a) d. d" M: X        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器' ^( x3 I" D! b% j) K

  [0 O8 b3 n9 c5 c( c7 Y9 o, h  //TIM3_Encoder_Write(65416) ;* _5 |% |# g9 r9 I  C) ]; r2 R
        
0 b$ o! b; e: y% U1 X        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         0 k+ {4 _2 X7 v6 K9 U
}. x+ _" r/ L9 r! Q; Q! S
* z! e, ~, U' \$ H8 T& i' A7 c

' t8 K3 n% O) [4 i8 d' z3 p; o
, @6 o; M, f4 [, ]% v5 r: \% y/**********TIM2_Encoder******/; y* q1 ]7 W! s0 c, p
4 W# j, d) f" h! }6 [* e8 d& a  D3 e
void TIM2_Encoder_Init(u16 arr,u16 psc)
& T9 K4 x% _( @' l  V( c+ a{
8 W5 Z/ @0 C& V5 w  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
, M$ D" V* \; f& P( \+ `0 q        NVIC_InitTypeDef NVIC_InitStructure;
  K4 t- F, H' ]$ c: G2 w  k/ U9 P        TIM_ICInitTypeDef TIM_ICInitStructure;$ m* J1 r0 Z- P9 B  F9 b

" o% ]4 p. i) r8 X        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
# p% M* l& }, O9 i* ?6 K        0 T7 B) k* o- F3 G) z5 q
        //定时器TIM2初始化5 s* _& `# o2 z- X7 h2 B2 [
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        ( U3 S% j5 b! s+ K  L
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值+ {# R0 ]) r+ o% b9 K# `& G) X* q
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
/ z4 j. R* @/ Y6 z# s; k9 j        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
. g! M5 }5 [1 E" u        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位  F7 f% L7 T& z4 @' f) N- u% F
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值  r, b! M. I' a, {! h
( C8 q8 J' W  _! w& f* O, ~
        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,/ L- I- x0 M/ x6 \8 ^& V- C
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);" o& u: d; K5 W' d1 b
        TIM_ICStructInit(&TIM_ICInitStructure);2 D" C. |7 H9 _/ [6 b
        TIM_ICInitStructure.TIM_ICFilter = 6;
$ k3 y: |4 }$ }; ~        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获1 x: W: }+ s, z( ~% _+ Y( W
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
" y4 x$ i: [; N$ l, X6 u3 h        TIM_ICInit(TIM2, &TIM_ICInitStructure);
3 j0 K+ ]# U6 c' }* K9 G/ W7 \. G6 ^# b- r  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
% @" J/ V# h3 g- }0 }0 m  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
, o  t* t- f' g6 m& j0 B$ u        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断" j) q* s- h9 l; L
  //TIM2->CNT = 120;
" q2 a4 u# p( h& l/ q6 ]        //中断优先级NVIC设置2 b! K$ M" H  T/ N
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
# ?- D% w) t9 n' D        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级4 u9 A8 F1 k6 ^3 W
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级- z3 ^4 r1 V/ A! A
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能5 x9 \8 f1 J% Q* B' i' h, @7 h! K
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器4 j1 V% o0 f8 E7 ?) a$ F) x# y: T

( N+ w9 C( c: I& w4 N0 p# ]: a8 N# J  //TIM3_Encoder_Write(65416) ;) j) A( s+ j7 ~
        
6 o7 i4 o1 c& K* u) q" r% [  p  y        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         ! o# G7 G9 J% U" j; N. ]
}
: Z" \7 S" F8 C  F3 l. Z: z
# M) T5 w* I% j. J- {3 g' ^: z0 C# F/ g% y$ l  T, q
//定时器3中断服务程序& _* e7 [; Z5 E; `* U; ~
void TIM3_IRQHandler(void)   //TIM3中断
: M; t- U0 N1 U9 O( N{; z& t3 r& R# N! l
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否8 L! j" S6 w8 {5 y5 y3 v
                {
6 B0 V9 m: c7 H* S; H6 L+ u                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
- r( _' R/ x) r! W) t& j    TIM2->SMCR ^= 0x8000  ;
% a1 M8 M! Y" x# j& B( l5 R  x5 p. s
                        EncVal = TIM_GetCounter(TIM2);1 v$ Q: w# S' t

3 f' {* Z3 T2 \                        if(EncVal>=240)
, J3 X* L  i1 E- s) W                        {# e6 C3 y# l% ^8 Q
         EncVal = 240; + K$ T  Q$ n4 j8 e6 c/ X1 D
      }
$ @8 U  L' n2 X/ b! [5 |4 @                         LCD_DrawPoint(i, 5+EncVal);
2 M  U/ T, {/ s) a/ h                         if(i==320)
0 |+ u0 ^0 D+ |                         {  
- c  M8 e! `) C- ]' v' X+ L/ ^                                     i =0;
$ d3 ^' Y6 ^/ E% c- t7 V                                LCD_Clear(WHITE);        8 ~+ S' B; X( j7 o' u
                                     coordinate()  ; //横坐标        
4 J* b# Y2 x( `3 F6 d$ P; _                                     2 M; x* o8 D+ m0 p7 v) X
             //delay_ms(50);                                
/ O7 g) v" C% o                         }
0 c6 o) }! Y) T' y) N                        i++ ;   u" x- v; S' C. Z
                        TIM2->CNT = 240; 4 E1 p; c( ~. z( A8 R# |: W8 q3 r2 j
                   Frequent() ;. a7 O7 z" c$ O% H
     //fre = 1000/(90 /(720*100/72)) ;                         ; N/ y4 d2 R7 ^* Z: z8 y
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。  ~, [5 _* G# {# l4 `% N- x
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
" \2 ?$ i3 c; F+ q0 c                        //LCD_ShowString(200,200,200,16,16,"EncVal");( `, j3 E! }$ s
                        LCD_ShowxNum(250,200,EncVal,5,16,0);
; f; _4 O8 R' B9 I' b5 U6 V                printf("%d\r\n",EncVal) ;
5 y4 t2 K2 O6 N    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
; y7 p& |  r! h- b                 }* j' E( k2 v' D
}( M! I0 @# Y' u" l; D' v

% f' C; ?' S0 w! ^

TIMER.rar

2.59 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
, p; k# T' d; v" k$ r) I/ t- k

该用户从未签到

2#
发表于 2016-5-18 10:59 | 只看该作者
楼主很用心啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 19:43 , Processed in 0.187500 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表