当前位置:首页 > 工业控制 > 伺服与控制
[导读]   步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不

  步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

  步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器。

  步进电机S型曲线加减速算法与实现

  S型曲线的的方程,在[-5,5]的图形如下图所示:

  

  如要将此曲线应用在步进电机的加、减速过程中,需要将方程在XY坐标系进行平移,同时对曲线进行拉升变化:

  其中的A分量在y方向进行平移,B分量在y方向进行拉伸,ax+b分量在x方向进行平移和拉伸。

  项目中加速过程:从5600Hz加速到64000Hz,采用4细分。输出比较模块所用的定时器驱动频率为10M,采用1000个点进行加速处理。最终根据项目的需要,在加速过程中采用的曲线方程为:

  其中的Fcurrent为length(1000)个点中的单个频率值。Fmin起始频率为5600; Fmax为最大频率64000; -flexible*(i - num)/num是对S型曲线进行拉伸变化,其中flexible代表S曲线区间(越大代表压缩的最厉害,中间(x坐标0点周围)加速度越大;越小越接近匀加速。理想的S曲线的取值为4-6),i是在循环计算过程中的索引,从0开始,num为 length/2 大小(这样可以使得S曲线对称)。在项目中i的区间[0,1000), num=1000/2=500。这些参数均可以修改。提供的计算接口如下。

  对应的计算接口code:

  /* calculate the Period and Freq array value, fill the Period value into the Period register during the TImer interrupt.

  *calculate the acceleraTIon procedure , a totally 1000 elements array.

  * parameter fre[]: point to the array that keeps the freq value.

  * period[]: point to the array that keeps the TImer period value.

  * len: the procedure of acceleraTIon length.it is best thing to set the float number, some compile software maybe transfer error if set it as a int

  * fre_max: maximum speed, frequency vale.

  * fre_min: start minimum speed, frequency vale. mind : 10000000/65535 = 152, so fre_min can‘t less than 152.

  * flexible: flexible value. adjust the S curves

  */

  void CalculateSModelLine(float fre[], unsigned short period[], float len, float fre_max, float fre_min, float flexible)

  {

  int i=0;

  float deno ;

  float melo ;

  float delt = fre_max-fre_min;

  for(; i《len; i++)

  {

  melo = flexible * (i-len/2) / (len/2);

  deno = 1.0 / (1 + expf(-melo)); //expf is a library function of exponential(e)

  fre[i] = delt * deno + fre_min;

  period[i] = (unsigned short)(10000000.0 / fre[i]); // 10000000 is the timer driver frequency

  }

  return ;

  }

  // start move motor

  void StartPWM()

  {

  DriverMotorFlag = TRUE;

  Index = 0;

  MOTOR_EN_DISABLE = ENABLE;

  OpenOC4(OC_ON | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);

  // map rc13 to oc4 output

  RPC13R = 11;

  // 50 percent duty

  OC4RS = OC_PERIOD_MIN / 2;

  OpenTimer3(T3_ON | T3_PS_1_8, OC_PERIOD_MIN);

  INTSetVectorPriority(INT_TIMER_3_VECTOR, INT_PRIORITY_LEVEL_6);

  INTSetVectorSubPriority(INT_TIMER_3_VECTOR, INT_SUB_PRIORITY_LEVEL_1);

  EnableIntT3;

  }

  //stop motor, hereis no deceleration

  void StopPWM()

  {

  DriverMotorFlag = FALSE;

  Index = 0;

  MOTOR_EN_DISABLE = DISENABLE;

  OpenOC4(OC_OFF | OC_TIMER_MODE16 | OC_TIMER3_SRC | OC_PWM_FAULT_PIN_DISABLE, 0, 0);

  // map rc13 to oc4 output

  RPC13R = 0;

  PORTCbits.RC13 = 0;

  CloseTimer3();

  DisableIntT3;

  }

  //change the timer Period value in the correspond timer rather than the other place, Or the motor will be stalled occasionally.

  // 刚开始我在另外的一个定时器中断中每隔1ms改变 应用在OC模块的timer3 的Period值,结构偶发的造成电机在加速过程中堵转。其实应该是在timer3的中断中修改。

  static unsigned short CountForAcc = 0;

  void __ISR(_TIMER_3_VECTOR, ipl6) Timer3OutHandler(void)

  {

  // clear the interrupt flag, or the interrupt will not occur again.

  mT3ClearIntFlag();

  if(CountForAcc++ 》 2) // here can adjust the totally time of acceleration

  {

  CountForAcc = 0;

  //if(DriverMotorFlag == TRUE && PR3 》 OC_PERIOD_MAX + SPEED_STEP)

  if(DriverMotorFlag == TRUE && Index 《 ACC_TIMES)

  {

  PR3 = Period[Index++];

  OC4RS = PR3 / 2;

  }

  }

  }

  通过CalculateSModelLine接口得到如下不同的几条加速曲线:

  黄色:CalculateSModelLine(Freq, Period, 1000, 56000, 16000, 4);

  橙色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 8);

  蓝色:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 15);

  灰色:CalculateSModelLine(Freq, Period, 1000, 40000, 500, 5);

  

  最后可以估算加速过程的时间和角位移,以橙色曲线为例:CalculateSModelLine(Freq, Period, 1000, 64000, 500, 8)为例(假设在中断中没有 if(CountForAcc++ 》 2) 条件限制):

  时间:Period第一个点的值为10000000/500 = 20000,最后也点的值 10000000/64000=156,平均值为10000左右,timer中断的平均时间Tn=10000/10000000=1ms, 1000个点,总时间为1s,当然,起始频率大加速时间就越短,比如Fmin=16000Hz,Fmax=64000,则40ms左右即可完成加速过程。

  角位移:1.8(单步) * 1000(步数) / 4(细分)= 450°

  上述为加速过程,减速同样的道理,只要将方程改为:

  可以得到减速曲线如下所示:

  

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

