ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
alt_ctrl.c
Go to the documentation of this file.
1
4#include "alt_ctrl.h"
5
6static float clampf(float v, float lo, float hi) { return v < lo ? lo : (v > hi ? hi : v); }
7
8void alt_ctrl_init(alt_ctrl_t *c, float hover)
9{
10 c->hover = hover;
11 c->kp_h = 1.2f; c->kp_v = 0.25f; c->ki_v = 0.15f;
12 c->thr_min = 0.05f; c->thr_max = 0.90f;
13 c->i_lim = 0.35f;
14 c->integ = 0.0f;
15}
16
17void alt_ctrl_reset(alt_ctrl_t *c, float integ) { c->integ = clampf(integ, -c->i_lim, c->i_lim); }
18
19float alt_ctrl_vz_sp(const alt_ctrl_t *c, float h_sp, float h, float up, float dn)
20{
21 return clampf(c->kp_h * (h_sp - h), -dn, up);
22}
23
24float alt_ctrl_step(alt_ctrl_t *c, float vz_sp, float vz, float ct, float dt)
25{
26 const float e = vz_sp - vz;
27 const float raw = c->hover + c->kp_v * e + c->integ;
28 const float lim = clampf(raw / (ct > 0.5f ? ct : 0.5f), c->thr_min, c->thr_max);
29 /* anti-windup: integrate only when not saturated in the error direction */
30 if (!((lim >= c->thr_max && e > 0.0f) || (lim <= c->thr_min && e < 0.0f)))
31 c->integ = clampf(c->integ + c->ki_v * e * dt, -c->i_lim, c->i_lim);
32 return lim;
33}
float alt_ctrl_vz_sp(const alt_ctrl_t *c, float h_sp, float h, float up, float dn)
Definition alt_ctrl.c:19
void alt_ctrl_reset(alt_ctrl_t *c, float integ)
Definition alt_ctrl.c:17
void alt_ctrl_init(alt_ctrl_t *c, float hover)
Definition alt_ctrl.c:8
static float clampf(float v, float lo, float hi)
Definition alt_ctrl.c:6
float alt_ctrl_step(alt_ctrl_t *c, float vz_sp, float vz, float ct, float dt)
Definition alt_ctrl.c:24
Vertical control: height -> climb rate -> collective thrust.
float ki_v
Definition alt_ctrl.h:16
float thr_max
Definition alt_ctrl.h:17
float thr_min
Definition alt_ctrl.h:17
float integ
Definition alt_ctrl.h:19
float kp_h
Definition alt_ctrl.h:16
float kp_v
Definition alt_ctrl.h:16
float hover
initial hover thrust guess (0..1)
Definition alt_ctrl.h:15
float i_lim
Definition alt_ctrl.h:18