当前位置:   article > 正文

比较几种步进电机加减速控制方案_指数型加减速曲线的原理及应用

指数型加减速曲线的原理及应用

 

         加减速算法是运动控制中的关键技术之一,也是实现高速、高效率的关键因素之一。在工业控制中,一方面要求加工的过程平滑、稳定,柔性冲击小;另一方面需要响应时间快,反应迅速。在保证控制精度的前提下来提高加工效率,实现机械运动平滑稳定,是目前工业加工中一直要解决的关键问题。当前运动控制系统中常用的加减速算法主要有:梯形曲线加减速、S形曲线加减速、指数曲线加减速、抛物线曲线加减速等。

 

1、“梯形”加减速

定义:指按直线方式(从启动速度到目标速度的加减速),以一定的比例进行加速/减速

                                                            

                                                                       图1: “梯形”加减速速度及加速度曲线

计算公式:

                                                                            

优缺点: 梯形曲线其特点是算法简便,占用时少、响应快、效率高,实现方便。但匀加速和匀减速阶段不符合步进电机速度变化规律,在变速和匀速转折点不能平滑过渡。所以这种算法主要应用在对升降速过程要求不高的场合。

 

“指数形”加减速

定义:指按指数函数方式进行加减速。

                                                             

                                                                      图2: “指数型”加减速速度及加速度曲线

计算公式

                                                              

优缺点:指数曲线克服了梯形加减速的速度不平稳问题,运动精度得到了提高,但初始加速度大,容易引起机械部件的冲击,在加减速的起点仍然存在加减速突变,限制了加速度的提高。

 

“S形”加减速

定义:加速/减速开始时速度比较缓慢,然后逐渐加快。在加速/减速接近结束时速度再次减慢下来,从而使移动较为稳定。S 字加减速的类型有Sin 曲线、2次曲线、循环曲线、3 次曲线

                                                           

                                                                图3: “S型”加减速速度及加速度曲线

计算公式:

                                             

优缺点:S曲线加减速是一种柔性程序较好的控制策略,能让电机性能得到充分的发挥,冲击振动小,但是实现过程比较复杂,计算量相对较大,并且加减速效率不高。

 

加减速控制评价指标

1、机械运动轨迹及位置误差应该尽量的小

2、机械运动过程平稳、抖动小,且响应迅速

3、加减速算法应该尽量简单,便于实现,能够满足控制的实时性要求

 

梯形加减速速度曲线      

   采用“梯形”加减速算法,在运动过程中分成以下四个状态:空闲状态,加速状态,匀速状态与减速状态。

 

加减速算法实现

 

                                               

                                                                                    图2 加减速实现算法

脉冲产生单元:用来产生指定频率的脉冲信号。

脉冲计数单元:用来记录各个运动状态下输出的脉冲个数。

脉宽计算单元:根据总的脉冲个数及记录的各个运动状态下的脉冲输出个数,进行状态跳转及速度计算。

 

脉冲产生单元

初始化STM32定时器,在定时器中断里面,翻转IO口,输出脉冲信号。

  1. //初始化定时器功能,用来翻转IO信号,产生脉冲输出信号
  2. void TIM3_Int_Init(u16 arr,u16 psc)
  3. {
  4. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5. NVIC_InitTypeDef NVIC_InitStructure;
  6. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
  7. //定时器TIM3初始化
  8. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  9. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  10. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  11. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  12. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  13. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  14. //中断优先级NVIC设置
  15. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  16. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级1
  17. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级0
  18. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  19. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
  20. TIM_Cmd(TIM3, DISABLE); //不使能TIMx
  21. }
  1. //设置定时器值,用来产生指定频率的脉冲信号
  2. void Motor0TimeSet(unsigned int ARR,bool TimeEnable)
  3. {
  4. TIM3->ARR = (uint16_t)ARR;
  5. if(TimeEnable) TIM_Cmd(TIM3, ENABLE);
  6. else TIM_Cmd(TIM3, DISABLE);
  7. }
  1. //翻转IO
  2. void TIM3_IRQHandler(void) //TIM3中断
  3. {
  4. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  5. {
  6. TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
  7. MotorPulsePinOut(&MotorControl[0]);
  8. }
  9. }

脉冲计数单元

用来记录各个阶段输出的脉冲信号;根据设置的值和输出脉冲进行加减速状态切换。

                                                                     

                                                                             图 3  加减速状态切换

  1. void MotorRunState(MOTOR_CTRL *Motor)
  2. {
  3. switch(Motor->NowState.RunState)
  4. {
  5. case MIDLE://开始
  6. Motor->NowState.AllowMaxAddStep = Motor->SetData.RunStep/2;
  7. Motor->NowState.RunState = MACC;
  8. break;
  9. case MACC://加速状态
  10. Motor->NowState.AddStep ++;
  11. Motor->NowState.RunStep ++;
  12. if(Motor->NowState.AddStep >= Motor->NowState.AllowMaxAddStep)//三角形加速
  13. Motor->NowState.RunState = MDEC;
  14. else if(Motor->NowState.Speed >= Motor->SetData.SpeedMax)
  15. Motor->NowState.RunState = MKEEP;
  16. break;
  17. case MKEEP://最大速度阶段
  18. Motor->NowState.RunStep ++;
  19. if(Motor->NowState.AddStep >= Motor->SetData.RunStep - Motor->NowState.RunStep)
  20. Motor->NowState.RunState = MDEC;
  21. break;
  22. case MDEC://减速阶段
  23. Motor->NowState.RunStep ++;
  24. if(Motor->NowState.RunStep >= Motor->SetData.RunStep)//脉冲输出完成
  25. {
  26. Motor->TimeSet_Call_Back(Motor->NowState.TimeCountNum,false);//关闭定时器,停止脉冲信号输出
  27. Motor->NowState.SysState = MOV_IDLE;
  28. Motor->NowState.Consequence = 0; //执行结果
  29. }
  30. }
  31. if(Motor->NowState.SysState)Motor->TimeSet_Call_Back(Motor->NowState.TimeCountNum,true);//设置下一次脉冲输出频率
  32. }

 

速度计算单元

           根据当前处于电机加减速的那个状态,进行速度计算。采用定时1MS计算一次速度的方式。

                                                    

                                                                                                图 4 速度计算模块

  1. void MotorCalculateSpeed(MOTOR_CTRL *Motor)
  2. {
  3. switch(Motor->NowState.RunState)
  4. {
  5. case MIDLE:
  6. Motor->NowState.Speed = Motor->SetData.Speed0;
  7. break;
  8. case MACC:
  9. Motor->NowState.Speed += Motor->SetData.SpeedAdd;
  10. if(Motor->NowState.Speed > Motor->SetData.SpeedMax)
  11. Motor->NowState.Speed = Motor->SetData.SpeedMax;
  12. break;
  13. case MKEEP:
  14. Motor->NowState.Speed = Motor->SetData.SpeedMax;
  15. break;
  16. case MDEC:
  17. Motor->NowState.Speed -= Motor->SetData.SpeedAdd;
  18. if(Motor->NowState.Speed < Motor->SetData.Speed0)
  19. Motor->NowState.Speed = Motor->SetData.Speed0;
  20. break;
  21. }
  22. if(Motor->NowState.Busy)
  23. {
  24. Motor->NowState.TimeCountNum = 1000*1000/Motor->NowState.Speed;//计算定时器应该重装的值
  25. Motor->NowState.MotorRunTime++;//统计电机运行时间
  26. }
  27. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/134971?site
推荐阅读
相关标签
  

闽ICP备14008679号