找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 353|回复: 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 y; a( Q, r% ]2 }2 I( j& z. q6 c- f( F& O5 ^
void TIM3_Int_Init(u16 arr,u16 psc)0 O: q  w' z* o5 I
{8 w1 |% L6 R9 L
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;. U" v, a; J, E0 z) T6 l$ i) Z
        NVIC_InitTypeDef NVIC_InitStructure;1 ]. w) h! H  i" ^
9 J: ?1 J' B9 Y% t& C8 E
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能/ w6 L- _6 O9 |' ?. r- S
        
& t0 u/ `6 u5 o6 Y        //定时器TIM3初始化
% W0 c9 l  \. A* G" h: m) v7 b        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        % L. N* g/ F- f- j
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
, S3 t- A0 J  P& b3 o        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim1 h7 B7 H* U1 s/ C; H! E, k
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式' N- d; K( L7 f5 g  a
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        * e3 E9 a2 F& A3 h/ R9 F. R0 j
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式. T7 f9 Y4 _. g$ `8 r7 F0 e5 o! O
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 a/ |8 D$ ?) V1 Z
* f/ `, n1 T* K: U4 t  x$ F" B* a' N
        //中断优先级NVIC设置( c! ~; F# A+ L( Z7 O0 `5 P& _
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
6 F; P- j+ \, x0 \. ^* ?        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级. V8 v$ N. k, Q. u/ L  [' h8 d
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
7 n; [$ I# `, B, i6 c% `" d        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
( }$ g! O& v8 B        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
% f& w& H$ b7 o: g
# w$ U7 @6 k3 c' h- c  //TIM3_Encoder_Write(65416) ;
" k4 }- T0 K/ H7 G        9 `# w7 S: @" H$ [4 H0 ?+ ]; i% \
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
- ^) U" w! M6 c}
2 O8 q/ d% G6 [. r# n9 h& W
' k; F' }. ^4 `  K/ n& z8 g
0 V9 B5 {3 {0 T3 v1 q& K6 z
/ Q* u6 \6 Y  v* @7 _/**********TIM2_Encoder******// a8 R3 z9 q  `. ^
1 e( D' u( f8 s1 q# ?+ G, p4 N7 r
void TIM2_Encoder_Init(u16 arr,u16 psc)
  Y1 ^0 t- K0 W$ n7 e{6 C+ y: G( J% F  [5 _( Q" o% B7 ^
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
4 S0 Q- C' [) g. m+ W        NVIC_InitTypeDef NVIC_InitStructure;
0 J- V% V, m: _1 C4 k/ C/ Z1 n% K        TIM_ICInitTypeDef TIM_ICInitStructure;% M  F6 @# C. Q0 O
. y7 l% _6 T" x- W- p% X7 N( K7 v* Q# `
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能' Y+ t0 ]- w# a6 t+ G9 _6 Z
        
" o& X% p( ^, l3 e0 j$ m        //定时器TIM2初始化+ d2 f( R: S- n
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
" b2 ?0 N1 P$ O4 M5 r        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值( T7 s, x! _: j/ `! B4 y$ M
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
7 C8 G* l, d6 a        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
5 ]+ S# h' n/ f. z  \9 S* _) `$ H$ ], @        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位- W2 ^) |5 ^1 ]4 F8 ^; `1 T
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
3 E+ M9 A2 r4 T7 _9 F, X' V% |, H. b
        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
- o5 e; |! \4 A$ v- o6 z                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
6 o; m, P: u# M5 i        TIM_ICStructInit(&TIM_ICInitStructure);
6 B( ?1 N' B- v5 [        TIM_ICInitStructure.TIM_ICFilter = 6;$ M3 b4 n, n. R
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获; {) V" E' i3 m2 N
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
# y  v0 T" F0 ^' m6 P6 R4 ]        TIM_ICInit(TIM2, &TIM_ICInitStructure);) a" a! g+ y; L5 O
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
2 F% I+ q1 l. e$ @  TIM_ClearFlag(TIM2, TIM_FLAG_Update);9 f; U$ s. K; o0 Q6 g
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断' X$ f; u! c) V8 O$ x
  //TIM2->CNT = 120;0 V/ _) p2 Z* P; j. V! A9 d
        //中断优先级NVIC设置: l' `1 ~' C8 T
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
9 q9 ~0 I" Z5 y/ H0 e        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
' q1 _/ H8 ~+ j  T2 N  f9 D  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级  l* v* R+ I( ?  R' J' o* Y
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
, b$ I8 S% v5 b; _+ ]$ X  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器; T$ D! X( ?+ W0 E( r2 X! u

3 j1 r7 {( J+ x; a$ z1 K  //TIM3_Encoder_Write(65416) ;* `3 U( B% K8 h
        / H0 w$ ^: f2 K( x
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         & g, Y7 o- U- C+ }3 _
}$ s" P9 [: v, [8 D
6 N) ?) D9 ]* g7 ~) q3 g5 M  p% X

4 `3 A5 L+ D5 G. p# R0 i//定时器3中断服务程序7 i1 Y$ |  A2 a- n" @
void TIM3_IRQHandler(void)   //TIM3中断3 b3 |6 ]( d$ |" Z1 M% q# O5 q; K
{. i/ W  P& Y7 O9 u
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
; v  j+ n: I9 Q1 J' X                {
6 ^! v2 ^% e* L! m) {# z                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 6 @$ S8 Q( b* M" `
    TIM2->SMCR ^= 0x8000  ;
. Z1 s4 v4 y9 l( u) q
+ e5 N+ F) [7 q. R                        EncVal = TIM_GetCounter(TIM2);
) \7 }. @2 a/ y7 }5 i1 k/ U$ d1 a: R: B3 J& c6 W: Z# ]5 C) h
                        if(EncVal>=240)! Q6 e% A9 }" n% B1 t
                        {
" S% P$ D: ?: q* j( a         EncVal = 240; ) p. ~+ K" u1 S* A- g
      }- n4 D  y( T& M
                         LCD_DrawPoint(i, 5+EncVal);( h" n; u/ A0 V8 b% m& J. W! D5 n' t/ r$ [
                         if(i==320)
7 [! r* M4 B6 P2 @" O                         {  * Q, @$ `! a( i
                                     i =0;0 o4 g" |# r/ C, L
                                LCD_Clear(WHITE);        
: e7 a1 J. E2 W0 ^! X6 C+ K9 X: A+ ?                                     coordinate()  ; //横坐标        
$ p$ ~7 Q+ a; c1 f                                    
7 q- w) J0 C# T' |  ^             //delay_ms(50);                                
" v( V) Q1 R& i                         }
% ?/ d2 R0 I3 Y- ?5 E& \! A2 [5 _  N% K                        i++ ;
1 D% t- W! ]9 {( C. M                        TIM2->CNT = 240; " @( F& Z( P' j5 r: P
                   Frequent() ;
* i/ B# u) s  L2 n6 B7 w( o4 g     //fre = 1000/(90 /(720*100/72)) ;                        
' _& c* B7 W+ X- p) n                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 |9 {* \9 f% @( U- w                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
3 O) x5 x& o7 {. v" D                        //LCD_ShowString(200,200,200,16,16,"EncVal");
! s* m# K: A* Q  X8 d                        LCD_ShowxNum(250,200,EncVal,5,16,0);8 o. q: U# v/ |' z" k* }9 ~+ V
                printf("%d\r\n",EncVal) ;
# L" k3 M- ^5 P/ S    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值) Q+ {: t/ E4 r% f) ]2 P% r' H3 z% b) j
                 }: C: _( P% S: s" a% T; ?
}
4 f* Y) a( M1 o/ [% u- N; ?
$ ]0 U4 T+ T/ V3 G

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 | 只看该作者
好资料,果断收藏& \0 z% {4 y, V7 ~/ A; r1 ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 20:59 , Processed in 0.059966 second(s), 34 queries , Gzip On.

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

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

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