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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
2 Y5 w/ G# `/ E4 z' G1 ~* i, r+ B, n7 `% ]9 x
void TIM3_Int_Init(u16 arr,u16 psc)/ K. a' s4 C$ z. c& q& ]+ i1 L! Q
{
  h% a5 q6 V. M) }) q& ]  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;$ }' h4 B8 y4 f4 J) F
        NVIC_InitTypeDef NVIC_InitStructure;
6 }. l2 e* e% [& G0 q7 d2 j1 {1 t/ r, l* [& q; g; f4 }; C7 K+ h
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
% e% ~5 Y* @- o& K        
( z3 V( [* x8 _3 y1 a3 n        //定时器TIM3初始化
, w( y7 H/ I5 A7 J        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
& `3 G0 F/ B2 T) |) c        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
- F9 N- ]* A# }; i" s! K  p0 \, r        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
/ q' U- d, p3 u4 H$ P3 ]        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式6 {) N6 t+ l) G( m; {7 ]
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        ; L6 j# _2 g7 W
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
  b& ?8 W7 K( d3 u1 }8 b2 P$ }        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
2 f$ [# Z( O) D. C2 I, ~. O, \5 ^; v  S  B* P1 i- I* E9 C
        //中断优先级NVIC设置: P) Z1 |7 O4 R" U: h% o- r4 T
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断& S. I7 ~. j) h! t+ Q* i. G
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
' E& n# V1 T6 e, }. P        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级1 j/ m6 U* x; \2 R: N+ [
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
( m% j% ?  ~. c: r* b1 w: L        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
0 H# U) B9 o6 j4 @( U% U; B! r, s. k, u6 \' j
  //TIM3_Encoder_Write(65416) ;
& j8 i7 e9 W5 b7 R& E        
, j& H2 ^/ h7 o4 y        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         : K/ @1 P0 D. J. e; W+ h4 ~
}6 ?1 a! \# r  G: Q0 n6 z, n
% y6 {3 M' h- p, |

2 T  m% F, c% U" s
& y' ?$ @3 ^% {/ N/ H8 M+ M$ E/**********TIM2_Encoder******/* g9 [+ z* Q) `7 v5 Q
# U. l6 v4 L& {) i6 n& P  i7 ~4 i
void TIM2_Encoder_Init(u16 arr,u16 psc)
- Y+ }4 b! n' g( X7 S, [& G{
# R2 S; r& A1 L5 q- N/ m7 M- a  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;+ X6 X4 h  O1 ?7 Y2 S* U
        NVIC_InitTypeDef NVIC_InitStructure;
$ b% C/ M) J4 W# W6 {        TIM_ICInitTypeDef TIM_ICInitStructure;
* J# ]/ p! `7 S) j& K! }7 z
. u2 {% }# }- @0 C' N: L        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
, `  \( }3 v- {& u5 D8 ^+ {' s% }; s        " z% E/ J% @8 T( R7 K
        //定时器TIM2初始化* }6 U" [9 {7 W5 d- C! q
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        ( _0 x" q1 L' j% K' G. n/ p" r  \& X
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值+ G# T8 r) U1 a2 R7 `
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim/ Y# P0 v, g9 k3 R, e
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式, N" {! t0 N' f
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
& k* z# @( g) U  q5 i        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值1 K* H+ [, b" X, w' F
+ f# S" w1 _( d. s2 O
        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,. X/ ~8 d4 ?* c% O. b7 v# c
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);2 [  F1 f# N) g: t" k6 U' Z
        TIM_ICStructInit(&TIM_ICInitStructure);
7 S+ ^6 C2 O) d' |9 E) o        TIM_ICInitStructure.TIM_ICFilter = 6;. P7 S3 l* U4 T3 D' h& l
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
' h2 m+ Q( |0 K# ?& v        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 ) c8 G0 @3 n$ g8 M
        TIM_ICInit(TIM2, &TIM_ICInitStructure);" ]: {: G& U% S) l0 H: Z5 M' M2 y% Q, n: Z
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式" D. N0 }! R; W& S$ S0 a
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
! {) V0 f; w, ?' I        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断1 t; }3 [3 r6 O: I/ ^
  //TIM2->CNT = 120;
* R3 p& N1 p2 W        //中断优先级NVIC设置
  n- K* J% F# W  r+ c# A/ V        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断8 h6 w4 ^8 D! b6 G! L
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
# G- }$ d' y: J' O. N: ~  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
7 x% Q2 C0 z5 F3 h4 }        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能& P0 q/ e% v% X3 |% ~* [5 D
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
1 ~( J  L( |' S
/ t- G  J3 H8 M$ b4 N# ]# G. g  //TIM3_Encoder_Write(65416) ;
; A, M# `+ z! Q8 \0 x6 Q" o$ s        # J3 R; X2 y/ m5 ]. c- a3 P9 s
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         5 Y3 w* ^* l; J- M; e& G
}
2 N/ @/ o9 P2 X4 ~8 `- K- C0 E: S% j. t" H4 W

- e. j7 a( B$ X6 n, o& O1 L( R//定时器3中断服务程序( P" F4 _$ G% h2 x5 X# v; f
void TIM3_IRQHandler(void)   //TIM3中断
1 N  p8 Z2 j- n7 A{
" o4 A9 ~( E) P# s        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
9 M) R7 j: |8 P                {! k; a3 P2 t% i- n8 H( t0 S, w, O
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
  {) C5 f3 D- b& U* e    TIM2->SMCR ^= 0x8000  ;0 J0 M& C" f0 U/ N) y
/ [+ Q) m5 n( ?* s' w
                        EncVal = TIM_GetCounter(TIM2);' b( U8 n) l1 J3 p5 v2 V
  a  Z1 B( K/ W' N
                        if(EncVal>=240)) w4 y! n2 B5 r5 b! c' T! o! f
                        {% V! y3 M9 D# [9 f8 ?7 A
         EncVal = 240;
* H4 `/ \' r4 H9 U, @/ i6 r      }
0 b# Q& E- z) H/ t' H                         LCD_DrawPoint(i, 5+EncVal);0 E! Z: @" e" N* f% V2 z
                         if(i==320)( \! u: ?. E1 @; e' F
                         {    @. f/ w$ \0 ]% A% e, u. G# j
                                     i =0;9 K6 z/ ?* h6 }% \& C9 ]
                                LCD_Clear(WHITE);        + `: g1 m- o9 b' Z, {! S
                                     coordinate()  ; //横坐标        
! B8 M: o2 u7 \, j7 f' z                                     7 Y7 i7 h+ h2 G8 r- V  G  L
             //delay_ms(50);                                / U  Q4 Y1 b$ W& i8 P& t
                         }
, i% R; h' K. P) C' Y                        i++ ; ( }- ~, U1 H& N
                        TIM2->CNT = 240;
1 o. v$ u% i  Z* S                   Frequent() ;) `2 o# L8 t9 {8 P. ?7 V
     //fre = 1000/(90 /(720*100/72)) ;                         9 r  z# S( G! Z+ K* W$ _
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。, P; }8 J6 V  V; s
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
/ s, Q  u( h5 ^                        //LCD_ShowString(200,200,200,16,16,"EncVal");3 O* w  _5 ~  l9 v/ j0 v% w! [
                        LCD_ShowxNum(250,200,EncVal,5,16,0);3 V( M6 |( u. M. r6 p" a
                printf("%d\r\n",EncVal) ;
: c: {' v+ w% K+ x3 y+ Z    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
+ {& G, I: ^4 s1 `* E3 U( t                 }
3 j% P# O) h# ~}
! W' x6 E3 g+ v5 L, a) {& U: i2 u0 D

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏; |+ A, w1 T( l5 W+ }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-30 19:18 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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