配置信息
[resonance_tester]
probe_points:0, 0, 20
accel_chip: adxl345
min_freq: 20
max_freq: 80
accel_per_hz: 300
[resonance_tester]
用于通过加速度传感器(如 ADXL345)来测量打印机在不同频率下的振动反应。[input_shaper]
配置用于输入整形,即在检测到的共振频率附近通过输入整形技术来补偿振动。
ResonanceTester 初始化
class ResonanceTester:
def __init__(self, config):
self.printer = config.get_printer()
self.move_speed = config.getfloat('move_speed', 50., above=0.)
self.test = VibrationPulseTest(config)
if not config.get('accel_chip_x', None):
self.accel_chip_names = [('xy', config.get('accel_chip').strip())]
else:
self.accel_chip_names = [
('x', config.get('accel_chip_x').strip()),
('y', config.get('accel_chip_y').strip())]
if self.accel_chip_names[0][1] == self.accel_chip_names[1][1]:
self.accel_chip_names = [('xy', self.accel_chip_names[0][1])]
self.max_smoothing = config.getfloat('max_smoothing', None, minval=0.05)
self.gcode = self.printer.lookup_object('gcode')
self.gcode.register_command("MEASURE_AXES_NOISE",
self.cmd_MEASURE_AXES_NOISE,
desc=self.cmd_MEASURE_AXES_NOISE_help)
self.gcode.register_command("TEST_RESONANCES",
self.cmd_TEST_RESONANCES,
desc=self.cmd_TEST_RESONANCES_help)
self.gcode.register_command("SHAPER_CALIBRATE",
self.cmd_SHAPER_CALIBRATE,
desc=self.cmd_SHAPER_CALIBRATE_help)
self.printer.register_event_handler("klippy:connect", self.connect)
class VibrationPulseTest:
def __init__(self, config):
self.printer = config.get_printer()
self.gcode = self.printer.lookup_object('gcode')
self.min_freq = config.getfloat('min_freq', 5., minval=1.)
self.max_freq = config.getfloat('max_freq', 10000. / 75.,
minval=self.min_freq, maxval=200.)
self.accel_per_hz = config.getfloat('accel_per_hz', 75., above=0.)
self.hz_per_sec = config.getfloat('hz_per_sec', 1.,
minval=0.1, maxval=2.)
self.probe_points = config.getlists('probe_points', seps=(',', '\n'),
parser=float, count=3)
- 获取配置参数
- 注册gcode命令回调函数,包含:MEASURE_AXES_NOISE、TEST_RESONANCES、SHAPER_CALIBRATE
- 注册"klippy:connect"事件回调函数
- 调用关系:TEST_RESONANCES (gcode) —> cmd_TEST_RESONANCES —> shaper_calibrate.ShaperCalibrate —> ResonanceTester._run_test —> ShaperCalibrate .process_accelerometer_data —> ResonanceTester.save_calibration_data
InputShaper 初始化
class InputShaper:
def __init__(self, config):
self.printer = config.get_printer()
self.printer.register_event_handler("klippy:connect", self.connect)
self.toolhead = None
self.shapers = [AxisInputShaper('x', config),
AxisInputShaper('y', config)]
self.stepper_kinematics = []
self.orig_stepper_kinematics = []
gcode = self.printer.lookup_object('gcode')
gcode.register_command("SET_INPUT_SHAPER",
self.cmd_SET_INPUT_SHAPER,
desc=self.cmd_SET_INPUT_SHAPER_help)
- 注册 “klippy:connect” 事件回调函数
- 注册 “SET_INPUT_SHAPER” 的gcode 命令回调函数 cmd_SET_INPUT_SHAPER
- 调用关系: cmd_SET_INPUT_SHAPER —> _update_input_shaping —>set_shaper_kinematics —> kin_shaper.c( ) —>input_shaper_set_shaper_params
input_shaper_set_shaper_params(struct stepper_kinematics *sk, char axis
, int n, double a[], double t[])
{
if (axis != 'x' && axis != 'y')
return -1;
struct input_shaper *is = container_of(sk, struct input_shaper, sk);
struct shaper_pulses *sp = axis == 'x' ? &is->sx : &is->sy;
int status = 0;
if (is->orig_sk->active_flags & (axis == 'x' ? AF_X : AF_Y))
status = init_shaper(n, a, t, sp);
else
sp->num_pulses = 0;
shaper_note_generation_time(is);
return status;
}