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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
6 b' i7 t) ^. A3 z% \& P8 P0 |8 Q2 q
void TIM3_Int_Init(u16 arr,u16 psc)6 W% i2 t7 o) k! `3 _3 A) L+ I0 ~+ d" d! X
{
( u; `2 M/ B  _+ z  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
% I& w8 j5 \7 }5 o8 m# X$ Z8 E        NVIC_InitTypeDef NVIC_InitStructure;, v6 Q9 Y; u/ W" t- n4 _6 H) I

3 h& h2 G) _  P7 [        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能9 J% W1 X  m  W2 r! R* ?4 {
        
9 }# g0 H3 U$ y7 E8 I0 [2 V9 c8 `        //定时器TIM3初始化# h; N& O4 p4 ^) w. g- t1 x( \
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        0 ]- T% t- i) X0 A) x  B9 h! [
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
2 ^% D; p) w; `8 ^& B2 F        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim$ V. \8 j  c0 M: o9 a) s7 |
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
% r& k  n- I8 K- M' l        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        . p  Z* M$ \& }1 G8 Q) R  J
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
$ Y3 V- `* L4 K        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
1 F3 J. M) `( j( s+ r4 W$ A8 d- |( w. }( z3 R( ~
        //中断优先级NVIC设置! C* I9 }& ~1 E4 ]& W' _( p
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
1 N. B: b- p0 ?0 N        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级. s9 m6 @- p6 x. q' z
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级# S1 t0 }- k0 k$ u% F) X  m
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- s+ t4 A7 ^; q, ~. l2 f( `5 N/ P        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
; q$ W6 f! Q8 k4 d' @1 b8 D% ], A1 z! c/ l
  //TIM3_Encoder_Write(65416) ;3 y+ {1 }" p& N
        
- N: H, d# E$ G        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         3 j' r# A6 Q3 u* k, Q& c1 b" W& D
}
) o$ p: m& L! v& ~
0 Q+ h: w9 {1 D9 n5 K/ r2 c& ^2 C) b
. `- i# ?( G% L. b$ u0 Q4 j* N2 G
4 o( b0 p1 p5 w4 d  Y/**********TIM2_Encoder******/
0 z0 o% ~8 M, c. x# y1 I# }6 {) u/ ]3 _- h# {0 V
void TIM2_Encoder_Init(u16 arr,u16 psc)
8 A0 K/ h7 H% y: N{% j% g4 ~# T  F
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
! A' z) G, C* r6 V( z/ f# B        NVIC_InitTypeDef NVIC_InitStructure;
. b  w5 ~, I$ K7 R( o- x        TIM_ICInitTypeDef TIM_ICInitStructure;
" K3 |# o  O5 g" \" [/ Q% ]. X7 J" \& O4 y( H- P1 K3 S0 X' l) G
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能6 N# x* s$ P1 D+ G: m
        
  ?0 P1 Z; E8 {) x* i& }& @        //定时器TIM2初始化7 q% s: P" m0 p  l# g
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        1 F5 \. w: t" l. [1 P
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值' l* ^9 C$ m) [+ Z
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
! q! F4 u2 K8 Q        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
0 W. R/ v. d& r$ f' N  x8 c        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位1 C2 s, _& T, m& F# ~* ?
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
6 d9 l3 M5 r2 g4 j3 Z5 E7 B9 E" Z7 L1 Z* L" a
        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,
1 [' |5 N8 z/ r$ C1 K                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);; Y) j- h/ W. G0 Z
        TIM_ICStructInit(&TIM_ICInitStructure);
" Y2 M) @1 C0 i  G$ `- E        TIM_ICInitStructure.TIM_ICFilter = 6;- Z( ]( q3 d! n$ W8 |
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
& s) R9 Y6 |) R* t& K  E        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
1 M6 ~1 h! `1 x        TIM_ICInit(TIM2, &TIM_ICInitStructure);
% M% `  ]2 k' ^$ J% {. b  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
7 ^0 \) e$ ?# `  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
. D6 U2 z- ~, y4 L% d9 Z        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断* P' E  v) `6 ?) @- G8 w
  //TIM2->CNT = 120;
