找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 355|回复: 2
打印 上一主题 下一主题

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

[复制链接]

156

主题

503

帖子

1186

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
3 w) J9 o( E! P) K# y1 H0 \+ b( Z& T( d" i2 d9 w8 ]7 ^4 g
void TIM3_Int_Init(u16 arr,u16 psc)/ ~! K0 G8 x3 T$ @: P1 m4 A1 x
{
6 i8 H! L: U( W+ D% }3 p- k+ X  p  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  f. t& o( O) e. z# y* S2 x0 B# h
        NVIC_InitTypeDef NVIC_InitStructure;
' v; }6 S0 |, |$ K; t% m" ^' ]% M) `4 E  v. O
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
; T  R* N9 _) ^$ l        
' H; ^# {- y- r& d  |; f8 h/ Y        //定时器TIM3初始化
! U1 U* ^5 T! ~- I$ b+ I        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        6 i# N8 |. I% ?( [! @
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
$ l! y# d" g" O; ^        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
7 \# r2 U4 F1 k3 S+ H        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式( G# }( A+ p# O6 y
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        4 F% Y( B3 Y% L; H" v5 a
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式) C2 J& O' e5 l9 k! l0 Z  A# N
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断+ F: ~! P6 I3 m1 G- J1 W& F$ z
$ m; d7 O. P8 M% n* I
        //中断优先级NVIC设置" p! H" z. v5 h0 q# @( Z, {3 ?
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断; {, r9 C( {2 u, W7 G7 l
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级7 H9 s; v: l* _" D% K( a
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级+ _( q# l4 B( e5 O$ X
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能7 N+ k( w/ ]4 A8 a# p+ Q2 A: T# i
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器- C5 n% x* z, B% X
* V) `4 C7 a: ~; @
  //TIM3_Encoder_Write(65416) ;
" P' P( ?2 t" J2 V# s7 X- @) Z        & _  V6 {. c& ?* F( z
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
. h7 {$ v: Z4 o- J}5 q7 G/ x! K2 z) u+ g

