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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
: n& C! w! y6 S- {' ~' M- y# W3 T; I# U% C
void TIM3_Int_Init(u16 arr,u16 psc)! E3 g# p# ?' J" U5 k; |& O
{- X) a1 I& y: U4 Y; X
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;& S* k# X# ^' g, A$ @0 U
        NVIC_InitTypeDef NVIC_InitStructure;
" L+ k1 S2 Y+ ^# F) K1 x( e; l% m% u+ R0 R) ], B0 E. P
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能! S3 T, D9 ^* j4 |4 Y
        
7 _' H) L; ~, F' p' M. Z& g$ [. g        //定时器TIM3初始化9 @5 F9 ~; l! U% s+ b
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        - ~% u$ K1 s5 L1 j: m
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值. g4 t1 _% p/ _. R8 X, G, R/ @; `
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim( j9 C& A7 ]% S8 S# b
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式! t4 N) z! H, ]) H5 J7 H  V9 }! G! M
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        + c6 f0 y9 c  p+ Z  [& W& J
// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
, {  G% G5 |8 O! d3 U        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
' T! h# ^0 Y4 Z: ~/ J" p1 U. q- B, R" q9 ~
        //中断优先级NVIC设置
1 A* e7 l" a  X: H        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
7 n* x8 T* `2 x5 `+ x* M5 [$ E+ b        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
5 W) P; k* C: j* |0 h( R( q        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
5 v2 e% N4 g9 B" W) U7 `. b/ Y/ t  j        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
7 q3 g# R6 X' }8 x8 t        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
3 ]! S3 d0 T4 P  k
1 s* T: z4 A8 r7 n9 h" n  //TIM3_Encoder_Write(65416) ;( A0 H( F9 w& a$ L) b! E, T
        4 p4 x& H/ H- x7 I2 t
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         ; w4 x; ]4 I3 N( Q! H* ^
}2 s* E6 g1 W, X6 Q
3 G- N, c& r  {" l
: S1 b; Y6 V0 n, T8 z

7 I+ t( e/ T3 n3 m2 ]/**********TIM2_Encoder******/# l5 g7 [# s) O( a5 T! I/ \# P

3 s5 Q- P' J- g; Tvoid TIM2_Encoder_Init(u16 arr,u16 psc). o4 I# ?& Y5 Y; v/ T$ P* ?
{4 c) x/ Y( R( `5 p1 B4 z. K% e
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;! k7 M- @$ m9 l2 W
        NVIC_InitTypeDef NVIC_InitStructure;) r% `$ D7 y4 `  u9 D% H! [
        TIM_ICInitTypeDef TIM_ICInitStructure;
, }$ [2 x' Y/ D4 E  K3 I
6 v$ r- S4 }4 p/ C) i" Z        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能  [. y/ ]- ?' L0 f9 }6 t
        
; Q0 {8 f; ~: _6 ?7 ]5 c5 H0 @6 o, ^/ ~3 d        //定时器TIM2初始化
+ V, N' W* |- |% I, V        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
- j0 ]- D* T+ t9 e        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值6 ^! h4 D9 |4 E+ [+ X8 ^
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim8 n: C9 ?' J6 T$ ~0 A( x# r
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式1 z" Z4 j& R- W4 R+ Y1 T/ v0 N: V
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: Y4 Z8 `! N/ z+ {  y
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值" Y8 R5 X! X# E( [

( X" \5 {7 P" X        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,* |' d+ I( I" G% F; X- L  B  _0 x
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
. q" W7 H% S1 J1 L        TIM_ICStructInit(&TIM_ICInitStructure);
7 x, D8 s# Z( N) e+ c        TIM_ICInitStructure.TIM_ICFilter = 6;
, g3 T7 W7 a2 P0 c" \- D/ b        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获8 X5 M  F% M  u
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 - B1 l# Q& M3 Q' \6 l1 H% C
        TIM_ICInit(TIM2, &TIM_ICInitStructure);& N- g* l, I8 Q: q! c" f
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式% [0 t% A( S" c0 W
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);" |5 i7 `) E  `5 D
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断& c) e" T8 E, Q9 J$ T0 J; y
  //TIM2->CNT = 120;2 P( D6 l- s) \7 G5 l& A5 `
        //中断优先级NVIC设置
1 \: U+ D' f8 |2 i( y) u        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断2 P7 Y2 R. t+ u" h7 t( c  \
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
/ K' X# i4 Y; A  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级& G' g! r) v( H
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
) e7 w9 N4 }: ~( U. h9 ]  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
! Z* f$ ~& n) c5 }6 J* p' Z( d4 i7 `
  //TIM3_Encoder_Write(65416) ;9 I% b# v. f! g+ |
        
3 [6 u! [8 K# m$ e% k; ^) b        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         - U, t) f4 s9 d
}
  }6 F& q8 u; U# Q# i/ t- I6 W# D# F7 q; R9 U) U/ u$ R
7 i3 I# R& [1 U& \
//定时器3中断服务程序
- }4 N2 ]& t; m% T: Gvoid TIM3_IRQHandler(void)   //TIM3中断6 B/ f, P$ ^( }9 p
{: J4 L& G5 k# y
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
* ~  a$ p( u. y" e& i                {
: R- ]  }, Z* ?/ m/ t, I                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 9 V- y/ z5 _$ R$ Z
    TIM2->SMCR ^= 0x8000  ;2 o$ Z. o8 k$ H6 C. Z# D  t9 |! Q
