stm32步进电机控制程序系统(步进电机控制程序编写)

2022-07-23 05:44:31  浏览:332  作者:管理员
  • 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曲线的数值表,控制步进电机的起动、停止的动画,明确了起动时的慢速加速-高速加速-低速加速的过程和停止时的慢速减速-高速减速-低速减速的过程。

评论区

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

【随机新闻】

返回顶部