dsmc 0.16.0

Digitalservo Motion Control Library
Documentation
//! Nyquist plots and Bode diagrams of a PID controller with a double integrator, for gains scaled by
//! 0.8 ..= 1.2, written to `out/nyquist/` and `out/bode/`.
//!
//! `cargo run --example nyquist`

use dsmc::logger::DataStorage;
use dsmc::{BodeDiagramPlotter, NyquistPlotter, TransferFunction};

fn main() {

    let omega = 300.0;

    let kp = 3.0 * omega * omega;
    let kd = 3.0 * omega;
    let ki = omega* omega * omega;

    let iter = 10;
    for i in 0..=iter {
        let alpha = 0.8 + 0.4 / iter as f64 * i as f64;

        let mut storage_n = DataStorage::new(format!("./out/nyquist/nyquist_alpha_{:.02}.csv", alpha)).unwrap();
        let mut storage_b = DataStorage::new(format!("./out/bode/bode_alpha_{:.02}.csv", alpha)).unwrap();

        let plotter_n = NyquistPlotter::<f64>::new(10.0, 2000.0, 0.01);
        let plotter_b = BodeDiagramPlotter::<f64>::new(0.1, 1000.0, 0.01, true);

        let tf_main = TransferFunction::continuous(&[alpha * kd, alpha * kp, alpha * ki], &[1.0, 0.0]);
        let tf_pl = TransferFunction::continuous(&[1.0], &[1.0, 0.0, 0.0]);
        let tf = tf_main * tf_pl;
        {
            let responses = plotter_n.plot(&tf);
            for res in responses {
                storage_n.add(&res).unwrap();
            }
        }
        {
            let responses = plotter_b.frequency_response_s(&tf);
            for res in responses {
                storage_b.add(&res).unwrap();
            }
        }

        storage_n.close().unwrap();
        storage_b.close().unwrap();
    }

}