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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
7 ^/ a5 P6 z' P" P7 L8 J7 ]( I: r& S0 C
void TIM3_Int_Init(u16 arr,u16 psc)4 t$ d9 i0 X! b% L0 n) l
{" V, j, X( ?% O7 s/ J+ C7 H! `
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
; t" }- e/ n) ]) R. P. b        NVIC_InitTypeDef NVIC_InitStructure;
$ D0 b7 V) l3 X
$ j$ J$ a' u/ k2 O. Z        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
0 i5 ?; H/ P% ~" R/ Q8 G        ) i5 F# \! y8 U5 B8 n( |
        //定时器TIM3初始化) m8 @* e; D* }
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        & N/ F( a' u; E0 h: T9 T
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
' K' R( N  B7 E. `        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim. v# U8 ]& @4 G( T
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式! F8 B( q" s* P; }8 j& S
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        $ M2 _% N& ?9 ]) F4 W* V
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式/ F1 w7 k/ U6 v$ h4 d* I
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  ?3 N: M# K# p( q* i. b
6 D" P$ ]. G0 G5 @        //中断优先级NVIC设置- z/ _5 {9 o' r1 v
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断6 Y: ]5 S& b2 t! \/ s
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
% \# E; I) O, O& [' u7 S4 m! |: g! D        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
0 @8 Z: m& [" {  t1 K6 N* Y! G        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能6 h) F( p7 f* P/ c
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
% |9 o/ ]' `8 n9 P
" A* r  m: G+ p/ K6 a1 l) x  //TIM3_Encoder_Write(65416) ;
2 r8 c4 J% m! c1 u1 Y5 V" b        
* T3 t/ V  \4 X% n        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
2 w1 u6 l2 N5 W  r}
$ Q+ b3 T' F! z8 L$ m# L: A3 Q6 e6 p# ~, ^9 |( I. r4 M
1 g" G8 f# j. e8 L; K

! M1 l6 E7 k& W6 ?/ `% b! \/**********TIM2_Encoder******/5 `' {3 ]! O* _/ D

$ Y5 p* j) o, P. W! j; Q6 dvoid TIM2_Encoder_Init(u16 arr,u16 psc)
+ F3 G( {, d; a{
: Y4 v8 P2 V6 ~  F5 |3 w: ^  H  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;! d5 l9 _- |" z, |
        NVIC_InitTypeDef NVIC_InitStructure;! Z# v! O0 e$ [/ U$ `/ ^8 F
        TIM_ICInitTypeDef TIM_ICInitStructure;0 |0 K8 _# g9 n

: J  f% y0 ]/ g: Q/ ?- v" }        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
: U  P! ^# {- V  e' O        9 N! E7 w1 T2 l* e" n) W
        //定时器TIM2初始化, z+ }; U: K# m# c! m' T3 {
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
7 A9 h6 `" E6 a* b        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值6 `6 s/ Y& G. q, X: }" v# D
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( ]) E; {+ {: N( A. _' M7 o" L
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式/ J* x7 {5 r9 D5 q! e0 Z+ R0 h
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位. }5 h# d4 n3 H
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值9 _( {- ^* ]8 m2 H- `* I

& j- s# {! j  e6 x" b  g* e3 j; y        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,
! a5 @: U5 p6 a% X9 x                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);1 @& h5 J3 l) ^) |% O
        TIM_ICStructInit(&TIM_ICInitStructure);
' P) v* u: W* I9 F, }5 k; u        TIM_ICInitStructure.TIM_ICFilter = 6;: [1 |- y. D$ |3 j
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
+ ?! f; V7 j- T; W5 R% j        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 . s* \: ?* F1 l  @# h. N4 p
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
( ~8 T. h, M3 G3 H2 O  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式# C3 f/ q8 j- P
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
# ^: W5 F! P  O2 |* C$ |. V  Q, D! V        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断$ D) i, f, b4 \3 V: |2 K
  //TIM2->CNT = 120;$ [+ F% f8 {6 l
        //中断优先级NVIC设置
9 q! f5 b% z! L        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断3 O6 ~; I$ g1 G% {* z: t
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
+ E  `- ~" V! l2 G  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
; A" |  E5 R/ L        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
1 [' k+ Y; E  o# A* P  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器, ]& d* Q: w1 L* d& ?- b

5 B+ Y- t5 f/ c+ n3 h; p  //TIM3_Encoder_Write(65416) ;+ C* T! j. u3 F" d$ |. I
        
2 }& I; A' d1 O0 J        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         & S% M- X- W) ^. v
}) e, z7 I* C3 n

9 {$ j* g3 N4 Q- m9 [) u( T) R5 l! l+ U: w: ]$ I
//定时器3中断服务程序+ C' Z. j! K* z! R0 z
void TIM3_IRQHandler(void)   //TIM3中断
" C3 X; K5 A4 K1 L{
7 r! Q* h9 f5 A7 P        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否* k  ]; n# C  ~9 V6 }$ p. n
                {- P0 E* C8 h+ p& g# j6 W1 d
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
0 u/ p. M4 `3 {2 _4 v    TIM2->SMCR ^= 0x8000  ;. Z7 T& z. y6 x+ o: j( L

8 j% t9 c2 ~& o1 j# Y- A                        EncVal = TIM_GetCounter(TIM2);) J+ V3 k2 V9 ~  g- Z* f! @, V3 ^

7 x5 _0 `- r( B                        if(EncVal>=240); b: c$ r8 h" b# l- ?* Q( }: D' n
                        {
( l6 I4 ]! R$ r2 M+ R% g% _" z         EncVal = 240;
! ~& c' q! j; W, R6 q' b      }
0 X: ?) B+ `" T7 ?                         LCD_DrawPoint(i, 5+EncVal);
3 z6 [4 F" C1 _6 V% l1 B                         if(i==320)5 i! r+ c! G7 i& J7 Q0 W: [+ p
                         {  
9 z/ R9 H& _& x8 [' f3 t! x6 q: z                                     i =0;
, L, Y4 G9 M8 I  V: l4 f                                LCD_Clear(WHITE);        
; S2 e7 B2 L! p2 R! e" z, ~                                     coordinate()  ; //横坐标        
0 P# k5 K8 l* ?! W( i9 U                                     ' D- f( A1 v9 c1 t
             //delay_ms(50);                                4 m# Q7 A( [" |" D/ g. Q# G
                         }* M% `9 `7 _  ~# N
                        i++ ;
$ }( |: R8 p- ~4 _# d' e                        TIM2->CNT = 240; - p, O6 a1 [% v5 P$ K
                   Frequent() ;6 z" b! W" z. x* F' O! z, G- c
     //fre = 1000/(90 /(720*100/72)) ;                         : s+ T6 x' O& O0 G) g) |4 o! g$ h
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
- {: x! D  i% i: j/ f7 V                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
$ ~* u+ Z- H8 E: q6 X: y( c7 q! O                        //LCD_ShowString(200,200,200,16,16,"EncVal");2 h: o$ M; M1 ^: h
                        LCD_ShowxNum(250,200,EncVal,5,16,0);8 S3 t" C3 p) C! k( z$ C
                printf("%d\r\n",EncVal) ;/ Y# B/ ]* l0 T: x" m$ f
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值6 H$ L- M% \/ d5 p, A
                 }, a" ^/ b  o. U5 P! U* M; E+ T  `
}
9 E* ~& b5 L* i/ v9 m
. L+ e5 T6 |! b$ J0 s9 K0 F

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
) V# d  M# S; @. I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 23:07 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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