既然ZL说了偶没看资料,偶就随便看了一下,没多少时间,只是浏览一下而已
不过没怎么看懂,不进电机的加速曲线都没看到,另外,貌似在step过程中,程序要等到step到位后才返回?
偶也来秀一下不进电机的代码,所有调用非阻塞,同时运行4个(不同参数的4个电机一起转,MCU的PWM数量限制,理论上按照轮询一次的时间,接十几个估计没问题),USB轮询也是非阻塞(所以不影响电机驱动)。
main函数中,初始化玩之后,在while(1)中:
// mc fsm: poll mc_module and poll each mc
mc_module_poll(); // 步进电机模块轮询,处理步进电机类事件(影响所有步进电机的事件)
for (uint8_t i = 0; i < dimof(mc); i++)
{
mc_poll(&mc); // 轮询不进电机实例
}
设置电机目标位置,同样非阻塞:
mc_set_pos(&mc, target_pos);
这样的设计的好处是,可以外接不同的电机,电机可以有不同的运行速度设置和不同的响应速度设置,但是,电机驱动库不用做任何修改。一个电机,用一个mc_info_t结构就可以描述,加速曲线,2路驱动相位差等参数,都只是这个结构中的成员。
内部代码只秀一段,set_target_pos(设置电机的目标位置):
// set the target position
void mc_set_pos(struct mc_info_t *mc, mc_pos_t pos)
{
mc->step_target = pos;
mc->cur_speed = mc_calculate_next_speed(mc);
if (!mc->cur_speed)
{
mc->delay_start_us = mc_module_tick_cnt_us;
mc-> cur_speed_change_step = 0;
}
}
|