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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。5 r& z; \8 C! Z2 m

( W6 L+ `1 p, {) Ivoid TIM3_Int_Init(u16 arr,u16 psc)
3 j, ]! v: P/ B; ^{
5 f: ]7 @$ d! g+ ]  T) r* `  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;. _5 o/ T  f; }8 [5 `! p* t
        NVIC_InitTypeDef NVIC_InitStructure;7 _) j: ]9 f7 i) u

3 e5 ~5 V5 Z/ o; D        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能5 R) @2 }  Y6 b1 g3 [2 A
        3 @; P: @# p2 ~) A# ?$ @2 B
        //定时器TIM3初始化) [9 Y: u5 ^* \! N; W1 a# {
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
, s( n5 E  p" m* @        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值0 `' C$ K0 A5 n6 |5 o) G
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim5 N8 V4 I2 p- T, w
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式( h8 c: K  d. U: b' n1 c
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        ) s7 ]- q: ], A# h9 Q- m
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式9 D5 m: g/ B- s% u8 R! n
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 i5 w) e! `% W% u4 U
% @8 C9 k9 r* H% v2 ^0 y; @
        //中断优先级NVIC设置2 b, F" I* F# J2 W/ k% W' d
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
) A8 t7 J4 N' [        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级7 x, }- ^$ I& v. k& s- G. j
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级3 V! B5 Q8 y/ H( `2 B  h- I8 v
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能% [( e0 d6 W5 F2 d4 m4 l: M8 a
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器' c# _; T% L3 O- X

/ y! p- C1 s( O  //TIM3_Encoder_Write(65416) ;
% O# M+ s: _5 n  L0 J6 i        
7 h+ G$ H1 J5 c* |4 o* C, I        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
* a! M4 E3 ?3 M' u- c8 r- b# i}3 z* i1 [2 {5 b3 F. q
* l  W* W0 i3 ?" {4 p5 t+ D

0 m6 }7 H! g& Q* ^0 l0 A7 ?
: y  N- y3 U, k/**********TIM2_Encoder******/
. T* N) o% O. H8 F- k4 a9 B; ~8 R" Y1 J" h4 s$ t' _$ x3 [
void TIM2_Encoder_Init(u16 arr,u16 psc)
1 @: o  T! l6 N' T1 B{2 g# P7 c$ x! k/ I
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  g! ?+ _1 J/ t6 n( z+ T
        NVIC_InitTypeDef NVIC_InitStructure;7 W) g1 k6 i% L2 H% L; x" \; v
        TIM_ICInitTypeDef TIM_ICInitStructure;
0 f4 Y# }! j6 e! i' O$ M2 a
6 V. h) k  o( J! t        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能" A9 W4 |+ Y- p( T
        % ]9 }* m) v% }$ U* N
        //定时器TIM2初始化
