找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 354|回复: 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两相,两个上升沿两个下降沿的话,计数器就会四个 加一 。现在的问题是检测出来总是出现两次加一,只是检测到了上升沿,感觉没有检测到下降沿呀。希望论坛里的大哥们帮忙解答一下。
# H/ `$ Q6 s$ ?8 _  C' u. \" {
void TIM3_Int_Init(u16 arr,u16 psc)" o- G$ K$ V* d. C4 A1 g* q2 y' M
{
* }. ?* X" O! N& T- S4 R- O# L  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  P" J' s- h) R& f) p6 g) f        NVIC_InitTypeDef NVIC_InitStructure;
1 D6 C7 v6 y* e- }, S) k* b# w
& M) k- l+ G+ N$ K        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
: R% m6 {; K. Y# L" b        
4 e2 n' Y* [- b; D7 x        //定时器TIM3初始化: d$ @! {6 |# @& i" q
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
) B  q' O4 o. s$ k6 e! a* Y+ Z        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值, G  C! t" ]' j+ J2 V7 {6 [
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim4 R# x" ~, d' L& |. O& Q( o
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
/ m8 s9 @" X$ q6 Y% y/ o        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位        
* Q% X1 y; j& |0 g// TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式! F6 f- K" _  ?: ]
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断% o, x6 s1 t8 y$ ]9 Q% q, J

. a7 V9 |1 D( Y' F8 a        //中断优先级NVIC设置
/ o8 K3 R" R# @+ O( z$ O        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
. Q$ {9 f3 Z0 l3 N, w/ M' ]        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级( N% {! b! w$ j- b* q6 D% I$ B
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级" W* G! v0 I! {
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
' w# Q( E; n  A& n. O        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
, M4 E, W( |! n4 a* O2 n9 }0 @4 S. Y
  //TIM3_Encoder_Write(65416) ;
! ?2 `5 _( {$ Y; n        & U2 H/ j; R. p$ ]
        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
8 g3 c- T+ N; A' M}
, J, V! v- c( f& {2 }. o
/ k" s7 V* g/ l' v  ~3 M0 k' v7 x5 y
7 F) @/ N/ f9 n+ Q  {" M- U; ?; _' a1 O% j' b& M7 [
/**********TIM2_Encoder******/, r4 g( O: a, p; Q
2 f' F! ~4 @' Z8 H
void TIM2_Encoder_Init(u16 arr,u16 psc)
  G8 \9 f1 ?4 A1 B- G" h" t{' A* o9 q7 h+ Y5 m/ w: a4 T
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
8 n' M% B- _' ^( V/ |        NVIC_InitTypeDef NVIC_InitStructure;
9 v7 Z' T2 W' f: h        TIM_ICInitTypeDef TIM_ICInitStructure;
3 ]3 n$ U$ S% {2 s7 e3 o" K5 U) {0 B  W( v' `/ ~2 E! D! U1 @& H! x
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
" z( }, m( s) n  P2 w        2 [' P: v3 P# R  M' \$ u  c
        //定时器TIM2初始化6 Y  P, X6 @5 F5 ?; m& {
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        ( Z% T6 @5 G5 e/ G* k% w) Z% {
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
& c0 t1 k" ]: M        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
1 y2 a$ V1 F+ C$ p3 c3 B" k        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
9 S* J# l0 c5 G% o' V        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位' u+ W( D: i2 s+ J5 H9 P0 h
        //TIM_SetCounter(TIM3, 0xFF88);//设置TIMx自动重装载寄存器值
5 v+ ]! }3 B. ~% ~# Q/ \9 u
! {: g% B; v. W        TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,: T, b4 Z/ L0 F" `. w0 [' W
                                TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
" F3 ?/ x# F8 i        TIM_ICStructInit(&TIM_ICInitStructure);% G, y! M: }& `& b' Q% \( i1 E
        TIM_ICInitStructure.TIM_ICFilter = 6;6 |. S! }/ U7 W1 {
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
6 @. a' N3 [8 G1 L  w7 |' P        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
% F2 W, S( O+ `( k+ Q$ S        TIM_ICInit(TIM2, &TIM_ICInitStructure);
. k* a% Y, U- P: u) R0 T2 ?" _) t  //TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);//选择TIMx从模式
: F& Q  J% R- J: @0 B+ c4 p+ q- ^  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
% ]3 N3 E+ x. w7 C# H- F1 g2 P/ s        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
. l6 t& J6 h/ A  //TIM2->CNT = 120;. M: s) K8 ]/ V( I
        //中断优先级NVIC设置. @1 G/ v3 m$ [9 ]9 t
        NVIC_InitStructure.NVIC_IRQChannel = TIM_Channel_1|TIM_Channel_2;  //TIM3中断
* n. i7 I- d' m* Z        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级3级
& c: b8 h6 Q/ g$ A8 ^: e! n- K  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级0 z- D+ |3 H7 O+ y
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能! |7 V. \6 A  |& e, c, U( F2 o" x
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
3 I7 N) F% r! J( ~# X( B: k8 }) L: z" ~+ ]& J  c
  //TIM3_Encoder_Write(65416) ;- V- D3 j  m9 U9 y
        , p% Y7 T# L5 h6 e  s
        TIM_Cmd(TIM2, ENABLE);  //使能TIMx                                         
! U8 N. H  l) |3 x. `9 b}8 ~6 ?9 W5 h4 `9 h7 D
5 y3 t! K4 C; m

+ x& q, G* T/ n- t7 {3 m/ U//定时器3中断服务程序1 h2 b+ N0 g% ^0 M
void TIM3_IRQHandler(void)   //TIM3中断
- Y3 }; `( m' ~; ~* v9 `+ z. v: d{
* B4 r" O1 F" s* ?  n) K* W$ {        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否' @* C6 h8 d" o( C( B0 f
                {
& s! q* V: ]6 L9 t+ e# y% m# i8 _                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 " Z+ k; H5 O& m8 L6 X/ U
    TIM2->SMCR ^= 0x8000  ;4 O+ ^) Z! A! ^. D0 ~) M! K
/ \' \7 q' B) }, n
                        EncVal = TIM_GetCounter(TIM2);- h. r, R& W' {' y

