stm32步进电机控制程序系统(步进电机控制程序编写)
-
-
类目:知识大全
-
联系人:
-
微信号:
-
Q Q 号:
-
手机号:
-
浏览量:
332
【商户信息】
【货源详情】
理论
这是为了避免步进电机顺利启停和高转速时的失步停止。 步进电机启动、停止过程中,需要用加减速算法控制启动过程。 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定时中断程序计算步进电机的运行步数,当达到从设定的步数中减去在停止的s曲线减速运行中设定的步数后的步数时,开始减速运行。
同时检测外部输入,如果有需要停止运行的输入条件,则开始减速运行。
整个加减速控制过程的难点在于:
步进电机的步进及频率更新必须在每次PWM中断时进行。
步进电机运行频率最高为40KHz,该频率下PWM定时中断周期达25us,PWM定时中断程序运行总时间尽可能小,经验上至少小于中断周期的30%即7.5us。 如果超过该值,包括PWM计时器中断程序在内的所有中断程序都将无法执行,基本主程序将无法执行,整个控制器将进入假死状态。
s曲线公司是复杂、非线性的指数浮点运算,需要大量时间,直接调用C语言的库函数计算此数值可能需要几十毫秒。
为了解决S曲线的运算时间问题,基于STM32F103,我采用了查表法,具体步骤如下:
1 .将值定义为5,
的值范围在- 5到5之间。
2 .在加减速的整个过程中,公式
在取值范围-5~5内均匀取1024个数值,得到数值表。
3 .定义包含1024个元素的const数组,其中1024个元素是unsigned short,用于存储数值表。
4. Const数组存储在内部flash中,数值表总共占用2048个字节。
STM32F103RTC6共256K,程序组和设置参数48K,bootloader程序8K,远程升级空间100K,目前的APP应用仅使用40K左右。
剩下60K左右的空间,空出2K的空间来存储数值表,有空间,这是任性的。
5 .在中断程序中,根据总更新次数和当前更新计数值进行计算
该值将重新映射到0到0-1023之间的索引值,并从索引中检索数值。
6 .请注意,stm32f103不支持浮点数运算,因此对于浮点数运算,必须将一个数乘以另一个数。 例如,对于*,需要转换为*65535/13107。
下面一段代码是根据更新的计数值获取频率的函数:
u16fnmc_getfreq(u16n,U16 halftn,U16 alpha,U16 minfreq,U16 maxfreq ) {//alpha=alpha * 4096
signed int udataA;
signed short uiDataA;
U16 uiRes;
U32 uwData;
udataa=(signedint ) alpha* ) signedint ) n;
udataa=(signedint ) udataA/halftn;
if(udataa32767 ) (
udataA=32767;
() ) ) ) )。
uidataa=(signedshort ) alpha-(signed short ) udataA;
uidataa=(signedshort )4 * 4096 - uiDataA;
if(uidataa0) {
uiDataA=0;
() ) ) ) )。
UIRES=(U16 ) uiDataA;
uiRes=uiRes/32; //*1023/8/4096
if(UIRES1023 ) {
uiRes=1023;
() ) ) ) )。
udataa=(signedint ) (maxfreq - minfreq ) ) * g_mc_uchExp[uiRes];
udataA=udataA/65535;
uidataa=(signedint ) udataA;
uiDataA =minfreq;
if(uidataa200 ) {
uiDataA=200;
}
return(uidataa );
}
下面一段代码是产生步进电机控制信号的PWM周期中断程序:
int data;
u16前端;
STRMotorRegs *motor;
motor=g_motor_regs[0];
MOTOR_A_CLEARINT (;
电机速度;
ATA=(int ) MOTOR_A_STEPS_GET );
运动方向==0) ) ) )。
{
数据=数据1;
}
else
{
数据=数据- 1;
}
motor_a_steps_set(data;
freq=motor-runfrequency;
motor-run state==motor _ run _ state _ Inc ) {
电机运行时间=电机开始时间(if ) {
motor-run state=motor _ run _ state _ idle;
}else{
freq=fnmc _ get freq (motor-runtimer,motor-halfstarttime,motor-alpha,motor-startfreq,motor-runfrequency )
}
motor-runsnapfreq=freq;
} else if (motor-run state==motor _ run _ state _ idle ) )
电机总步骤=(电机步电机速度) ) }
motor-run state=motor _ run _ state _ dec;
电机运行时间=0;
}
motor-runsnapfreq=freq;
}else{
电机运行时间=电机停止时间(if ) {
freq=motor-stopfreq;
}else{
freq=fnmc _ get freq (motor-runtimer,motor-halfstoptime,motor-alpha,motor-runsnapfreq,motor-stopfreq ); //U16 n、U16 halftn、U16 alpha、U16 maxfreq、U16 minfreq )
}
}
电机速度=电机总速度(if ) )。
{
motor-starting=FALSE;
}
false==motor-starting ) )。
{
MOTOR_A_DISABLE (;
}else{
motor-curfrequency=freq;
fnMT_Cal_MotorA_TimeConf (;
}
实践
以下是制作s曲线的数值表,控制步进电机的起动、停止的动画,明确了起动时的慢速加速-高速加速-低速加速的过程和停止时的慢速减速-高速减速-低速减速的过程。