11#if DETWS_ENABLE_CONTROL
17void pid_init(Pid *p,
float kp,
float ki,
float kd)
25 p->out_min = -CONTROL_UNBOUNDED;
26 p->out_max = CONTROL_UNBOUNDED;
27 p->integ_min = -CONTROL_UNBOUNDED;
28 p->integ_max = CONTROL_UNBOUNDED;
35void pid_set_rate(Pid *p,
float dt)
40 p->inv_dt = 1.0f / dt;
44void pid_set_output_limits(Pid *p,
float lo,
float hi)
53void pid_set_integral_limits(Pid *p,
float lo,
float hi)
62void pid_set_derivative_filter(Pid *p,
float alpha)
68void pid_set_feedforward(Pid *p,
float kff)
86void pid_update_n(Pid *p,
const float *setpoint,
const float *measurement,
float dt,
float *out, uint8_t n)
88 if (!p || !setpoint || !measurement || !out)
90 for (uint8_t i = 0; i < n; i++)
91 out[i] = pid_update(&p[i], setpoint[i], measurement[i], dt);
96static size_t put_u16le(uint8_t *p, uint16_t v)
98 p[0] = (uint8_t)(v & 0xFF);
99 p[1] = (uint8_t)(v >> 8);
103static size_t put_u32le(uint8_t *p, uint32_t v)
105 p[0] = (uint8_t)(v & 0xFF);
106 p[1] = (uint8_t)((v >> 8) & 0xFF);
107 p[2] = (uint8_t)((v >> 16) & 0xFF);
108 p[3] = (uint8_t)((v >> 24) & 0xFF);
112static size_t put_f32le(uint8_t *p,
float v)
116 return put_u32le(p, u);
119size_t pid_log_header(uint8_t *buf,
size_t cap,
const Pid *p,
float dt)
121 if (!buf || !p || cap < PID_LOG_HEADER_LEN)
124 memcpy(buf, PID_LOG_MAGIC, 4);
126 buf[o++] = PID_LOG_VERSION;
128 o += put_u16le(buf + o, 0);
129 o += put_f32le(buf + o, dt);
130 o += put_f32le(buf + o, p->kp);
131 o += put_f32le(buf + o, p->ki);
132 o += put_f32le(buf + o, p->kd);
133 o += put_f32le(buf + o, p->kff);
134 o += put_f32le(buf + o, p->out_min);
135 o += put_f32le(buf + o, p->out_max);
139size_t pid_log_record(uint8_t *buf,
size_t cap,
float setpoint,
float measurement,
float output,
bool saturated)
141 if (!buf || cap < PID_LOG_RECORD_LEN)
144 o += put_f32le(buf + o, setpoint);
145 o += put_f32le(buf + o, measurement);
146 o += put_f32le(buf + o, output);
147 o += put_u32le(buf + o, saturated ? PID_LOG_STATUS_SATURATED : 0u);
Closed-loop control law (DETWS_ENABLE_CONTROL) - a zero-heap PID controller plus a handful of inline ...