之前做电机相关的项目比较少,最近有个项目涉及到步进电机的精确控制,参考了一些资料研究了一下S型曲线加减速,这里总结一下分享给大家。
STM32定时器输出PWM,控制驱动器来驱动步进电机。单片机只要控制电机方向,以及PWM的频率即可,具体驱动由驱动器实现。 首先说一下什么是S型曲线加速,为什么要S型曲线加速。
S型曲线加速是指步进电机的启动速度按照S型曲线逐渐增加,以达到设定的最大速度。具体的S型曲线方程如下:
x取值-5~5的曲线图如下:
可以看到,刚开始加速和达到最大速度时加速比较缓慢,中间加速比较快。电机的转矩和转速的乘积的k倍等于功率,也就是说,功率一定的时候,转速与转矩成反比关系。所以,转速越低,转矩越大。当电机直接高速启动时,电机可能存在震动、丢步甚至启动不起来的情况。因此需要S型曲线加速,使电机能够缓慢启动。程序实现控制电机的速度,其实就是控制PWM的输出频率。首先需要对S曲线方程进行一些变化,如下:Fcurrent = Fmin + (Fmax-Fmin)/(1+exp( -Flexible(i - num )/num) )-
Fcurrent为计算出的当前频率。
-
Fmin为加速的起始频率。
-
Fmax为加速的最大频率。
-
-Flexible*(i - num)/num是对S型曲线进行拉伸变化,其中Flexible代表S曲线区间(越大代表压缩的最厉害,中间加速度越大;越小越接近匀加速。理想的S曲线的取值为4-6)。
-
i是在循环计算过程中的索引,从0开始。
-
num为 加速脉冲数/2 大小。
TIM2_CLOCK_FREQ为定时器的计数频率。 之后要做的就是在加减速过程中,每输出一个PWM脉冲,重新装载一次定时器周期。具体怎样输出指定个数PWM来控制步进电机,可参考之前的文章《STM32定时器产生指定个数脉冲》。在PWM中断中,将计算好的S曲线数组,重新装载到定时器的ARR和CCR寄存器中即可。程序如下://功能:S加速曲线初始化//参数1 *pbuff 计算出的定时器的周期//参数2 fre_max 最大频率 Hz//参数3 fre_min 最小频率 Hz//参数4 len 加速需要的脉冲数void CurveS_init(uint16_t *pbuff,uint32_t fre_max,uint32_t fre_min,int16_t len){int16_t i;uint16_t flexible =4;floatdelt=fre_max-fre_min;floatdeno;float melo ;floatfre;for(i=0; i{melo = flexible* (i-len/2) / (len/2);deno = 1.0f / (1 + expf(-melo)); //fre = delt * deno + fre_min;*pbuff++ = (unsigned short)(TIM2_CLOCK_FREQ / fre);}}
//PWM回调函数void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){Motor.PWMcount++;SpeedAdjust();//速度调节}//速度调节函数void SpeedAdjust(void){switch(Motor.Status){/*加速*/case SPEED_INCREASE:if(Motor.Count < Motor.CountMax){__HAL_TIM_SET_AUTORELOAD(&htim2,Period[Motor.Count]);//计算下一个PWM的周期htim2.Instance->CCR1 = Period[Motor.Count]/2;//占空比50%Motor.Count++;//加速次数}else{Motor.Status = SPEED_STABLE;Motor.Count--;}break;/*匀速*/case SPEED_STABLE:if(Motor.PWMcount >= (Motor.PWMneed - Motor.Count)){Motor.Status = SPEED_DECREASE;}break;/*减速*/case SPEED_DECREASE:if(Motor.Count >= 0){__HAL_TIM_SET_AUTORELOAD(&htim2,Period[Motor.Count]);//计算下一个PWM的周期htim2.Instance->CCR1 = Period[Motor.Count]/2;Motor.Count--;}if(Motor.PWMcount >= Motor.PWMneed){HAL_TIM_PWM_Stop_IT(&htim2,TIM_CHANNEL_1);}break;default :break;}
其中Motor是自己定义的一个结构体:
启动时,初始化参数,启动定时器输出PWM即可:typedef struct{uint8_t Status; //状态int32_t Count; //加减速过程脉冲计数int32_t CountMax; //最大加速脉冲数uint32_t PWMcount;//PWM计数uint32_t PWMneed; //需要输出的PWM总数}Motor_t;
来看一下效果,可以看到,PWM的频率是逐渐增大的。实际测试效果也不错。//PWM--需要输出的脉冲个数void StartPWM(uint32_t PWM){Motor.PWMcount = 0;Motor.PWMneed = PWM;Motor.Count = 0;Motor.Status = SPEED_INCREASE;Motor.CountMax = 300;//初始化加速曲线,最小频率100,最大频率10K,加速脉冲数300CurveS_init(Period,10000,100,Motor.CountMax);__HAL_TIM_SET_AUTORELOAD(&htim2,Period[0]);htim2.Instance->CCR1 = Period[0];HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1); //启动定时器PWM输出}
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
驱动器
+关注
关注
54文章
9012浏览量
153332 -
步进电机
+关注
关注
152文章
3216浏览量
151554
原文标题:步进电机S型曲线加速的实现
文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
基于L6482的步进电机驱动评估板技术解析
集成的解决方案,适用于驱动微步进两相双极步进电机。它将用于N沟道MOSFET功率级的双路全桥栅极驱动器与嵌入式非耗散过流保护相结合。得益于新的电流控制,通过自适应衰减模式实现1/16微
只是加减速和转弯,为啥自动驾驶这么难实现?
并不是那么容易?自动驾驶汽车为何发展这么多年,还是没有实现L5?今天智驾最前沿就来和大家聊聊这个话题。 车辆的运行轨迹看似简单,但并不是简单地“往前跑”或“停下来”那么简单。任何一次加减速,都与车辆的质量、轮胎与
升降速曲线对直线电机系统性能影响的研究
Matlab仿真证明二次速度曲线是目前最适用于高速高精直线电机运动控制系统的加/减速曲线,并在带前馈的直线电机伺服实验平台上进行了验证实验。
发表于 06-17 08:48
实时生成步进电机速度曲线
一种用于步进电机加速度的新算法可以实现速度曲线的实时参数化和计算。该算法可以在低端微控制器上运行,只使用简单的定点算术运算并且不使用数据表。它以恒定的加速度和
发表于 05-14 15:09
线性模组为什么会限定一个加减速时间?
在工业自动化领域,线性模组作为精密传动系统的核心部件,其加减速时间的设定直接影响设备性能与寿命。通过对运动控制原理的深入分析可以发现,加减速时间的限定是机械结构强度、电机特性、运动精度、能耗管理等
减速机的工作原理具体是如何实现的?
减速机的工作原理主要基于齿轮传动的原理,通过不同的齿轮组合来实现速度的降低和扭矩的增加。以下是减速机工作原理的具体实现步骤:
1、输入轴与驱动电机
发表于 03-05 16:24
网络笔记分享-实时生成步进电机速度曲线
一种用于步进电机加速度的新算法可以实现速度曲线的实时参数化和计算。该算法可以在低端微控制器上运行,只使用简单的定点算术运算并且不使用数据表。它以恒定的加速度和
发表于 03-04 21:17

步进电机S型曲线加减速的实现
评论