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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
0 n4 A" Y1 r+ q
( e6 Y  C' N/ N$ evoid TIM3_Int_Init(u16 arr,u16 psc)- ~$ o$ E( q, g' U$ a
{5 H* [/ z& s5 a
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
+ }& |. `  P6 b9 D( S7 y( v$ p        NVIC_InitTypeDef NVIC_InitStructure;
% r; [" z8 _) Y
6 K; v0 h+ Y, |( j6 ~6 u; `4 c6 X        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能; T& [  c, ~8 M
        8 g& B  y$ H& \' A& P5 n" E2 R
        //定时器TIM3初始化
/ W2 [( T4 x' \' C- ~& ~        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
$ C8 j" X; A4 C2 A! G& u9 W! n        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
# Y  u" }5 {8 n% D) y4 \, }        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
% s; W% _% N/ Y. l4 F        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
0 `) Z$ t7 R; P        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        9 }" d7 h# b& i9 E: s
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式, Z& B% Z9 [3 N, E% D
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
. s1 j% J8 |. E. G# \" x. u, s* O( n+ v6 O1 s" j' J, C  W1 ]
        //中断优先级NVIC设置
5 @( j! \# u4 V. \$ S5 f6 p( v        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断7 l* m; J' H3 N! P; I8 f; {* F
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级8 R' I# p3 T- T: [' C+ p' K  L
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
. {/ a5 z6 M+ P        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能$ g2 k1 Y* Z, h7 R7 z# L
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器# ]) S, V8 Z: w: Q, t8 ]* i9 c) ~
" M9 z5 x5 T/ y5 w& \6 p# o
  //TIM3_Encoder_Write(65416) ;
! ]* P3 Z" @3 z( D        
0 r1 Y2 u8 y% u% j% q& J  X9 a        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
" T3 Z7 x0 y8 j- b}7 x4 M- Y2 ]5 U7 x# l9 y

- G% z7 P$ I% ^4 o; E& x. L+ I) r- V0 @8 W1 g% W9 k/ `

9 y/ m$ {; C! ]/**********TIM2_Encoder******/% z5 `# F. y! G9 X; `

' d' F( S+ [5 ?4 X% Lvoid TIM2_Encoder_Init(u16 arr,u16 psc)
% o6 A' i  q9 b{
8 P. i( I3 g" @  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
8 I3 }; G" k0 b# O2 {# P        NVIC_InitTypeDef NVIC_InitStructure;6 W* B5 m5 c, _( [/ x" H4 u! N' A
        TIM_ICInitTypeDef TIM_ICInitStructure;
% j" M( r! u# ~2 z7 M3 }: s2 L! g
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能, R4 Y/ e) X# j9 v& i# U9 d8 T
        ; n, \0 C- d: t
        //定时器TIM2初始化& j& {$ [" B: |7 ?5 {5 ]' [/ K
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
' v" b  O4 {: ~  p) j" [        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
; b4 l( g. T# M        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
0 [9 O! {4 [8 ^, {4 a        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
8 d1 a# t) G0 N/ Y6 x        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位, ], ~/ G& Z: |+ ~: K) i: u
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值5 \% f! Y& ]$ M* v  C4 H6 i$ `

  i/ Q/ ^4 H* y0 d+ ~6 k+ c        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,( \! J' I0 \' h. K# Q8 s+ x5 z: o
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
; {3 ?! a2 r. ~        TIM_ICStructInit(&TIM_ICInitStructure);
. h1 |0 c4 }- n4 c8 }% M: ~: v        TIM_ICInitStructure.TIM_ICFilter = 6;
- V3 ]' d/ n. |' j        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
. u' G3 b! R6 ?+ E# S" Y# f        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
, B$ A% K5 n1 P8 G$ t        TIM_ICInit(TIM2, &TIM_ICInitStructure);9 i, k6 A9 @3 h; H5 h0 h
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
% m$ Z) M* Z4 R% j3 M- H. f3 D6 f" p  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
" a% [  Z; H7 u/ |6 g        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断+ P6 f( ]/ x. E, l2 ?
  //TIM2->CNT = 120;
6 [! F- J9 Y: R        //中断优先级NVIC设置5 j& B& l1 V7 i4 \# [
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断9 c, X7 [9 E# m& O) Z
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
$ K) b2 o9 l9 R3 O, E5 V  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级4 L0 c' u) C  m( j: ~* ?
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  W9 j; M7 d/ P  B6 @  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器  y5 @" P- R1 S+ r4 Y+ A1 ?. ^

8 r7 \1 O) ^9 z0 n9 a- X9 @& S  //TIM3_Encoder_Write(65416) ;
1 y9 n+ e& g4 ]) O        4 ]+ c! S0 z/ j* j% E
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         # m0 d8 d4 P1 E% x4 A2 w0 m+ G( t' Y
}7 ~, M" o/ H9 ?& K  M  `8 E! m8 l

( `$ X& v* l: X) a. i! W2 i
3 W, x/ m3 Y7 X' a/ C8 K//定时器3中断服务程序  u& k' y" g. w2 h6 P
void TIM3_IRQHandler(void)   //TIM3中断
( Z/ i) f1 }: G  n# j' Q{4 ~( {: _* r4 @* K' E
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否7 ?1 S, p" p  f  @# T6 q+ ^
                {
+ C# o6 T* t1 ?, E9 b1 p8 u$ |1 ~                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
( A* `; S9 p. N/ ]5 ]    TIM2->SMCR ^= 0x8000  ;
2 F5 g$ k2 _5 Q' W2 C- x% |# r2 v! f& _2 d% a8 W  p) ]% ]6 P
                        EncVal = TIM_GetCounter(TIM2);
5 ]' ]$ g7 d- B; Y+ L( B2 t6 a: J% M4 |4 g% g3 g* I( Q
                        if(EncVal>=240)# T# M4 r' R# h* t- O
                        {' s3 [) e0 M+ U, s7 \, e
         EncVal = 240;
) \6 r1 {7 r3 i1 `8 ]  m      }3 w" ^# |5 ^# p0 {0 z3 @8 n0 J5 [$ R
                         LCD_DrawPoint(i, 5+EncVal);4 ~& h8 R! }+ h! H
                         if(i==320)
8 D! P4 t7 l7 c7 k* k% V5 X: T                         {  
7 {6 n2 w( c. m2 F. o6 a* p                                     i =0;
2 R# G3 @; @3 Z  _6 o2 v: a0 g                                LCD_Clear(WHITE);        
  a" u. H: S$ ~$ M                                     coordinate()  ; //横坐标          Q" e  B4 U8 j
                                     6 a: U6 l' A9 M
             //delay_ms(50);                                
* r% }" H& c7 t# f; B# E                         }7 l: w' Q( X1 M3 d1 G
                        i++ ; - _$ m5 I! U  \. q* ~  w; ~
                        TIM2->CNT = 240;
. v; K7 e# b7 S' W; v7 K% c4 Q$ K3 c                   Frequent() ;
2 d: m8 }8 z0 c! h     //fre = 1000/(90 /(720*100/72)) ;                        
2 Z# M% m0 D) P9 u                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
; o1 T- n# N0 _9 [: g3 J' x" c* S* l                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);4 T8 h: m6 E& P. ?- N9 V. H
                        //LCD_ShowString(200,200,200,16,16,"EncVal");3 A, q! g8 e6 k* |$ @
                        LCD_ShowxNum(250,200,EncVal,5,16,0);9 X9 @" ~% \( e" X
                printf("%d\r\n",EncVal) ;% n+ B! k  L. l
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
5 _1 t% Q8 b- N( ?% m( D                 }. R* Q9 k1 S2 S  A! w
}* H" v7 z6 }* {- c; f6 \
4 W6 \3 L9 q$ U

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
- [9 Y0 t' o& e% j& R
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 21:36 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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