硬件连接部分:
,
- <李>
李> <李>
李> <李>
李>
软件实现部分:
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实现篇