Infanoid | Keepon | ClayBot
Nihongo | English
Preparation for motor simulation
figure: actuating an arm with a weight
Jload = Marm Larm² ⁄ 3 + Mweight Larm²
Tload(α) = Mweight Larm g sin(α)
Tmot = KM IB ω
ω' = (TmotTload ⁄ (ηρ)) ⁄ (Jmot + Jgear + Jloadρ²)
Practice in motor simulation
Motor: maxon 118637
(RE 13 φ13mm, Graphite Brushes, 3W)
Vo 12 [V]
ωo 1371.83 [rad/s] (13100 [rpm])
Io 0.0444 [A] (44.4 [mA])
R 9.07 [Ω]
KM 0.842×10-2 [Nm/A] (8.42 [mNm/A])
Jmot 0.541×10-7 [kgm²] (0.541 [gcm²])
Gear: maxon 110315
(Planetary Gearhead GP 13 A)
ρ 67.49 (185193 / 2744)
η 0.75 (75 [%])
Jgear 0.15×10-8 [kgm²] (0.015 [gcm²]
double t = 0.0, Δtsim = 0.0001;
double ω = 0.0, θ = 0.0; α = 0.0;

double Tload ()
{
    return Mweight * Larm * G * sin(α);
}
double Jload ()
{
    return Marm * Larm * Larm / 3 + Mweight * Larm * Larm;
}

double motor (double V)
{
    double I, Tmot, Tload, Jload, ω';

    I = (V - K * ω) / R;
    Tmot  = K * I - (K * Io / ωo) * ω;
    ω' = (Tmot - Tload()/(η*ρ)) / (Jmot + Jgear + Jload()/(ρ*ρ));
    return ω';
}

void sim_step (double V)
{
    double ωold;

    ωold = ω;
    ω += motor(V) * Δtsim;
    θ += (ω + ωold) / 2 * Δtsim;
    α = θ / ρ;
}

void sim_loop (double V, double Δt)
{
    double tsim_end

    tsim_end = t + Δt;
    while (t < tsim_end) {
        printf("%f %f¥n", t, α);
        sim_step(V);
        t += Δtsim;
    }
}
figure: simple motor simulation (1)
figure: simple motor simulation (2)
Closed-loop motor simulation
Encoder: maxon 241062
(Encoder MR, Type S, 256 pulses per turn, 2 channels)
Nenc 256 [pulses/turn] (1024 [counts/turn])
V = Kp e
double Δtc = 0.001;

double ENC_get ()
{
    return floor(θ / dθ);
}

void cont_step_p (double Kp, double θgoal)
{
    double e, V;

    e = θgoal - ENC_get() * dθ
    V = Kp * e;
    if (V > Vmp) V = Vmp; else if (V < -Vmp) V = -Vmp;
    sim_loop(V, Δtc);
}

void cont_loop (double Kp, double αgoal, double tend)
{
    while (t < tend) {
        printf("%f %f\n", t, α);
        cont_step_p(Kp, αgoal * ρ);
    }
}
figure: simulation of proportional control (1)
figure: simulation of proportional control (2)
figure: simulation of proportional control (3)
V = Kp e + Kie dt
V = Kp e + Ki Σe(τ)Δtc
void cont_step_pi (double Kp, double Ki, double θgoal)
{
    double e, Vp, V;
    static double Vi = 0.0;

    e = θgoal - ENC_get() * dθ
    Vp = Kp * e;
    Vi += Ki * e * Δtc;
    if (Vi > Vmp) Vi = Vmp; else if (Vi < -Vmp) Vi = -Vmp;
    V = Vi + Vp;
    if (V > Vmp) V = Vmp; else if (V < -Vmp) V = -Vmp;
    sim_loop(V, Δtc);
}

void cont_loop (double Kp, double Ki, double αgoal, double tend)
{
    while (t < tend) {
        printf("%f %f\n", t, α);
        cont_step_pi(Kp, Ki, αgoal * ρ);
    }
}
figure: simulation of PI control
V = Kp e + Kd (de ⁄ dt)
V = Kp e + Kd (e(t) − e(t−1)) ⁄ Δtc
V = Kp eKd (dθ ⁄ dt) = Kp eKd (θ(t) − θ(t−1)) ⁄ Δtc
void cont_step_pd (double Kp, double Kd, double θgoal)
{
    double θ, e, V;
    static double θold = 0.0;

    θ = ENC_get() * dθ;
    e = θgoal - θ;
    V = Kp * e - Kd * (θ - θold) / Δtc;
    if (V > Vmp) V = Vmp; else if (V < -Vmp) V = -Vmp;
    sim_step(V);
    θold = θ;
}

void cont_loop (double Kp, double Kd, double αgoal, double tend)
{
    while (t < tend) {
        printf("%f %f\n", t, α);
        cont_step_pd(Kp, Kd, αgoal * ρ);
    }
}
figure: simulation of PD control
V = Kp e + Kie dt + Kd (dθ ⁄ dt)
void cont_step_pid (double Kp, double Ki, double Kd, double θgoal)
{
    double θ, e, Vp, Vd, V;
    static double Vi = 0.0;
    static double θold = 0.0;

    θ = ENC_get() * dθ;
    e = θgoal - θ;
    Vp = Kp * e;
    Vi += Ki * e * Δtc;
    if (Vi > Vmp) Vi = Vmp; else if (Vi < -Vmp) Vi = -Vmp;
    Vd = - Kd * (θ - θold) / Δtc;
    V = Vp + Vi + Vd;
    if (V > Vmp) V = Vmp; else if (V < -Vmp) V = -Vmp;
    sim_loop(V, Δtc);
    θold = θ;
}

void cont_loop (double Kp, double Ki, double Kd, double αgoal, double tend)
{
    while (t < tend) {
        printf("%f %f\n", t, α);
        cont_step_pid(Kp, Ki, Kd, αgoal * ρ);
    }
}
figure: simulation of PID control (1)
figure: simulation of PID control (2)
Motor simulation
Motor
Vo V
ωo rad/s
Io A
R Ω
KM Nm/A
Jmot kgm²
load
data
Gear
ρ
η
Jgear kgm²
Encoder
Nenc pulses
Load
Larm m
Marm kg
Mweight kg
PID parameters
Kp
Ki
Kd
PID control freq
Δtc s
Motor power supply
Vmp V
Command (tgoal, αgoal)
1
2
3
Graph (min/max/step)
t [s]
α [rad]