找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

电巢直播8月计划
查看: 360|回复: 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两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
; o8 J% s) o" F" b; M3 n: [1 p/ z: r( x0 b
void TIM3_Int_Init(u16 arr,u16 psc)
- Z' U  h( ~7 b5 B+ E; o, R{
- {1 c# T6 k+ y& ~0 U+ a9 |& N  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
6 p' G7 D7 A! o8 [        NVIC_InitTypeDef NVIC_InitStructure;* T4 W2 Y# d) G9 B1 v& y

/ v+ \7 v$ e& P1 ?        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能/ X8 @1 I; u, o# ?2 c: _
        
. M0 j, u* \4 a( J& O        //定时器TIM3初始化
( v" \0 p; M* `& Y6 Y0 V1 p& k        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
. n3 k6 N2 C+ x7 X6 R  H6 b        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值9 o5 j. o* o0 s( E0 W+ y. N2 S
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
' z" A( F) m( O/ t/ e1 Z        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
: J% z7 I& `/ y. M/ K        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        1 X: w' V; C" Q4 C$ C) ]
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
( e' k& Q! A5 M1 X$ d        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断, o% }( |- f! |4 i: G' j' G3 c
' d5 T3 A' j) w4 T' V4 [
        //中断优先级NVIC设置
" D3 U& m2 V* M  R        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断- U6 l! n  Q9 |! K
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级2 Y/ `7 I# C! e5 f. ^- {
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级/ I# G4 b" u8 r. \$ K/ w; M3 m
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
$ T) m& \! _% M) H9 Q% P        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器: y8 b$ X6 D* O) b9 A0 G

' O8 v  X' `. ]5 Z2 o  //TIM3_Encoder_Write(65416) ;1 c% D* |0 I- H( ]4 {2 m0 L
        ; ?3 r! j! k) U8 p* v/ D6 n; X5 p& e
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
+ Y6 Z- V4 k8 \& c0 R9 J* V}5 f( C' p% Q. x- a8 k$ |

  A! w/ N) h" K, k& T- o. S' A& @3 f" @
9 p$ q: s) k* M  d# ]# b5 Y8 D
/**********TIM2_Encoder******/, v5 @0 N0 v' g% }& d
, M, [8 S' u% b3 d, M2 M
void TIM2_Encoder_Init(u16 arr,u16 psc)
: l! Z1 v- a8 ^- k" Z{
6 V4 V5 X4 p" V* Z, \. R5 [  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
6 C7 b6 K% `* a/ h/ L) T/ ~" p3 p        NVIC_InitTypeDef NVIC_InitStructure;: ^& o# K# d. f' p5 \6 m) i" L
        TIM_ICInitTypeDef TIM_ICInitStructure;
2 p, x. \/ `/ f' q5 h" K$ U, V: e  B  C) D
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
( A# e* O) ]6 n2 B* F0 @& b7 l9 G        ' U% a( \+ H" a: K
        //定时器TIM2初始化8 K4 j% Z4 S1 u8 }. x6 k  d2 `; h4 }; c0 Q
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
1 H! Q$ L+ i, L: J$ {3 J0 j1 x        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  i7 V) c, u3 W9 z/ F
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
" S0 @1 b4 R3 i4 D4 f        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式* q$ |1 F" s: H- Y0 R; \- X6 F' Z
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
* a2 I% q6 Z/ X; ~" b        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
* e( r5 O  ?% S! ~* ~  E1 U4 H$ I; l/ ^4 A
        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,8 `  h8 S7 H7 V# }8 @9 _
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
" R& O! z& E" p: _        TIM_ICStructInit(&TIM_ICInitStructure);4 g) S+ r+ v9 N) J' R/ m! C# }
        TIM_ICInitStructure.TIM_ICFilter = 6;
# d6 c; M1 U! A% A0 n# k        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获- J5 n1 N0 V. ^; I
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
3 l' y" ^- w/ x& ]+ `& N; P        TIM_ICInit(TIM2, &TIM_ICInitStructure);5 D1 J* ?6 g9 Z- Y0 ~6 ]+ \
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式$ a  a- M4 ^& f: F) d
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
* }1 v" o; f1 r1 F        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断- @& S2 n3 x2 N
  //TIM2->CNT = 120;