* s& Y' q* s" J' E        //中断优先级NVIC设置3 E4 u3 h) I% X  ~$ H  ~
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断/ J) m. z4 I& f: O" Z4 ~: H
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
7 e  y: b. z# |. E$ E  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
3 I, [! H% h+ Q% I4 p9 ^+ l  _        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
, n# s3 C! t) l6 h( Q  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
3 q1 H0 p& T% B0 a
* {3 d3 g7 t/ B2 G' a  //TIM3_Encoder_Write(65416) ;- y+ Q3 o4 K  T6 U! z: D" k
        
9 D& x6 ^  D  `' U        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         . Y5 O6 F, Z; u: `" }
}
( B" p6 t! g' J0 E  M. C4 X
2 j) s3 `( x+ F3 v) D9 y* {9 l% I) m; s3 V. s
//定时器3中断服务程序* Z$ J1 Q! S* }1 {+ F: Z4 Y1 {% N
void TIM3_IRQHandler(void)   //TIM3中断
9 y5 G8 H7 y% N- ~& E+ ?1 {, [{
" m6 g( a; }6 J- u3 l: ^, J5 r        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否5 k0 v' L0 Y( v
                {/ t: Q' n- {' O2 X. u( e
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
) i7 l: }3 u  c2 s# S: I* W: Q3 W    TIM2->SMCR ^= 0x8000  ;
5 H" f6 i3 ]6 W" `3 A& t8 b3 Z
; I0 c* w) }4 L* d8 q- f                        EncVal = TIM_GetCounter(TIM2);% ^4 p# C5 a: C4 g* K3 \6 r
% E% P5 i2 b. I7 N' s% B6 p
                        if(EncVal>=240)
$ ]3 u( ?5 Q4 u4 k- L/ r3 Q; H                        {
" G. U# Y* h: ^+ h# M         EncVal = 240;
4 E+ W/ ?# ?( ~- I8 b      }( o# [1 y: B5 J
                         LCD_DrawPoint(i, 5+EncVal);
7 n  r4 E4 B. ^, p4 p                         if(i==320)
9 x0 Q6 l2 X* {% }5 [                         {  : v, \: N8 e# `) {, ]  `/ M
                                     i =0;* J$ _$ k, _) M7 U7 M2 B
                                LCD_Clear(WHITE);        2 e# N* z# |9 r
                                     coordinate()  ; //横坐标        - r$ g- b2 Z, U# w) I: m
                                     ! Y7 m# k1 j  i: `+ i
             //delay_ms(50);                                
5 @7 c8 _5 K* o9 v: T8 \0 b3 V# K                         }+ r) T& p: Q: B5 X, X$ b2 J
                        i++ ;
( k+ z* t5 u4 a/ ]  M  x                        TIM2->CNT = 240; ; g- ?/ O3 [* m- E" k
                   Frequent() ;
* j0 V# V2 F6 N% }     //fre = 1000/(90 /(720*100/72)) ;                         5 P6 z/ v( L1 R5 r1 D  c% {
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
" L6 g: d; j) w, ^9 ~                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
( V" _: C% P4 o" M" h                        //LCD_ShowString(200,200,200,16,16,"EncVal");  Y+ z" q( J9 Q- ]9 j# [2 E' M
                        LCD_ShowxNum(250,200,EncVal,5,16,0);
) Y" g& z. H% p) N                printf("%d\r\n",EncVal) ;
% d/ m* h# C' h# h* d/ V    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值! U3 ]% C% x! C+ W
                 }9 i" H/ B; d1 j: o3 j8 F% q5 L
}
) S9 W% X/ ~) F. i) j' ^0 d1 {1 w! S8 k4 b2 F  X' _; C

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
& a+ j* R4 H. G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-11 22:55 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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