use piddiy::PidController;
#[derive(Clone, Copy)]
struct ControlData {
pressure: f64,
dt: f64, }
fn hydraulic_pressure_compute(
pid: &mut PidController<f64, ControlData>,
data: ControlData,
) -> (f64, f64, f64) {
let (error, mut integral, derivative) = pid.default_compute(data.pressure);
if error * pid.error < 0.0 {
integral = 0.0;
}
(error, integral, derivative)
}
fn main() {
let set_point = 147.0; let mut pid = PidController::<f64, ControlData>::new();
pid.compute_fn(hydraulic_pressure_compute)
.set_point(set_point)
.kp(0.8) .ki(0.4) .kd(0.1);
let mut control_data = ControlData {
pressure: 14.7, dt: 0.0, };
println!("Initial Pressure: {:.2} psi", control_data.pressure);
println!("Target Pressure: {:.2} psi", set_point);
let time_steps = [0.05, 0.1, 0.2, 0.15, 0.1, 0.05, 0.08, 0.12, 0.2, 0.15];
let mut t = 0.0;
for dt in time_steps {
t += dt;
control_data.dt = dt;
let control_output = pid.compute_dt(control_data, dt);
let (error, integral, derivative) = (pid.error, pid.integral, pid.derivative);
control_data.pressure += control_output * dt;
println!(
"t = {:.2}s, Dt = {:.2}s: Pressure = {:.2} psi, Control Output = {:.2}, Error = {:.2}, Integral = {:.2}, Derivative = {:.2}",
t, dt, control_data.pressure, control_output, error, integral, derivative
);
}
}