17void pid_init(Pid *p,
float kp,
float ki,
float kd)
27 p->out_min = -CONTROL_UNBOUNDED;
28 p->out_max = CONTROL_UNBOUNDED;
29 p->integ_min = -CONTROL_UNBOUNDED;
30 p->integ_max = CONTROL_UNBOUNDED;
37void pid_set_rate(Pid *p,
float dt)
42 p->inv_dt = 1.0f / dt;
46void pid_set_output_limits(Pid *p,
float lo,
float hi)
55void pid_set_integral_limits(Pid *p,
float lo,
float hi)
64void pid_set_derivative_filter(Pid *p,
float alpha)
72void pid_set_feedforward(Pid *p,
float kff)
94void pid_update_n(Pid *p,
const float *setpoint,
const float *measurement,
float dt,
float *out, uint8_t n)
96 if (!p || !setpoint || !measurement || !out)
100 for (uint8_t i = 0; i < n; i++)
102 out[i] = pid_update(&p[i], setpoint[i], measurement[i], dt);
108static size_t put_u16le(uint8_t *p, uint16_t v)
110 p[0] = (uint8_t)(v & 0xFF);
111 p[1] = (uint8_t)(v >> 8);
115static size_t put_u32le(uint8_t *p, uint32_t v)
117 p[0] = (uint8_t)(v & 0xFF);
118 p[1] = (uint8_t)((v >> 8) & 0xFF);
119 p[2] = (uint8_t)((v >> 16) & 0xFF);
120 p[3] = (uint8_t)((v >> 24) & 0xFF);
124static size_t put_f32le(uint8_t *p,
float v)
128 return put_u32le(p, u);
131size_t pid_log_header(uint8_t *buf,
size_t cap,
const Pid *p,
float dt)
133 if (!buf || !p || cap < PID_LOG_HEADER_LEN)
138 memcpy(buf, PID_LOG_MAGIC, 4);
140 buf[o++] = PID_LOG_VERSION;
142 o += put_u16le(buf + o, 0);
143 o += put_f32le(buf + o, dt);
144 o += put_f32le(buf + o, p->kp);
145 o += put_f32le(buf + o, p->ki);
146 o += put_f32le(buf + o, p->kd);
147 o += put_f32le(buf + o, p->kff);
148 o += put_f32le(buf + o, p->out_min);
149 o += put_f32le(buf + o, p->out_max);
153size_t pid_log_record(uint8_t *buf,
size_t cap,
float setpoint,
float measurement,
float output,
bool saturated)
155 if (!buf || cap < PID_LOG_RECORD_LEN)
160 o += put_f32le(buf + o, setpoint);
161 o += put_f32le(buf + o, measurement);
162 o += put_f32le(buf + o, output);
163 o += put_u32le(buf + o, saturated ? PID_LOG_STATUS_SATURATED : 0u);
Closed-loop control law (PC_ENABLE_CONTROL) - a zero-heap PID controller plus a handful of inline con...