1 j/ ?8 b) |6 K# z
6 \8 d1 d5 d) s# t% l( S3 g
9 H. I+ _% x( S2 K! F8 t+ G/**********TIM2_Encoder******/
" Q3 z+ O: x  }# c  X# U5 T. q; A! v
void TIM2_Encoder_Init(u16 arr,u16 psc)8 M. `- a# c% \& H+ x4 w* E
{
3 M9 c4 k$ l7 ^4 d  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;, s0 b9 a' y$ r8 g6 [
        NVIC_InitTypeDef NVIC_InitStructure;
, O' _! `5 Y% W  `" M$ E1 y        TIM_ICInitTypeDef TIM_ICInitStructure;
, I3 p- M5 h1 [! B! Q
) x/ u& t- \0 B* m2 C) \6 [; ^        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能: F# z( g0 q! o( q: o& {
        
8 V' O+ }7 `7 W+ \7 s. e% h        //定时器TIM2初始化) f% K5 p3 W; \/ f8 H' p6 e
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        9 [* e, t. A7 T" ]% U
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值# h+ E. c% |" p/ }
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim' q# x; n' p& k3 o8 q
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
0 J- M) b3 p7 p. t: W6 b        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
& P, A1 _. t( D% P        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值+ [1 \0 o% F+ j3 V+ o7 h

3 f! G. F* c" L% a: R! I( W. T        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,% c! Z7 d5 D1 t9 V
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
  U4 ?) p' m+ [* O+ d7 b        TIM_ICStructInit(&TIM_ICInitStructure);
9 E  _( X' M/ B; ]  w  q! r        TIM_ICInitStructure.TIM_ICFilter = 6;, _9 L- F8 M8 ]+ D. R
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
: g  @6 i# x2 ~+ `: N- z        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
+ p  l" A5 @+ f2 q& y( t        TIM_ICInit(TIM2, &TIM_ICInitStructure);
5 l  {  e; j% `' \  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式  I. e; Y$ h4 H7 _
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);) C- D2 Y/ f# \% F, P9 Q3 f; e
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
6 `! p* K+ Y: A7 o$ [  //TIM2->CNT = 120;
7 n' U/ E/ z; H' d' T2 r" v        //中断优先级NVIC设置
" Y- L6 c$ V$ t* Q$ \3 S        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
- E6 E% ~2 [2 ~0 r. C3 O, m8 j- S* f        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级$ `$ f/ K. E& s+ X) r/ e
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级8 ?+ d. R0 n+ }  l
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能# H# j6 \' f8 G
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
0 _8 |# }2 T2 p' c* o  y& I9 ~9 T; e
4 ]1 M9 A* ^5 U1 _  //TIM3_Encoder_Write(65416) ;
+ J  a! D) X# h) z& n; L$ H        1 d1 y" M9 M/ C5 B" H; z
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
: _7 G# w5 _) u* J8 d}
0 T4 u3 V, \) M  d! {
+ x3 q9 U, b, j6 @! f7 z
/ K- W- _( C- y) d9 R5 f//定时器3中断服务程序
% h6 s+ ?5 w% k6 {- t2 p, k7 N8 B; pvoid TIM3_IRQHandler(void)   //TIM3中断
  c' U6 D4 D4 Y) O3 }{
' \/ W, h, ]# A5 }        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
2 y# g, k3 ^' e" L                {
  ~6 H4 {9 G% s2 W6 D, P                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
2 ?" T: W; P6 C8 j! g/ W5 k    TIM2->SMCR ^= 0x8000  ;& Y! b* r2 O1 h/ r
# H3 N. c  Y1 [8 R
                        EncVal = TIM_GetCounter(TIM2);
. ?; D% k' z! {& d
) n! V& B* N8 J  ?                        if(EncVal>=240)
! K+ }! @: e, s  k% F" d$ D1 e% q                        {2 e9 ?$ L# ~6 n5 V- S% l6 D" n; p
         EncVal = 240;
/ A* H# A5 Z" ^      }
5 u% k3 M8 W2 W8 s. t' Q                         LCD_DrawPoint(i, 5+EncVal);7 x' r6 F2 K4 X
                         if(i==320)
+ B: Z( }* V( f9 {# b4 w1 g                         {  
& o" W3 \+ p+ W4 O                                     i =0;0 ?9 f* I5 M" y4 }7 i* h
                                LCD_Clear(WHITE);        - Y: i$ H' k& ~: n) f
                                     coordinate()  ; //横坐标        
) ^' x( k, m* u  C                                    
  g# d. }" m; ?$ S+ u& F, }( @             //delay_ms(50);                                
, n0 c* U2 B4 I                         }. [* s2 W) l: F; ^
                        i++ ; / k" d) g5 _& d5 b. D9 y  m
                        TIM2->CNT = 240;
1 K+ B+ {+ |7 Z* J7 T4 N" n                   Frequent() ;; [# A5 E9 ?) [+ h& U# o! s) E) J9 D+ _
     //fre = 1000/(90 /(720*100/72)) ;                         ! W, h7 ~2 v3 B2 e$ B# l+ `: D& z$ L
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
6 g  ~+ O( f* @, d) H) A7 }                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
% ^2 a/ S& n$ E, U, k                        //LCD_ShowString(200,200,200,16,16,"EncVal");: _) H- x: B2 |( p
                        LCD_ShowxNum(250,200,EncVal,5,16,0);
. q$ R' j% y7 x8 S0 o2 ?                printf("%d\r\n",EncVal) ;. x- v% B+ r- z
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
- H. I6 Q5 n- X& w                 }
8 N2 C# t* k+ W8 ^. S}
" z) h' [+ u+ V8 r$ u8 u0 U! \" @3 Q; ], k

TIMER.rar

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

156

主题

559

帖子

1202

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

165

主题

600

帖子

1289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1289
3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
  L+ f' Z5 E7 O5 L0 I* p, Y) o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-1 23:42 , Processed in 0.061322 second(s), 34 queries , Gzip On.

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

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

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