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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
- d( E3 P3 p4 P7 n4 }8 C
8 p+ E. v1 J: p+ n2 D4 y& l' yvoid TIM3_Int_Init(u16 arr,u16 psc)
5 m( B9 r. s2 o5 a{
5 s8 \# |: |7 h3 V2 M  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;0 u4 Y( P& H9 {: _
        NVIC_InitTypeDef NVIC_InitStructure;: ]* C! g6 Z2 {
9 a% t& B( J( E, L7 S8 |2 w
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
% [& H9 p( k) g  ^5 r% R& |) D- W        # d9 _0 t- |. B' p- A
        //定时器TIM3初始化  o7 G4 s' t0 D. s4 f0 ]. D
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        ! Z) H; d+ [0 H) t5 f
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
2 q. y" r# y/ x# M! K" `        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim5 J0 H  C0 ^4 K8 T' `+ J
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
: v; `9 x- ?/ T# q# z        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        
: o0 v5 c+ ]1 I. R3 \( e// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
4 w& o& A. V. v9 W# h        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
( w' H* ~; [1 M0 [+ h5 {9 O! H9 J: x3 W, _* Y, D& w
        //中断优先级NVIC设置
' K- K  m' _% L1 u- T        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
9 h! x- d6 V2 F1 v9 k0 t, t        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级" J6 L3 c# A( z: j6 n) y  a
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级- R( m7 w( N. U4 ~% Z3 f
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- M' U8 m5 B/ d' A3 n        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器* T& r" k4 {" D

1 `8 M7 @5 X% E6 y  //TIM3_Encoder_Write(65416) ;
& o* j1 d; z; G& r8 Q$ k  K4 @        , K/ n) B2 G, s4 z6 s" c
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
) g& t0 O, b& Y}. {; _2 L2 c/ e% L# J" y( E

; `. r8 s" v. G9 b# @! h; F$ G- [/ Y7 m, u3 ], Z6 l9 o

0 i4 x# H6 |* {5 w$ ?/**********TIM2_Encoder******/
% A4 a- U( |5 F( G
. J; g2 t4 \# S) o% ]3 [void TIM2_Encoder_Init(u16 arr,u16 psc)# O3 r. [: X; e* }# h/ b
{& `1 [. K9 j; b3 Z$ {
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;$ Y  p. B- f" w! k8 ~8 R( @3 [$ d! l
        NVIC_InitTypeDef NVIC_InitStructure;3 F% ^9 }  O+ I0 x1 I
        TIM_ICInitTypeDef TIM_ICInitStructure;
1 o$ m2 s! U& X2 ^
! e, }5 ?6 I( {! T        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能/ l- U0 b6 d' I; m# x
        
, I! Y7 d1 Y7 q        //定时器TIM2初始化, n' M' L! b# _1 c, Q$ B6 [, y/ v
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
* j& Z" ^; P! P7 I) C' h        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
: l. w- `: x+ q5 [        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
: c) Q* I6 D4 }! x  _        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
( l0 I$ J$ ~5 a& e  D4 r9 h# M# L$ t$ {        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位1 B/ G. E. z' ~2 |. f+ I  h
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
- F0 Q4 N3 m1 z4 k
2 g' z) j9 S) P" [: }/ k        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,% {$ Z! ^+ P8 A& j) D
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);. `0 g, J6 M8 L0 M& b( t& _
        TIM_ICStructInit(&TIM_ICInitStructure);
9 M8 K% u: m7 {! j        TIM_ICInitStructure.TIM_ICFilter = 6;+ h2 w: M/ |; u; x# L. p7 l
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
5 x; M' `8 g! M/ ]) B  f& V) R        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频   y5 H' w! j6 t: a
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
6 w% V& W4 u. H4 u0 w! z' e  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式% P6 d/ F/ k5 |* s/ a0 \
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
5 U' E4 S0 G" Z& ~+ a$ U' H2 ?        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断# u$ g6 T! [; Y1 \" b& ]  T
  //TIM2->CNT = 120;" h: M. w  ~6 y3 n; v
        //中断优先级NVIC设置
4 H/ l6 q; H) s( i. ]( E        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断& ~9 ~  v* _$ x
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
7 x, B$ O( l2 h# f) k  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级: A  v0 X+ L# `0 ?- }
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能3 C. \+ `7 d4 @1 f, W7 r- I
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
: L' y7 ?% j0 S/ a0 }) i" N  @: ?* P3 a% F+ \
  //TIM3_Encoder_Write(65416) ;
, m8 s' T  K- R7 @4 m        2 V7 {& x# R% s& J8 n
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         4 y) _8 q+ [' q5 `$ b+ b
}
. g; Q* x4 h7 I, F% `7 o- H3 n
0 d# m; u9 [3 N# ?* r% ~& K
0 p8 `3 F, t' {: r: m7 h( l//定时器3中断服务程序
/ H4 U1 Z9 ?1 @, j- mvoid TIM3_IRQHandler(void)   //TIM3中断/ |$ d9 A- I3 t8 ?
{
7 `4 D3 \' m8 N* G) ~* V        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否6 Q  o3 D. J7 ?
                {( M6 C: Z9 H( E7 Q
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
# U+ H; U2 ?  W+ C2 \    TIM2->SMCR ^= 0x8000  ;
0 V/ {3 C8 Z; _& T$ x5 c7 Z" {
. b: e2 o& @& z! z                        EncVal = TIM_GetCounter(TIM2);
0 F, a- v' y( {( W  P
* v9 i3 n6 k  n' B$ c( v                        if(EncVal>=240)
* P* B3 @$ h/ c( n                        {
! c2 R) b& J1 c; i+ a         EncVal = 240; 5 A1 S& W9 t" O
      }
. T2 \) {' T  {9 }                         LCD_DrawPoint(i, 5+EncVal);
. o$ ]0 M) f- X) s* u- u/ s                         if(i==320)
7 U) {1 N% t) o                         {  
) D* K: w. ^$ z) m) [4 j                                     i =0;& A$ n) |. A- s8 m; U
                                LCD_Clear(WHITE);        # x4 y0 f! i! s9 M! e0 M  K/ o. c
                                     coordinate()  ; //横坐标        3 _6 p0 m5 U4 [: X
                                    
6 ?7 U* ?2 N+ F( a. F0 @3 [             //delay_ms(50);                                # Z5 t( ^. A- X& Q% H
                         }
  ~( s* B: [6 T; D; P9 O- M                        i++ ;
7 L5 ]7 u# g$ O8 [$ i6 n                        TIM2->CNT = 240;
. S  G8 ]; z! ^7 p5 N& u                   Frequent() ;
& [9 N( V/ |" E3 Q, l     //fre = 1000/(90 /(720*100/72)) ;                        
7 _2 K( `( L' F% |, c" T  d8 i                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。2 G+ j9 e3 }- s
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
% q6 W9 p7 D& |! u, A                        //LCD_ShowString(200,200,200,16,16,"EncVal");
- b  Q( b4 h# A# @                        LCD_ShowxNum(250,200,EncVal,5,16,0);
; m7 v% y6 Q. }" n; M, P+ H                printf("%d\r\n",EncVal) ;
9 D. L+ K" B& h; i% O    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
1 O+ g: H3 W2 W: K7 I                 }
! T8 e3 j: z" z4 @' k& i9 C}
2 h. i# ~, M; c6 b
1 G* e( ^1 r0 T2 s

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
. ?% K) ?0 C) e+ u9 j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 06:39 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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