- {% E& ~7 ?! J) s! R
                        EncVal = TIM_GetCounter(TIM2);
# m2 N4 M7 k9 N: O; c
1 }7 \* M2 w. m, p( G: t8 U                        if(EncVal>=240)4 r7 m$ o' e- b# I6 i6 G5 O+ ?
                        {
% ~" |' K( x. C8 I+ D9 f$ ^         EncVal = 240;
- u9 T) m) h2 ?/ g      }6 E: _. K: B- R/ ^$ C
                         LCD_DrawPoint(i, 5+EncVal);0 r1 _. ?9 Q7 q) c  n$ J1 w, `
                         if(i==320)
0 z3 _0 P& M9 r& Q" v                         {  / F: q. |( a+ H/ i* i3 ]) E
                                     i =0;! Z9 g7 \5 \. _0 g: O
                                LCD_Clear(WHITE);        2 h: z. R/ w! z( F# i
                                     coordinate()  ; //横坐标        
( t3 y! J% a0 \1 Z8 i# S- h                                    
7 z# \; p7 X: ?. e8 L5 x             //delay_ms(50);                                & x" M  R7 d0 r5 a( k' z( S
                         }4 q; }' t" H1 e2 o
                        i++ ;
. U& w8 y& ^% ]! l1 g) M* e                        TIM2->CNT = 240; 8 D: M- r9 z; q6 p
                   Frequent() ;( k8 W# P& o! j( t& H
     //fre = 1000/(90 /(720*100/72)) ;                         : b  a+ {5 h* ]! J+ i
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。0 d! h2 M$ t0 S/ p$ M- ]( e/ }( l6 G1 x
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
5 v+ m+ Y* ^7 f                        //LCD_ShowString(200,200,200,16,16,"EncVal");5 y2 V/ V7 b* Z' h4 g1 t
                        LCD_ShowxNum(250,200,EncVal,5,16,0);
4 ^: q, k2 ^$ x" u" r5 |                printf("%d\r\n",EncVal) ;1 ]: {2 Q. E( \" H% E; _/ Y
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值3 n" v# G' n6 _
                 }
) a  H: }4 _# g}
3 u% u+ |- Y. u% n: S5 s( B( {0 e1 B, W0 v7 ~9 i

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
3 h3 P! J% D* y" z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 14:16 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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