A4988步进电机加速控制算法的尝试(下)——MKE06K128实现篇

  

硬件连接部分:


,

 A4988步进电机加速控制算法的尝试(下)——MKE06K128实现篇”> <img src=

 A4988步进电机加速控制算法的尝试(下)——MKE06K128实现篇

<李>

<李>

<李>


软件实现部分:


block_t  block_buffer [BLOCK_BUFFER_SIZE];   volatile  unsigned  char  block_buffer_head, volatile  unsigned  char  block_buffer_tail;

,另外设置了几个强制内联函数:

,FORCE_INLINE  block_t  * plan_get_current_block();//读取当前块函数   ,FORCE_INLINE  bool  blocks_queued (), {, return  (block_buffer_head  !=, block_buffer_tail);,}//队列是否非空

# define  FORCE_INLINE 属性((always_inline)),内联

内联关键字仅仅是建议编译器做内联展开处理,而不是强制。在gcc编译器中,如果编译优化设置为o0,即使是内联函数也不会被内联展开,除非设置了强制内联(属性((always_inline)))属性。

在内联函数内不允许用循环语句和开关语句。否则会被编译器当作普通函数。

,block_t  * current_block ,//当前运动实例

void  ST_PULSE_TI_OnInterrupt(空白),{/*,Write  your  code  here …*/# ifndef  HARDWARE_DEBUG_MODE      if  (! current_block), {   时间=current_block  plan_get_current_block ();   }      # define  DISTANCE_COUNT_RESET  current_block→rounds_count_per_mstep -=current_block→one_micro_step_mm   # define  DISTANCE_IS_ONESTEP , current_block→rounds_count_per_mstep>=current_block→one_micro_step_mm   # define  DRIVE_PULSE  E0_STE_SetVal ();\   E0_STE_ClrVal ()/*==========generate  a  pulse  when  a  step 积累===========*/if  (DISTANCE_IS_ONESTEP), {   DRIVE_PULSE;   DISTANCE_COUNT_RESET;   }/* update 从而new  speed 以及,…*/if  (current_block), {   if  (current_block→rounds_behind  +, current_block→rounds_ahead   & lt;, current_block→轮),{//,accumulate 从而,rounds 以及,microstep_count_for_rounds      +=current_block→rounds_behind  current_block→instance_rate;   current_block→rounds_count_per_mstep  +=current_block→instance_rate;//when  speed  climbing  up 案例   if  (current_block→instance_rate  & lt;, current_block→nominal_rate), {   +=current_block→instance_rate  current_block→加速度;   }//when 持有,nominal_rate 案例   else  {//make  sure 从而,rate  remains  nominal_rate   时间=current_block→instance_rate  current_block→nominal_rate;   }//,update 从而,rounds  left  for  all 从而three 案例。   current_block→rounds_ahead=current_block→instance_rate/2/current_block→加速度* current_block→instance_rate;   }//when  speed  slipping  down 案例      else  if  (current_block→instance_rate 祝辞,current_block→exit_rate), {   current_block→rounds_behind +=, current_block→instance_rate;   current_block→rounds_count_per_mstep  +=current_block→instance_rate;   current_block→instance_rate  -=, current_block→加速度;   }//,at 从而最终获得of 从而阻止      else  if  (current_block→instance_rate  & lt;=, current_block→exit_rate), {   时间=current_block→instance_rate  0;   时间=current_block→nominal_rate  0;   时间=current_block→rounds_ahead  0;   时间=current_block→acceleration  0;   时间=current_block→rounds  0;   时间=current_block→rounds_count_per_mstep  0;//ST_PULSE_TI_Disable ();//current_block  should 更新   时间=current_block 零;   }      }      # endif      }

A4988步进电机加速控制算法的尝试(下)——MKE06K128实现篇