网站首页 / 育儿 / 正文

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

时间:2022-04-13 06:50:06 浏览:1237次 作者:用户投稿 【我要投诉/侵权/举报 删除信息】

表面

为了实行步进电机的缓慢启停以及制止转高转速时不失步停转。在步进电机启用、遏止进程中,须要沿用加放慢的算法对启用进程举行遏制。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. 设置一个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弧线数值表、遏制步进电机启用、遏止的视频,从视频上不妨鲜明看到启用时慢加快->快加快->慢加快的进程,以及遏止时慢放慢->快放慢->慢放慢的进程。

版权声明:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人,因此内容不代表本站观点、本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、内容、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至353049283@qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。