|
楼主 |
发表于 2016-4-13 08:30:45
|
显示全部楼层
速度控制
Marlin固件中对每个一个运动block块都会有一个速度算法控制,因为步进电机在启动进的速度不能太大,必须要有一个加速的过程,因此,在速度控制时,Marlin固件采用的是梯形曲线速度控制算法。关于其速度的实现,则是通过控制定时器1的中断频率来实现,中断频率越快,输出的频数信号越频繁,步进电机速度越快。
具体调用的函数如下:
plan_buffer_liner()
——> calculate_trapezoid_for_block(block, block->entry_speed/block->nominal_speed,
safe_speed/block->nominal_speed);
——>planner_recalculate()
说明如下:
plan_buffer_liner()函数主要计算运动控制块block_t中的相关变量的值。
calculate_trapezoid_for_block(block, block->entry_speed/block->nominal_speed, safe_speed/block->nominal_speed);
在plan_buffer_line()最后被调用,此函数的功能在于计算block的进入速度和退出速度,这只是初始计算,planner_recalculate_trapezoids()是进入速度和退出速度的最终计算,它将所有block的梯形曲线连接起来。这个函数最主要是计算加速阶段、匀速阶段以及减速阶段的位移,当达不到额定速度时,匀速阶段的位移为零。
planner_recalculate()
函数体为:
{
planner_reverse_pass();
planner_forward_pass();
planner_recalculate_trapezoids()
}
在plan_buffer_line()中,调用完calculate_trapezoid_for_block ()后调用此函数,planner_recalculate()中包含了三个函数,planner_reverse_pass()是从后往前依次检查并计算block的进入速度,planner_forward_pass()是从前往后依次检查并计算block的进入速度。其实质是这两个函数分别负责处理不同block的情况而存在的;再加上plan_buffer_line()中对block的进入速度的计算,利用planner_recalculate_trapezoids()可将所有块两两相连。
block_t结构体
typedef struct {
long steps_x, steps_y, steps_z, steps_e; 每个坐标轴所需走的步数
unsigned long step_event_count; 完成这个block所需走的步数,steps_x, steps_y, steps_z, steps_e的最大值
long accelerate_until; 梯形曲线中的加速距离,单位steps
long decelerate_after; 加速和匀速的距离,单位steps
long acceleration_rate; 加速率,用来计算加速度
unsigned char direction_bits; 这个block的方向位,“1”反向,“0”正向,每一个位代表一个轴的方向
unsigned char active_extruder; 所用到的有效的挤出头
float nominal_speed; 额定速度,即梯形曲线的匀速阶段的速度
float entry_speed; 进入速度,即从上一个block进入到这个block的速度
float max_entry_speed; 最大进入速度,进入速度不能超过这个值
float millimeters; 总路程,单位mm
float acceleration;加速度,单位mm/sec^2
unsigned char recalculate_flag; 连接处重新计算梯形速度曲线的标志
unsigned char nominal_length_flag; 能达到额定速度的标志
// Settings for the trapezoid generator梯形速度曲线产生器的设置参数
unsigned long nominal_rate; 这个block的单位为steps/sec的额定速度
unsigned long initial_rate; 梯形曲线的初始速度/进入速度,单位steps/sec
unsigned long final_rate; 梯形曲线的退出速度,单位steps/sec
unsigned long acceleration_st; 单位为steps/sec^2的加速度
unsigned long fan_speed;风扇速度
volatile char busy;正在处理这个block的标志位,“1”表示正在执行这个block
} block_t;
4、PID温度控制
Marlin固件在进行初始化之后进入loop()循环,和运动控制部分一样,PID温度控制也可看为前后台系统,后台接收上位机传过来的G代码,通常为M190(设置打印床温度并通过while循环等待打印床达到目标温度)、M104(设置挤出头目标温度但不等待)和M109(设置挤出头温度并通过while循环等待挤出头达到目标温度)。loop()调用process_commands()针对解析过来的G代码执行设置目标温度并且调用manage_heater()计算出一个输出值。而挤出头和打印床的加热和保持温度恒定的任务则需要前台的ISR(TIME0)中断服务程序根据manage_heater()计算出的输出值来完成。
在Marlin固件中,PID算法的采样周期T= ((16.0 * 8.0)/(F_CPU / 64.0 / 256.0)),而TIME0在比较定时中断模式下的中断时间t=128Clocks/ F_CPU,可算出T/t=16384。即在一个采样周期内,TIMEO共产生16384此中断,ISR(TIME0)通过连续不断的产生中断来控制加热开关并维持系统温度的稳定性和正确性。
固件中,只有挤出头的加热采用了PID算法进行精确控制,而打印床只是运用了继电器开关来控制温度,当前温度<</span>目标温度±偏差温度(2℃),则继电器开进行加热,否则,继电器关进行冷却。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|