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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
小弟用STM32定时器编码器模式计算减速电机AB相脉冲个数,目的是想通过 AB相脉冲的上升沿和下降沿触发,然后计数器加一,那么如果检测到一个周期,有AB两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
4 Z- h3 v. c7 c& n; L1 o( y! e  \0 }! H
void TIM3_Int_Init(u16 arr,u16 psc)2 L5 A4 T' r' S+ k6 {1 T; D
{
% W5 R7 q, Z( j6 V  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;- ]( G8 ^( m2 Q+ J& L, u6 M
        NVIC_InitTypeDef NVIC_InitStructure;; d* E7 Y4 ^1 p: F/ J: j8 {

6 G. d. _, B4 V9 C; H        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
1 p! |4 U; W, V+ D$ @5 M9 N5 u        ; s. F& |3 A" Z$ r" R' O7 y  k
        //定时器TIM3初始化
3 j( [8 f5 x6 ]5 k( J        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
* _* w2 D) \' t" m5 W" ?        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值' z3 j: ^! V. n( ]
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
4 S! R$ L6 j' n$ z& l7 \. ]        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
; C5 z  n& {* a9 O; }8 ?        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        
6 r; p) Y, W9 o4 S' v1 T// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式$ e, T7 u, c' P( b6 _
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断% B4 p8 e" P& p5 e3 J( C* w

+ J% g; J9 B) ~- k' _7 |8 x        //中断优先级NVIC设置9 ]* X  Y/ D/ x9 @
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断% k, I: [0 |  F  s
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级- R! s3 j& j4 k. a, O. R8 s, {
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
1 P( Z: p3 z# c+ y7 F/ H( F6 A1 L0 {        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能! e5 `  z1 m3 }& g" W4 O1 d
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器8 d' T# G' }; N& }$ p5 v
8 ^  H  y1 ^3 c2 A/ [8 g8 W8 y0 L
  //TIM3_Encoder_Write(65416) ;
0 E5 g0 e* p7 B        ) }! }9 Q$ ^4 ?8 t8 n
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         + y2 n/ Q- g9 Q2 z, O4 M$ y7 V% r
}
; }3 u% V; A* T' T/ t, t) m' j  e3 j7 s1 U+ D" ~
* D  k2 @/ a0 }3 L
0 m' C: X/ l0 u1 y  z
/**********TIM2_Encoder******/& L9 w/ v6 H5 J+ m' z( y6 o

- M" @! @3 [4 r" v' y; K( ]void TIM2_Encoder_Init(u16 arr,u16 psc)
0 x7 l3 K, k& H  @) Y7 L{: ~4 e. |# ^1 G) R: @
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;! c) l! }( v/ [5 `* E3 ~* a* b
        NVIC_InitTypeDef NVIC_InitStructure;2 k0 w4 ~. t3 i, x
        TIM_ICInitTypeDef TIM_ICInitStructure;
4 L  P2 \8 x# [6 \  w- q. J1 e  v% J) a7 F7 q9 {5 `0 k; N( r
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
: B% J# m" K8 v4 L: N9 j        
. x# Y% x$ i( u        //定时器TIM2初始化+ b7 G" g1 V. w$ W( l
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
' d3 Z* @9 N  c( |; H1 d        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
* S4 D6 N$ M1 J  ^% x9 Q        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim) q+ s5 j# V1 I3 o! I  r% |8 X
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式) f* z/ l2 r4 |( @6 R; u
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
" w4 Q' p& T1 u5 x3 Y7 g, j        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值$ }# x6 c- }8 L! `1 u

3 ^& f. C  w) E* e: B5 D        TIM_EncoderInteRFaceConfig(TIM2, TIM_EncoderMode_TI12,. m; f# w# H& h7 G: X/ t( v
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);& x$ N, Z9 C' D6 y
        TIM_ICStructInit(&TIM_ICInitStructure);
# p/ U# [: W# A  H# [8 f1 O        TIM_ICInitStructure.TIM_ICFilter = 6;
& i$ l' h9 R4 A% }+ a* b        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
: I" V  R% J4 A2 p3 H) @, h1 M        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频 4 Z/ C, T% E4 Q/ `0 a: `3 |
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
: ~) x7 u, S" {1 A% J/ }  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式: X5 S5 _8 O: V; v6 w0 M
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);. @  u. z% G7 `
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断7 b5 i2 L( R: P9 E  Z5 l
  //TIM2->CNT = 120;
% R1 g8 D! D1 u9 s% E        //中断优先级NVIC设置. d; {, U% m' T$ `3 ]
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断" @8 B* V& u( V, M0 F# x
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
6 _, M4 r" q/ N$ Z- r) `4 I$ @* ?  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
" L; h& ^6 P. w3 v$ y% Z        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能) U% _$ y# a2 J! f7 U2 y' a+ X) {* k" w
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
0 ^- C- n  ]3 p- H7 Y0 q, P  ~, }- |; D6 ~
  //TIM3_Encoder_Write(65416) ;; y) l: g5 I! ]% T- W
        
