基础理论
为了更好地完成步进电机的轻缓起停及其防止转高速旋转时无失步转停。在步进电机运行、终止全过程中,必须选用加减速的优化算法对运行全过程实现操纵。S曲线是加减速控制最满意的计划方案。可是S曲线的计算公式及其操纵全过程都比较复杂。基于单片机完成这一优化算法必须有浓厚的数学课及其单片机软件设计方案工作能力。
本短视频从由浅入深深详细介绍S曲线加减数的基础理论、程序编写与实践活动。
将S曲线离散化,在全部加减速全过程中,以一定的间隔时间升级频率,总的刷新频次为2*N,i表明为第i次的升级,则第i次更新的频率f(i)表明为:
在其中fb为逐渐的频率,fr是最后运作的频率,α是曲线的伸缩式指数,一般可以取3-5中间的参量。
例如,运行加快,逐渐频率为400Hz,运作频率为5KHz。
终止减速,逐渐频率为5KHz,终止频率为400Hz,
加减速的時间均为1s,按10ms的间隔时间升级频率,一共升级100次,α取5。
则可以制作下列的加减速曲线:
程序编写
根据下列过程完成实现步进电机的S曲线的加减速操纵:
- 配备1ms的计时器及其1ms的中断程序流程
- 在中断程序中对加减速的频率升级频次i开展记数
- 配备造成步进电机推动数据信号的PWM控制模块,设定PWM的按时中断及其中断程序流程
- 在PWM的按时中断程序流程中,测算现阶段升级频次相应的频率,并按出去的频率升级PWM的频率及其pwm占空比
- 在PWM的按时中断程序流程中,测算步进电机运作的微信步数,假如做到设定的微信步数减掉终止的S曲线减速运作所安装的微信步数,则逐渐减速运作。
- 与此同时检验外界键入,如果有必须停止运行的键入标准,则逐渐减速运作。
全部加减速操纵全过程的难题取决于:
- 步进电机的记步及其频率升级必须在每一个PWM中断中开展。
- 步进电机的运作频率最大到40KHz,这类频率下,PWM的按时中断周期时间做到了25us,PWM计时器中断程序执行总時间尽可能小,依据工作经验最少低于中断周期时间的30%,即7.5us。一旦高于这一数值,造成全部中断程序流程(包含PWM按时中断程序流程)漏运作,基本上子程序没法运作,造成全部控制板假死现象。
- 依据S曲线的公司是一个错综复杂的最优控制的指数值浮点型计算,必须消耗很多的時间,立即启用C语言的函数库测算这一数值很有可能消耗几十几百ms。
为了更好地处理S曲线的计算时间问题,根据STM32F103,我选用了查询表法,操作步骤如下所示:
1. 将α值界定5,
的取值范围为-5~5中间。
2. 在全部加减速全过程中,关系式
在取值范围-5~5内匀称取1024个数值,获得数值表。
3. 界定一个unsigned short型有1024个因素的const种类的二维数组,用以储存数值表。
4. Const二维数组储存在里面的flash,数值表共占有2048字节数。
STM32F103RTC6共256K,程序流程组和设定主要参数占有48K,bootloader程序流程占有了8K,远程控制更新室内空间占有了100K,现阶段应用软件仅用到40K上下。
剩下60K以内的室内空间,空出2K的空间来储存数值表,有空间,就是这么任性。
5. 在中断程序流程中,依据总的刷新频次及其目前的升级计数值,测算
值,再投射到0-1023的数值有的数据库索引值,根据数据库索引获得数值。
6. 必须留意的是stm32f103不兼容浮点数数的运算,因此针对浮点数数的运算,必须转换成乘于一个数再除于另一个数,例如*α,必须变化为*65535/13107。
下边一段编码是依据发布的计数值获得频率的函数公式:
U16 fnMC_GetFreq(U16 n, U16 halftn, U16 alpha, U16 minfreq, U16 maxfreq){//alpha=alpha * 4096 signed int udataA; signed short uiDataA; U16 uiRes; U32 uwData; udataA = (signed int)alpha * (signed int)n; udataA = (signed int)udataA / halftn; if(udataA > 32767){ udataA = 32767; } uiDataA = (signed short)alpha - (signed short)udataA; uiDataA = (signed short)4 * 4096 - uiDataA; if(uiDataA < 0){ uiDataA = 0; } uiRes = (U16)uiDataA; uiRes = uiRes / 32;//*1023/8/4096 if(uiRes > 1023){ uiRes = 1023; } udataA = (signed int)(maxfreq - minfreq) * g_mc_uchExp[uiRes]; udataA = udataA / 65535; uiDataA = (signed int)udataA; uiDataA = minfreq; if(uiDataA < 200){ uiDataA = 200; } return(uiDataA); }
下边一段编码是造成步进电机操纵信息的PWM周期时间中断程序流程:
int data; U16 freq; STRMotorRegs *motor; motor = &g_motor_regs[0]; MOTOR_A_CLEARINT(); motor->steps ; data = (int)MOTOR_A_STEPS_GET(); if(motor->direction == 0) { data = data 1; } else { data = data - 1; } MOTOR_A_STEPS_SET(data); freq = motor->runfrequency; if(motor->runstate == MOTOR_RUN_STATE_INC){ if(motor->runtimer >= motor->starttime){ motor->runstate = MOTOR_RUN_STATE_IDLE; }else{ freq = fnMC_GetFreq(motor->runtimer, motor->halfstarttime, motor->alpha, motor->startfreq, motor->runfrequency);//U16 n,U16 halftn,U16 alpha,U16 maxfreq,U16 minfreq) } motor->runsnapfreq = freq; }else if(motor->runstate == MOTOR_RUN_STATE_IDLE){ if(motor->totalstep <= (motor->steps motor->stopremainstep)){ motor->runstate = MOTOR_RUN_STATE_DEC; motor->runtimer = 0; } motor->runsnapfreq = freq; }else{ if(motor->runtimer >= motor->stoptime){ freq = motor->stopfreq; }else{ freq = fnMC_GetFreq(motor->runtimer, motor->halfstoptime, motor->alpha, motor->runsnapfreq, motor->stopfreq);//U16 n,U16 halftn,U16 alpha,U16 maxfreq,U16 minfreq) } } if(motor->steps >= motor->totalstep) { motor->starting = FALSE; } if(FALSE == motor->starting) { MOTOR_A_DISABLE(); }else{ motor->curfrequency = freq; fnMT_Cal_MotorA_TimeConf(); }
实践活动
下边是转化成S曲线标值表、操纵伺服电机运行、终止的短视频,从视频上可以显著见到运作时慢加快->快加速->慢加速的全过程,及其终止时慢降速->快减速->慢降速的全过程。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。