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

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

[复制链接]

该用户从未签到

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

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

TIMER.rar

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

该用户从未签到

2#
发表于 2016-5-18 10:59 | 只看该作者
楼主很用心啊!

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
8 l" R# e" m# x2 D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-21 17:48 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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