一直以来,步进电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来步进电机的相关介绍,详细内容请看下文。

关键字: 电机 步进电机

伺服电机是一种能够精确控制位置、速度和加速度的电动机。它通过内置的反馈系统,能够根据控制信号实时调整输出力矩和转速,从而实现精确的运动控制。伺服电机广泛应用于机械制造、自动化设备、机器人等领域。

关键字: 伺服电机 步进电机

反应式步进电机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对反应式步进电机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 电机 步进电机 反应式步进电机

一直以来,电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来电机的相关介绍,详细内容请看下文。

关键字: 电机 感应电机 步进电机

伺服电机和步进电机在控制精度、低频特性、矩频特性、过载能力、编码器类型等方面存在显著差异。

关键字: 伺服电机 步进电机 编码器

直流减速电机是一种常见的电机类型,它由直流电机和减速器组成。这种电机通常具有较大的启动转矩和较低的转速,适用于需要大扭矩和低转速的场合。直流减速电机的结构包括电机本体、减速器、输出轴和外壳。其中,电机本体是驱动力源,通过...

关键字: 直流减速电机 步进电机

步进电机控制器是一种用于控制步进电机运行状态的设备。步进电机是一种将电脉冲信号转换为角位移的电机,每个脉冲信号都会使电机转动一个固定的角度。步进电机控制器通过控制电机的转速和转向,实现对电机运行状态的精确控制。

关键字: 步进电机 电机控制

控制器是指按照预定顺序改变主电路或控制电路的接线和改变电路中电阻值来控制电动机的启动、调速、制动和反向的主令装置。它由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成,是发布命令的“决策机构”,即协调和指挥...

关键字: 控制器 步进电机

电动机是一种将电能转换为机械能的设备,它利用通电线圈(也就是定子绕组)产生旋转磁场并作用于转子(如鼠笼式闭合铝框)形成磁电动力旋转扭矩。电动机主要由定子与转子组成,通电导线在磁场中受力运动的方向跟电流方向和磁感线(磁场方...

关键字: 步进电机 普通电机

步进电机是一种将电脉冲转化为角位移的执行机构。通俗来说,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过...

关键字: 步进电机 控制脉冲
关闭
关闭