; c& P% b9 @6 k( L: \0 J/ V        //中断优先级NVIC设置
$ A. Y- c  ^5 j7 v        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
  [% e/ ^! g0 U. Q5 o        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
/ `. ]" p6 S& B6 Z# j8 D. t  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级* `* d$ d! n/ p* A& z1 a$ m
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能3 r) k1 e) l' R& }2 k1 ]
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器; c. L+ f' {: b  A+ w0 D
' l' a$ [4 d5 j0 o. h- b
  //TIM3_Encoder_Write(65416) ;( X5 }$ T: `* ?3 H8 w
        0 y1 ?4 E9 K2 V  C. z  d& k
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         5 ^" T5 t5 }# S6 J9 Q8 E/ ?" H
}; S1 P: G* @3 I1 Y
; L" D7 j: c" ]8 c

, K! ~- Y2 m2 Z8 q//定时器3中断服务程序
* K% a: i. J6 s6 [: gvoid TIM3_IRQHandler(void)   //TIM3中断
( E0 L' I9 ]  f- W. l/ T. h- f{. h# r8 s) h, K4 v4 A* o* V
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否4 ?+ i& M* H7 P3 Q8 T
                {
; h! P; Y4 Q/ {( l5 G0 K: ]  x                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 2 A' N, D; ]( ?) r% K6 r" t0 Z
    TIM2->SMCR ^= 0x8000  ;
; [8 [+ x& u- P
/ |+ Z% h# e! i                        EncVal = TIM_GetCounter(TIM2);$ C! `. M: `, c

; M2 F9 A& `! {. J1 p4 e6 q* \                        if(EncVal>=240)
( q% y* a3 {; }$ b4 W* C                        {, z+ w7 ]# W; v3 o/ ]8 ^& _
         EncVal = 240; + {+ [9 Z: @" S4 i" E
      }
, Y' H, i( }: ]( v7 F( ~                         LCD_DrawPoint(i, 5+EncVal);/ ?! V9 R' c% d/ t) a) q
                         if(i==320)
$ E- N, ~; _" q/ p1 ^  b- ~5 X" F+ }                         {  
6 C: _7 Y$ {/ \( j                                     i =0;
5 d5 w, t7 J0 A$ ^! w# X                                LCD_Clear(WHITE);        
2 |9 Y: }6 Y) T2 |8 I                                     coordinate()  ; //横坐标        
: G" X6 [8 P4 F0 f6 J/ W& E6 x2 r- O                                    
$ ]( l! O  q5 n+ I6 V/ F) u. p             //delay_ms(50);                                
/ N3 ]8 I5 S2 f# Z                         }
% t' b# Q2 E* _                        i++ ;
. }' b- b% T2 u2 R2 i( W8 m3 }3 l                        TIM2->CNT = 240; , N7 D( [' w8 Y' f
                   Frequent() ;
- X. G: x$ ^  A8 u( p; T4 t) S     //fre = 1000/(90 /(720*100/72)) ;                        
; k1 i) @; _" y- }2 Z2 @                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。" s! O; P7 {  ?3 h7 S
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
  h- c% i: e. C2 c. u3 [                        //LCD_ShowString(200,200,200,16,16,"EncVal");
! K( `6 A# c% r5 T5 w                        LCD_ShowxNum(250,200,EncVal,5,16,0);
# e3 B* w# {& H6 q8 q) `* o                printf("%d\r\n",EncVal) ;
1 n8 K& }0 @4 R( c    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值# g1 v1 ]) r. I% d
                 }
+ ?/ t3 c4 w0 }% {# Z" H& U$ z}, b8 |/ i* I4 ~2 f# j8 y  z8 [$ l
' w' W5 }$ {2 c* V

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 | 只看该作者
好资料,果断收藏
& z% t2 J' {  p& X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

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

GMT+8, 2025-7-15 03:39 , Processed in 0.066265 second(s), 33 queries , Gzip On.

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

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

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