Skip to main content

drone-autopilot

:::danger DO NOT FLY THIS BUILD v0.5 paper-correct skeleton. PID gains, sensor scales, failsafe thresholds, and motor mapping are starting-point values that need bench tuning + ground-tied throttle tests before a real airframe goes near them. [UNTESTED]. :::

A self-contained PID-stabilised quadcopter flight controller running on an E1M-AEN module. The full real-time control stack in one app: IMU sample → attitude estimation → cascaded PID → motor mixer → ESCs.

Source: examples/peripheral-io/drone-autopilot/.

Three deterministic control loops

LoopRatePriorityResponsibility
Rate1000 HzhighestInner-loop angular-rate PID; 4× ESC outputs every tick.
Attitude250 HzmiddleOuter-loop angle PID; rate setpoints fed into the inner loop.
Nav + battery + failsafe25 HzlowGPS hold, RTL trigger, low-battery RTL, link-loss failsafe.

Portable PID

The app no longer carries hand-rolled control maths. Every loop is an <alp/pid.h> controller — the library owns the output clamp, integrator anti-windup, and derivative-on-measurement:

static alp_pid_t s_rate_p, s_rate_q, s_rate_r; /* body-rate loops */
static alp_pid_t s_atti_roll, s_atti_pitch; /* attitude loops (dps) */
static alp_pid_t s_alt_pid; /* altitude-rate loop */

alp_pid_init(&s_rate_p,
&(alp_pid_config_t){ .kp = 0.10f, .ki = 0.05f, .kd = 0.001f,
.out_min = -1.0f, .out_max = 1.0f,
.deriv_on_measurement = true });

/* ... in the 1 kHz rate loop: */
const float tau_p = alp_pid_step(&s_rate_p, setp_p, s->p, dt_s);

The controllers live in autopilot.c; main.c never includes pid.h. The gains above are starting points, not tuned values — see the banner.

board.yaml

libraries:
- name: madgwick-ahrs
cores: [m55_hp]
- name: pid
cores: [m55_hp]

som:
sku: E1M-AEN801

preset: e1m-evk

pins:
- { e1m: E1M_I2C0, macro: EVK_I2C_BUS_SENSORS }
- { e1m: E1M_UART0, macro: EVK_UART_PORT_DEBUG }
- { e1m: E1M_PWM0, macro: EVK_PWM_LED_GREEN }

cores:
a32_cluster:
os: "off"
m55_hp:
app: ./src
peripherals:
- i2c
- uart
- pwm
- gpio

chips:
- lsm6dso
- bmp390
- ublox_neo_m9n
- ina236

diagnostics:
log_level: warn

See also

Questions about this page? Discuss in Community Forum