Klipper-共振补偿

配置信息
[resonance_tester]
probe_points:0, 0, 20
accel_chip: adxl345
min_freq: 20
max_freq: 80
accel_per_hz: 300


#*# [input_shaper]
#*# shaper_type_x = zero_zv
#*# shaper_freq_x = 39.6
#*# shaper_type_y = zero_zv
#*# shaper_freq_y = 41.2
  • [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.)
        # Defaults are such that max_freq * accel_per_hz == 10000 (max_accel)
        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 = []
        # Register gcode commands
        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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值