4 S  Q& Q# Z! C9 V, y( Q7 Q3 g, ^( B        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
+ W( R' T0 z7 G3 h        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
& o. U! h2 d: G( n+ c1 j5 a        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( P! F9 z4 c7 y8 }, H6 L, n  n
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
$ e, i4 v; |6 D3 s7 y/ r        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位& ~5 O9 ^1 {9 M; `! v$ @
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
9 Q( H! c9 a4 d- k& z3 j
$ q7 Y# v3 }& z7 y- X4 f        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,6 ~" l! Y# B# b% a
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);% S2 E% x- F! q" Y2 v
        TIM_ICStructInit(&TIM_ICInitStructure);; n5 I  K& d, M3 b( `. R
        TIM_ICInitStructure.TIM_ICFilter = 6;! K1 h7 @) L8 r
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
: ]* J5 {# [4 t        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 . v4 I- g8 n* k- _8 H2 z
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
5 o- s' j; {  Y  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式, t- k7 H7 ^6 ?9 b+ Y) K4 `( O4 O
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
# I+ n7 W# ?" f1 ~' z& K        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
5 f+ d2 p, d& ]( [8 c& J5 @1 u9 W  //TIM2->CNT = 120;
6 C; ^/ A, Z3 A3 H5 a: G2 t        //中断优先级NVIC设置9 }: N. G7 z0 K
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
/ ?( h  t) R% D, B8 W        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级# m: g; _8 X' e$ D- p7 T7 J( `1 |
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
2 H1 Y2 J4 _. D; |" }        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能/ Z4 G: F) s; `2 y# z
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
1 [8 v0 R8 ?8 t( R9 R' z  a) G( a8 q8 A' ~7 [. m$ E
  //TIM3_Encoder_Write(65416) ;8 N: ^+ L" y/ N+ @9 }
        / R2 c. u" Q" N; u
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
' N  M& V- E* x; n4 \2 o4 U}7 O, b$ g: c- F) `! N7 H
2 i8 {1 R/ {- b1 \  X% ?0 a
" l6 ~# X. R! z/ y; l
//定时器3中断服务程序
# r, T, H& i! M2 @  n8 xvoid TIM3_IRQHandler(void)   //TIM3中断' d3 A! u2 T8 z  y$ l5 o0 p) c( C
{. b2 q, |  ~- W6 V; l
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否( N: ~0 u: l; g6 u
                {) N' E# X4 w; o" \
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 1 e$ c: J6 D3 Y  S; D2 y
    TIM2->SMCR ^= 0x8000  ;( r2 X( E  x+ b9 H

; A4 p2 @3 Y# b) k* h                        EncVal = TIM_GetCounter(TIM2);
, ~* ]0 u$ \' y3 }" P3 c6 Y- g* ]8 ]3 J" u% V
                        if(EncVal>=240)$ x! \: @; v* F/ J% J  ?( k
                        {
# ~0 R1 F2 o( {6 V2 E$ y* a4 m7 M         EncVal = 240;
$ {4 m  \4 b5 p6 H4 S( b8 R( x      }$ s/ z0 k" i; K( l% y
                         LCD_DrawPoint(i, 5+EncVal);
! R9 m4 {- _  d                         if(i==320)
9 ~2 V1 l& X# ]* \' n  [                         {  
0 c& d% l$ g- k, |+ h7 s                                     i =0;
2 p2 o8 k6 G9 p4 b/ y% U/ z( @                                LCD_Clear(WHITE);        
% f6 s5 d5 y( L. e& s, i                                     coordinate()  ; //横坐标        
  [5 \; p3 q) b( v7 w' N                                    
; h% S0 N, e8 V+ W! H4 D/ K# [             //delay_ms(50);                                
% K$ I$ d9 b  X% Y" U+ j                         }
  u6 C, \4 ~& A6 A! f                        i++ ; ; {+ }1 A+ h, p+ |5 [
                        TIM2->CNT = 240; $ m- z3 [- S/ ?! X- l. B4 V
                   Frequent() ;
) M9 i: @. X5 Y+ Y" R     //fre = 1000/(90 /(720*100/72)) ;                        
7 K+ S0 C7 H5 W$ {                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 x2 x$ P( ^" m  u' K0 A+ I0 g                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);2 o0 a* E& r1 L
                        //LCD_ShowString(200,200,200,16,16,"EncVal");
) k* D3 N. f7 l                        LCD_ShowxNum(250,200,EncVal,5,16,0);
. L' o/ P" w$ p# ], v                printf("%d\r\n",EncVal) ;$ Z' r6 d6 n5 [  @: c& h$ o# C9 J1 i$ K
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值! P% J7 v- G$ s( |% v2 ^# D* G; D
                 }6 K( m: {  I, z3 W
}
9 w7 Z  B1 n# C  X$ S/ Z
6 i; M2 o5 ?* m$ u  v2 R$ y

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
" q0 }' d4 ~% E- F  L/ Z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-17 14:08 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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