8 Q1 a$ u" U1 V4 {$ `6 Y                        if(EncVal>=240)
; l/ I! l1 U: @+ p7 h' h" M                        {
5 d. h- Y, |5 q         EncVal = 240; % T; P) {# C! k: Y5 k. r% P
      }1 I. r- W! n6 _$ r
                         LCD_DrawPoint(i, 5+EncVal);
( [# C7 J; p3 b7 |                         if(i==320)
8 a2 l1 k) P, T7 Z" W. x1 I/ V4 I% u                         {  , m# m4 l" F2 d8 {
                                     i =0;
. V. F; Y" ?: F0 V2 H% |% {                                LCD_Clear(WHITE);        $ B' w( h8 L. k
                                     coordinate()  ; //横坐标        
( U3 q; Q; J4 ~6 M1 V                                     $ s% x5 Y4 m9 r% O" ?7 @1 x: v& w
             //delay_ms(50);                                2 N3 b$ T& P8 I/ j; F2 m
                         }; }( N1 ^1 N5 [1 h' S" G8 Z  F
                        i++ ; 1 w( s6 n, h/ T/ E
                        TIM2->CNT = 240;
( ~+ l4 }3 B* t                   Frequent() ;
# f5 p9 Y. ]5 j" X     //fre = 1000/(90 /(720*100/72)) ;                         % p6 M* R  e: Y
                 //sprintf((char*)speed,"speed : %d ",EncVal );//将LCD ID打印到lcd_id数组。; X3 S+ T% L' O" E& D/ H
                //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);
/ c, w# l! A4 @3 k                        //LCD_ShowString(200,200,200,16,16,"EncVal");
2 Q7 ?8 G7 r' ]- a6 \0 a7 L7 E                        LCD_ShowxNum(250,200,EncVal,5,16,0);* Q' ?4 y3 L9 J! C. @
                printf("%d\r\n",EncVal) ;
. s7 A0 s5 O4 V2 R9 @& R    TIM_SetAutoreload(TIM1, 0xFF88);//设置TIMx自动重装载寄存器值
- W1 P6 J$ U- p/ M8 B! Y; [                 }
5 V2 Y, y. U  n* G5 Z}, q6 R7 ~, {6 l

! g5 @; z( l  S# ]3 e' L* K

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 | 只看该作者
好资料,果断收藏
. q- J: K0 P! j7 d7 Z7 d) b# j' e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-1 23:01 , Processed in 0.061315 second(s), 35 queries , Gzip On.

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

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

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