STM32步进电机驱动的算法

电子说

1.3w人已加入

描述

  在脉冲模式下,步进电机启动器的脉冲频率与速度成正比,函数void CalculateSModelLine(float fre[],  unsigned short period[],   float  len,  float fre_max,  float fre_min, float flexible)主要目的就是生成每一个细分步加速的速度。芯片用的是stm32f103c8t6,驱动器用的是2DM420。

   程序流程如下:

  •   STM32硬件基本初始化,主要是针对定时器

 

  •   调用函数CalculateSModelLine()生 成每一个细分步定时器的自动重装载值(实际就是改变脉冲的周期)

 

  •   打开定时器

 

  •   更新中断发生,将数组中的数据赋值给定时器的自动重装载寄存器

 

  •   跳出中断后脉冲频频率就变化了

 

  •   下一次更新中断产生


 

  对应的计算接口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

  {

  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 ;

  }

 

  文章整合自:CSDN

编辑:ymf

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分