; @; @: l" D) O0 K$ D; z        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
' v* a. L+ i9 S$ o& h; ?- i}
  X& f/ S3 D& x/ E7 t5 O+ k! {8 T+ {. e7 F2 A& S

5 f& D6 c3 u" r. C0 c6 z//定时器3中断服务程序
0 ]. w9 ^3 A  p/ Qvoid TIM3_IRQHandler(void)   //TIM3中断
$ Q( Q1 C$ I/ @" g6 P9 l{
# H2 D/ h/ h. M4 k3 [( i* _0 @* e        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
$ ]/ c4 h+ P- L" w$ J, Q                {
3 u% T, ^- H5 t2 S4 B) g6 E  R( {1 F                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
( b. b5 K6 i0 R9 l  G( x1 ^* R    TIM2->SMCR ^= 0x8000  ;" h+ j! f6 g$ F% v

' y6 ?% c: d' Q- D                        EncVal = TIM_GetCounter(TIM2);3 t2 i) f* O6 v# i5 l- }9 V

' A1 k! _4 ]6 V) l2 R, G6 B                        if(EncVal>=240)
- S' ^2 f' a: c                        {' j( P  L, {5 a6 L4 r7 N
         EncVal = 240;
. d% B+ l- Y: r9 v      }
! n1 w6 U" |8 J3 y                         LCD_DrawPoint(i, 5+EncVal);
% H* L4 m& D8 L+ E2 n. O                         if(i==320)- V: v3 e8 H& x. o4 y3 J
                         {  9 X7 ?; B7 l+ D  X) Y# j
                                     i =0;
3 r7 N# t: U6 p* O! K                                LCD_Clear(WHITE);        . d* A1 `1 g, N3 l* W& {
                                     coordinate()  ; //横坐标          B$ R4 a% l/ S$ V: x
                                    
) }, B5 V" s& k& e( M7 s             //delay_ms(50);                                
6 n; P: P0 O) i, l                         }
, L5 V, N% C8 a* X, m& A                        i++ ; * Q2 J) Z6 a# \; Q- C0 i% m
                        TIM2->CNT = 240; # [1 C2 x3 k, l: G% o% o
                   Frequent() ;
% E8 k* r7 h* {6 S; {     //fre = 1000/(90 /(720*100/72)) ;                        
+ L& N. N! |% Z3 _& T/ B                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。6 ?" v$ ]8 f* z1 r
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
$ a( d$ b0 i; t- G3 k1 ?; {                        //LCD_ShowString(200,200,200,16,16,"EncVal");: v/ i0 p7 \3 V8 Z1 j. L
                        LCD_ShowxNum(250,200,EncVal,5,16,0);1 Q3 S$ {8 y- N3 v0 q
                printf("%d\r\n",EncVal) ;/ Q: o9 T# y' T8 ]" {4 K! P) G
    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
' ~1 K, |: x! ]/ L3 t                 }( Z# T& {% u5 I7 F+ y6 T
}
* E) A1 f7 I8 b* G" k# S1 u2 R" B( b+ \( s, c

TIMER.rar

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

该用户从未签到

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

该用户从未签到

3#
发表于 2016-6-6 15:17 | 只看该作者
好资料,果断收藏
* v! }8 C; [7 [. V3 O' p8 L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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