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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。4 e1 F2 W& C; n* h4 j4 `% z! A
# S7 t* @" G" O
void TIM3_Int_Init(u16 arr,u16 psc)
7 r% v0 e! Q8 t7 N" H. i& }3 G{* C9 i. P. l: G
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;' C# H# v6 y; Z" j5 h& o' i
        NVIC_InitTypeDef NVIC_InitStructure;) V- \# b# M& M

3 `. N9 l1 J+ k  z' J- T        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
5 F* Z1 E% x) `9 V  O' w        
8 t0 f9 o9 Z6 c2 h1 t6 Z5 ~        //定时器TIM3初始化
$ y4 D& w" x. Y! d3 V6 v) P: T        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        0 M( k+ Z% [) _, o+ {2 o4 I
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值4 t1 V6 P, P4 R# a1 S. B) O4 C" [
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
4 V* ]  u) h0 }  P        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
8 b  ]1 ?1 h! s4 f6 n# e        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        
9 x3 U. w2 R) x! h: Q5 W// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式4 S! [' e; P9 I6 c$ [, N0 A
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
: o- M1 B- ~8 m# _8 U; m" [( F2 ]+ f; H/ x" ^1 i  ?
        //中断优先级NVIC设置
9 B6 I. q! X3 ?! W& d8 k2 f2 x        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断6 r( c  m, B; y
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级& m: I- L& R- z' `% J9 z
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级0 X- @3 T2 d* P' f9 y
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能2 b  C  U& j+ w' s/ @
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器$ t8 `) M7 f$ D$ c( F% d8 `' u& g

& v$ U' I% A! m0 \* W  //TIM3_Encoder_Write(65416) ;
: Z, Q# V# `9 `. T. P* p; G        5 {$ k0 B" D+ s) L. D9 c/ \
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
# Q" g; b3 u4 D/ S7 i7 ~/ e  n; Q}% V" g3 t+ Y( o

& E% n+ e& p& s" u, Z5 N0 g% @+ H, z+ ~# V5 v- O
$ ^, m% E5 D2 u; r0 O1 }
/**********TIM2_Encoder******/$ o8 E1 o# B& c" P) x
3 B. _6 Z/ [- y" i
void TIM2_Encoder_Init(u16 arr,u16 psc)% S+ t7 V, m* w, [4 [
{! Z" E! Q5 J$ v
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
* ], S; T( J9 R1 @# A# G        NVIC_InitTypeDef NVIC_InitStructure;8 n* l! j! F+ s' G# d! k
        TIM_ICInitTypeDef TIM_ICInitStructure;
" K9 Z/ U7 b5 G4 \& d! k5 u
$ C& |' w- \: D        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能0 R) I8 Y1 n3 L4 N* _  ?0 ^
        6 f, J" y7 t! ]6 Y
        //定时器TIM2初始化
! D2 g9 V/ d- J6 ?6 f# S, F0 ~        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
8 g) n4 x' [" f% q' u7 x" \        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值8 s+ {& `$ z5 f. ~
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
2 n: r  e  m* f! f        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  H& G6 ^6 p/ G- t+ k. t        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位, F, _- H+ c/ Y7 t
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值% H' u6 ]! z( N  C( T0 _
+ o0 T% ]$ s% N4 w1 a
        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,, q" k$ g+ z% `/ e
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);: \9 g( O. _( ^/ O/ ]
        TIM_ICStructInit(&TIM_ICInitStructure);
6 F& Q  Z8 t9 C! r& R0 \, L" A        TIM_ICInitStructure.TIM_ICFilter = 6;  i1 h, t0 H7 g% `- k
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获( q+ |! g! \" U( M+ ~: X+ L: `
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 * E% Z- g* e8 H2 ~
        TIM_ICInit(TIM2, &TIM_ICInitStructure);/ J* r# i; d% z* O3 d1 |) l
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式5 R: O- r7 A' H4 v  A7 d0 b
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
6 q9 Z; P) L- L" J        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断" K7 l5 r$ B+ s  B
  //TIM2->CNT = 120;# j3 E3 m/ T& x9 Q2 E" b& K
        //中断优先级NVIC设置
; k1 U# V/ I6 n$ ~; |" D- `        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断* m, K% I, w3 `' K
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级2 {9 A$ ^5 _/ o3 G, `# V, K
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级6 e& w/ X2 r: g3 A# V" n2 a6 U3 c0 J
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能2 a) |+ t3 D) x' K& W! s! Y
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器+ v0 N' G  G* j0 k' s# G( u4 e
3 _0 V4 K) F( }& j; y
  //TIM3_Encoder_Write(65416) ;
1 S# ?4 V% L, k4 X3 W        & R( |7 I* j# Z  F. x- n% c. F0 G
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
) z- Y' o' ]/ U4 ^9 H; d4 h( @- ~}- Y! d1 i# B. w( Z) a+ u- t* g
6 h2 M8 {, O' `

5 r/ ?" a3 B  @2 Q7 t//定时器3中断服务程序8 L9 w5 f. P7 T) Y  r
void TIM3_IRQHandler(void)   //TIM3中断
: `; N9 n* E2 J{
; h) p, u* M: Z, m* ^% @, ?        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
! E3 v$ W; X1 \5 x2 Q                {7 z  C- u$ j; `' v# T9 r- L/ @
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 % V; ]  U7 \& n8 _5 c: r1 u/ v
    TIM2->SMCR ^= 0x8000  ;) a9 e6 l) G' w9 H/ T/ E

