找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 358|回复: 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两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
8 _% m1 N# ~& J% v: h& D- ^' @5 X2 Z. W2 c- [" N9 b6 G
void TIM3_Int_Init(u16 arr,u16 psc)5 J1 r) g) B& z3 e
{
$ Z# w0 o/ ]2 v2 n  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
2 |" i# E( H5 B* ?- a* o- O& \        NVIC_InitTypeDef NVIC_InitStructure;7 [/ \  D' ]) I1 f) m
3 l* D& h4 A. ?8 I" }% A
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能& K  u1 G  {7 s6 f  D
        
) J/ I7 @* b2 N        //定时器TIM3初始化
. W3 g  K. M! f4 y$ R# s* L        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        ( t: t. a! E4 O
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值8 I& a, I" X( A5 j: N( _
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim+ \7 m- p3 Q, W. j$ \7 G
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
$ P1 P: f: Y& \# O        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        
# V; `: k! Q8 ?  z- l. B// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
  w2 D# W3 ]* h# o( g  p; c9 A4 ~        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断4 e( w2 e' j+ S6 i
. a5 C; {! b  x+ C/ O7 B
        //中断优先级NVIC设置
8 ^( s, h5 \) _8 J* {        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断, K0 K( s: y- Z1 F/ V* T
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级4 r2 H6 X- i9 a6 w
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级9 \' i9 m) G( S, C$ C
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
/ Z: ]0 R1 Q, |' b        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
0 A6 f+ @( W* s' D: |( T, l
1 \. ?3 B; A1 {- l  //TIM3_Encoder_Write(65416) ;
  |1 a: T4 |0 f5 r        
7 T9 `3 |- V2 o* K# J/ n        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
3 q2 m$ s& Y* B( h* E}
; m# n4 V1 A7 [0 l/ V7 P6 N9 q, f" O9 S
0 n& X2 q& h8 i) ]' m* v+ S4 j
2 P9 y4 ^, ]$ b. p! @( k
! n# }2 }3 @* D% c3 d/**********TIM2_Encoder******/9 h- K, p* E( E
7 e8 |5 \) D' Z
void TIM2_Encoder_Init(u16 arr,u16 psc): A/ U( M9 X9 h' f0 k: u# `
{
- j7 i: u  T  C  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
* T2 x3 g( L; I) S5 h% _        NVIC_InitTypeDef NVIC_InitStructure;
2 \  W5 H: u( }; H9 H1 ~% W& x& h        TIM_ICInitTypeDef TIM_ICInitStructure;
5 {; w/ M  ^; G: V# S) J% `# r
; R3 ~" [- }8 @3 j. ~- y        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能  ^. r) G) p' n0 g& [
        2 B: n  n0 T& v8 Q: v0 ]
        //定时器TIM2初始化# y& P1 S% ?! ~
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
# J' E* A: z: _9 ~& w        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
0 X, N' j% B+ |* F        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
) Q% a- K% e  u; B" y0 b, `% }        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式+ A2 I  V) N  Q& z/ i, ^  g
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位: K9 q0 M5 r! B* U
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值5 _1 D" k- A' q1 c* @8 b1 j. j. e
& ^) `, A8 T) G& J7 x2 @
        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
& v6 e$ K& ?$ T7 b: _                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
2 F' Y" D- g0 s2 j7 O6 n# H        TIM_ICStructInit(&TIM_ICInitStructure);; y/ L" ]" P2 k. p) }
        TIM_ICInitStructure.TIM_ICFilter = 6;9 n% u( ~( X% z' H; h. K. ?
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获4 J4 `; |& l: y# O
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
4 _8 b- @& D3 ~0 i5 l        TIM_ICInit(TIM2, &TIM_ICInitStructure);: d, T7 P3 `, L: j7 G
  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
- n5 I1 b+ B2 _$ W  TIM_ClearFlag(TIM2, TIM_FLAG_Update);( q) s+ J( N5 y- x0 g% Y% `
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断- k4 K5 W3 K6 u) @3 B3 j
  //TIM2->CNT = 120;9 Z) r& [" d) a; ~" g
        //中断优先级NVIC设置
8 p: q8 ]$ C/ j4 G% q8 _        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
" r, M4 n( `$ O8 P! l4 \* W* |        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
" z9 G9 _3 [# W; ?, _) W2 i  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
$ k- m7 m. Y0 p! j9 _  y4 c        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
; ^% z! }9 {* o7 C. o  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器- e8 G6 |$ ~2 `3 ]1 M8 T

4 z3 s& E8 o. N) H  //TIM3_Encoder_Write(65416) ;
3 b3 h5 g$ z4 c7 @        4 u" d2 V4 W3 T: b( o5 m* x
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         8 w; [6 q' R+ M$ D1 ^
}# ~. O+ Z( S$ I% o) N7 i1 d/ W

5 ^0 U' h2 O& S0 W( {
6 G3 \. \* R5 P* R//定时器3中断服务程序
5 V  F& z: i% ]/ Yvoid TIM3_IRQHandler(void)   //TIM3中断
: x; g  ^  w# A0 S8 u2 w1 C{
7 a; E5 S( t  \- M  {        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
+ [' _# Q- Y4 p4 m+ \5 E/ I% F                {
) }7 ?  C# K9 A/ q( g' X                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
( A+ t1 {  ^! e    TIM2->SMCR ^= 0x8000  ;
, v8 |' f5 N# p8 X: o9 a8 b7 a
                        EncVal = TIM_GetCounter(TIM2);* l" u4 j' M9 Z4 h

! p3 Y$ d# g6 V4 p8 v3 S                        if(EncVal>=240)
, E# [0 ?- c: U) R0 D/ {                        {
" U* |$ \- p- U& Z; j# \4 T9 s1 w         EncVal = 240;
* A% Q, M1 l6 l& U$ q' _. k8 y      }9 Y8 e$ ^  D2 n4 Y' h$ ^) S( [3 n% l
                         LCD_DrawPoint(i, 5+EncVal);
' @( o  k; K- b7 V- u% }& @                         if(i==320)
) `. b% v% C1 E. {                         {  : o  ~+ g5 m5 P% Q8 B* }5 i
                                     i =0;: C, y. Z5 V6 H1 x
                                LCD_Clear(WHITE);        
" x  [1 N* _% ]: P                                     coordinate()  ; //横坐标        9 @% \1 j* i, v8 M% T
                                    
+ W4 M' ^& h- ]* c  u3 X+ k             //delay_ms(50);                                ( l% f' \' x2 t; P2 ]$ S
                         }7 u7 ^, V3 B, V0 Z+ l
                        i++ ; 2 d2 P( h4 M% c8 p  J* Z" J
                        TIM2->CNT = 240; 2 x. C* T' O2 S! x3 Z% i: y
                   Frequent() ;
# _' Q; T$ U* b2 A# L! [* O     //fre = 1000/(90 /(720*100/72)) ;                        
" k$ M" ?& A( e2 n0 V7 |9 G( k8 F                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。
1 ^- S/ O' B. M) z) O5 F9 W                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
6 h7 w! Q- H) Q$ X! h                        //LCD_ShowString(200,200,200,16,16,"EncVal");$ |, z) l# H/ R8 L' g+ R
                        LCD_ShowxNum(250,200,EncVal,5,16,0);1 j$ |% X8 {! Q3 g% ?, D- k- N
                printf("%d\r\n",EncVal) ;" D6 \* M$ w  @; Z. Y
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值2 G! L; `' Y# p* j
                 }
. }1 B6 G3 K/ c; I, a1 J}
- C- L+ O' J* B, a9 N' t% @+ [
) k: ?& T6 F4 C) a& ~0 a- M$ ^3 O

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 `) B7 F7 \1 J$ z' @! [/ E4 l4 \
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-2 04:48 , Processed in 0.058206 second(s), 34 queries , Gzip On.

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

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

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