找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 357|回复: 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两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。2 \1 o% j8 g3 t# c! f' t# N3 q5 h
, j5 w5 I1 B! J
void TIM3_Int_Init(u16 arr,u16 psc)
! c, S( Z6 F' y9 _( t) a) V( S' `{  M) R* P( l& E9 v( {5 v
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
3 m8 Q5 S% Z0 }3 `. v  A! w# s        NVIC_InitTypeDef NVIC_InitStructure;" f2 ^2 B: u, ?# Y% {* r- {. ^; }
3 e& h- p4 T8 A
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能: e1 T, e+ S% _: [
        8 U8 Y* V8 r. R% o+ G% h8 C
        //定时器TIM3初始化# D9 T: H5 E3 a; G3 z5 s5 N8 V
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
  O0 [3 ]' X. e- P* Y0 F, S! t        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值2 }/ u' j+ B' l! i4 H$ h
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim7 C5 b8 q% ]# w* m  T4 z
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
1 N3 B: E& i1 o5 G- d        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        ! X4 k+ l/ B& @9 H# N/ \2 S
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式" e0 m3 x& `) Q0 H5 ]
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断1 X: X0 y0 l# O3 B

# K+ C' y9 f( u, r- h5 G0 v! f        //中断优先级NVIC设置
/ J5 U" r0 i( ]0 y$ p# M        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  p; m1 z7 W1 f        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
/ b' G, z* U. _$ d        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级' i5 h/ d* I4 ?( n4 j0 B
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能) _" a% K  n# x3 r0 [9 F
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器) Z5 g* f- R8 b: C5 j8 x# o: [
1 c0 [5 O2 i( g% o1 J
  //TIM3_Encoder_Write(65416) ;
; S, _' I$ c0 |+ u        
; E! i- @* E9 q: {3 ]; P        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
/ K$ A$ K0 V0 C% J/ P}5 M, M* n$ O6 K

7 z/ e; |8 N% _$ f$ r
8 v6 ~# `3 x# d: ~3 Z8 f! W! N  ~1 i: c, ?8 ?2 [
/**********TIM2_Encoder******/
4 \& O  N/ X# k% R, U, Y$ C, g/ r- Q" n
void TIM2_Encoder_Init(u16 arr,u16 psc)
. j0 d. }. [9 k9 [! K9 d2 b{
/ g0 _9 {4 @% V, H& J  Y  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;6 J! G. u9 H. N: C
        NVIC_InitTypeDef NVIC_InitStructure;
7 P1 ]6 `1 N+ A3 [' E1 i        TIM_ICInitTypeDef TIM_ICInitStructure;- X( _3 {: a6 {& |0 ~$ I6 }
; b5 ~* J2 S, I8 k. ]
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
1 }: Z, ?8 y+ r  w4 R- Y. }! N$ r        
8 x0 D4 c& T. r3 A1 v% r        //定时器TIM2初始化
" H! W( A( v# O0 y& I1 k- X        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        / H8 _7 I3 a) F& }( M/ M
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
3 @! c1 W6 t* u, T" l        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim  n. t7 T# L+ D# w7 i
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式/ `+ g2 q0 g+ |6 e
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: n% o  V/ O4 C2 r
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
+ I% [& j: s5 i& k4 j9 ]8 p! |
' D6 [2 L- ?/ J- R* A7 U. N( @. q        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
! z. {8 [: c1 E; `8 S- h9 `0 B" r                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
( _; k' _* n7 h* B) {6 n3 r. Q. l# \        TIM_ICStructInit(&TIM_ICInitStructure);
5 u* G7 n! }# [" }* Q        TIM_ICInitStructure.TIM_ICFilter = 6;
3 b3 s2 @' f, O* V: e        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获: B3 E6 o0 N3 A: s2 p) V; t; j5 H
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
9 S( }: @, t. b$ t        TIM_ICInit(TIM2, &TIM_ICInitStructure);
& u5 y( k4 @4 @+ B5 v$ t* W  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式4 ?+ x; P! E3 K2 d. T5 V
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
& U* ?( q( ]3 p# f, g2 p; J        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断* g" S7 y! D3 G2 v* N
  //TIM2->CNT = 120;2 `8 D* I& h8 R
        //中断优先级NVIC设置
2 c0 m- E& J& B- V8 y        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断" r& ~) K9 V0 j
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
0 J, d, j4 w' {  }! U9 P  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
5 x: `7 ]9 ]2 Y/ \/ u        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
/ E# @0 h: h9 U+ _6 y+ h  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
- J/ b3 |7 ]+ V) X5 d; o  e
# Y0 z! U' Z0 x4 \. O  //TIM3_Encoder_Write(65416) ;
5 X' C+ F9 m# o3 D        
$ G: A/ W$ x: C7 u) L  y. d4 S        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         - W$ U& T  `* v. o. }* d: m$ H
}- R0 X7 w! k8 |# r

% a3 c" Q" G, K( J7 i& O$ n' o
5 K) }" n5 z: [8 U; \+ S//定时器3中断服务程序# @  b/ {$ X$ [: n0 q$ ~
void TIM3_IRQHandler(void)   //TIM3中断! j- q0 J2 B- K+ T* g
{
1 ]  B' A% V/ T2 m. Y" V! Z0 `4 c        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
( o& m3 M) B% i) H! E8 F; f* y- W                {8 V- r) q9 L% ~6 J2 D; {4 v
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 0 j: C( Z4 _3 w9 j! G
    TIM2->SMCR ^= 0x8000  ;
4 o/ ~) D" m1 ]( y2 b+ T8 @% X/ V1 v- ]. I5 g
                        EncVal = TIM_GetCounter(TIM2);
% L, ^8 A* q. }# ~3 d' h7 a5 |1 b+ @& ^/ F1 k9 f: X
                        if(EncVal>=240)) s9 A6 {  ?5 L; S; O
                        {
! h, T4 C5 L5 F0 u         EncVal = 240;
. E# J# F9 k' W+ I      }
, R6 B$ g6 W$ w& V2 r3 X# q                         LCD_DrawPoint(i, 5+EncVal);  S1 `8 V5 o0 E$ l  U7 S. H  j9 B
                         if(i==320)  }6 D, [- D/ t+ h* ^1 J
                         {  
6 W' i( _2 Q. L; l9 H/ k                                     i =0;
0 k3 D2 F* n& M1 H. V% }& [                                LCD_Clear(WHITE);        5 @# J" e; u# w0 u0 y. z) F7 l& s
                                     coordinate()  ; //横坐标        : \/ k, z6 ^4 b# s  N
                                     * [0 ^1 E6 |0 M6 I! p0 m2 E7 Y/ N( Q
             //delay_ms(50);                                : U, S: \/ K: ?1 C  p# v! C
                         }
; H# Q! \+ p0 m0 h' q                        i++ ; & n9 A' y7 T2 ~" w) S
                        TIM2->CNT = 240; 3 Q' V2 [3 P1 i8 Z& |; i, T
                   Frequent() ;
3 I& J) U- L6 u" t4 W* r& d4 X     //fre = 1000/(90 /(720*100/72)) ;                        
! @& V. ~! r2 E$ `                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
4 h& U  z8 w. A5 n5 c* _                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
4 ^& d) o$ U6 y  j/ a                        //LCD_ShowString(200,200,200,16,16,"EncVal");
/ Z9 s( h0 V* ]2 e! e1 Y                        LCD_ShowxNum(250,200,EncVal,5,16,0);
" X( d3 B1 t' n/ k                printf("%d\r\n",EncVal) ;3 }. B3 u! C! z2 Q
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
) M1 Q( ?1 s. F' }- q; |                 }
; D, c; g' ]( l* f( @! R# l}9 F7 t  {& y- [6 F
; h" H. ]+ r5 C8 ]7 v( W

TIMER.rar

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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

165

主题

600

帖子

1289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1289
3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
0 Y+ q# [9 k! Q

156

主题

559

帖子

1202

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1202
2#
发表于 2016-5-18 10:59 | 只看该作者
楼主很用心啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-2 01:49 , Processed in 0.061590 second(s), 35 queries , Gzip On.

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

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

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