6 r' y/ _0 i8 T# q& Z                        EncVal = TIM_GetCounter(TIM2);3 s8 c2 t9 u; u) v7 z" p% i4 y
0 ~1 R+ S; Z: h/ r. a. ~- I
                        if(EncVal>=240)6 }9 K  o7 z7 h
                        {
# p- p# E6 r; ^$ d         EncVal = 240;
- ^# p( [. K( z/ M, p' {, c  [5 p      }9 |( m1 t5 q+ O* m9 y
                         LCD_DrawPoint(i, 5+EncVal);) ^" ?6 T! a! A5 v0 B3 N" Q  R/ o
                         if(i==320)
$ k; s" P$ J' U$ X                         {  # D  o2 J3 [) L
                                     i =0;
+ Y5 g4 @7 ?: k) H                                LCD_Clear(WHITE);        7 @/ |+ k3 R0 b
                                     coordinate()  ; //横坐标        
& {& \1 v9 s' m                                    
3 y7 d# ?3 G- H0 x. _9 [             //delay_ms(50);                                
: D7 \" Q  `% ]* P' l6 n: o) n                         }' b5 k* x* e* k0 B7 r' \5 \
                        i++ ;
9 N8 w" X% A6 t1 q6 V: J) i! I5 `                        TIM2->CNT = 240; 4 l. |8 \4 x/ q6 `% d2 l) O
                   Frequent() ;* y$ m+ V$ z- n- a! e4 Q2 t
     //fre = 1000/(90 /(720*100/72)) ;                         & ~  \7 o7 \. W" A9 K
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。4 y$ h' i1 s0 H  L4 N
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);3 \& L. K$ ~! f" X8 |  \' E0 {
                        //LCD_ShowString(200,200,200,16,16,"EncVal");+ a" U# U3 q9 G" o* h9 A6 n: k
                        LCD_ShowxNum(250,200,EncVal,5,16,0);6 v1 t) x* x& a$ [* Z
                printf("%d\r\n",EncVal) ;
9 s" S; P" {% O) |1 }  ^    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
, ]) a5 e( ^0 v, Y# R( o* \                 }
4 d; {) ~- u7 R5 p1 W2 ~}
0 g9 u5 ^7 I7 j% Q& Z4 r' A! [) {) y9 [% k" X

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏9 s% v; M$ w4 S1 Q/ x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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