Skip to content

Repository files navigation

LQ-4 四旋翼飞行器飞控系统

基于 STM32F407 + FreeRTOS 的四旋翼飞行器飞控固件。

硬件资源

主控芯片

  • MCU: STM32F407ZGTx
  • 系统时钟: 168 MHz

外设资源

外设 功能 引脚配置
I2C1 MPU6050_1 PF0, PF1
I2C2 MPU6050_2 PB10, PB11
UART2 GPS_M8N PA2, PA3
UART3 PPM_MC6RE (SBUS) PB10, PB11
CAN1 ESP_CAN PA11, PA12
GPIO RGB LED PF3, PF4, PF5
TIM6 系统时基 -

主要外设

  • 双 MPU6050: 陀螺仪 + 加速度计,用于姿态解算
  • GPS_M8N: 全球定位系统,用于自主悬停
  • PPM_MC6RE: SBUS 遥控接收机
  • RGB LED: 系统状态指示
  • CAN 总线: ESP32-CAM 通信

软件架构

开发环境

  • IDE: Keil MDK-ARM
  • CubeMX: 外设初始化配置
  • HAL库: STM32F4xx HAL Drivers
  • RTOS: FreeRTOS v10 (CMSIS-RTOS v2)

目录结构

LQ-4/
├── Core/               # 核心代码
│   ├── Inc/            # 头文件
│   └── Src/            # 源文件
├── Drivers/            # HAL 驱动和 CMSIS
├── Middlewares/        # FreeRTOS 中间件
├── User/               # 用户代码
│   ├── Inc/            # 用户头文件
│   └── Src/            # 用户源文件
├── MDK-ARM/            # Keil 工程文件
└── F407_hal.ioc        # CubeMX 配置文件

用户代码模块 (User/)

文件/模块 功能描述
mpu6050.c/h MPU6050 驱动(双传感器)
ppm_mc6re.c/h SBUS 遥控接收机驱动
gps_m8n.c/h GPS NMEA 数据解析
RGB.c/h RGB LED 控制(呼吸灯、颜色循环)
esp_can.c/h CAN 总线通信(ESP32-CAM)
alg_filter.c/h 滤波算法(低通滤波、滑动窗口滤波)
alg_pose.c/h 姿态解算(四元数)
alg_pid.c/h PID 控制(串级 PID)
config.c/h 系统配置和全局状态
utils.c/h 工具函数(映射、约束等)
drv_sd.c/h SD 卡驱动
usb_cam.c/h USB 相机驱动
app_control.c/h 控制应用
app_fly.c/h 飞行应用

FreeRTOS 任务

任务名称 优先级 栈大小 功能描述
SensorTask High 512 500Hz 采样:读取双 MPU6050,IMU 融合,低通滤波
AttitudeTask Normal 1024 姿态解算:四元数更新,释放 PID 任务信号量
PIDTask Low7 1024 串级 PID:角度外环 + 角速度内环,计算电机输出
RCTask Low6 512 遥控处理:解析 SBUS 数据,映射控制目标
HoverTask Low5 1024 自主悬停:结合 GPS 和高度数据
GPSTask Low4 1024 GPS 数据解析:NMEA 数据解析,更新位置
MonitorTask Low 512 系统监控:看门狗喂狗,电压检测,日志记录
RGBTask - - LED 指示:状态机驱动 RGB 显示
SDTask Low3 2048 SD 卡存储:飞行数据日志
CamTask - - 相机控制
defaultTask Normal 128 (保留,暂未使用)

互斥锁与信号量

互斥锁

  • Mutex_Sensor: 保护原始 IMU 和融合后 IMU 数据
  • Mutex_Attitude: 保护姿态数据
  • Mutex_RC: 保护遥控数据
  • Mutex_GPS: 保护 GPS 数据
  • Mutex_System: 保护系统状态

信号量

  • Sema_Sensor: I2C DMA 接收完成(触发 SensorTask)
  • Sema_Attitude: 传感器数据就绪(触发 AttitudeTask)
  • Sema_PID: 姿态数据就绪(触发 PIDTask)
  • Sema_GPS: GPS 数据就绪(触发 HoverTask)

参数配置

需要调整的关键参数

主要在 config.c 中配置:

1. IMU 相关

#define IMU_DT     0.004f  // IMU 采样周期(秒)
LPF_Init(&ctrl.lpf_gyro[i], 0.15f);  // 陀螺仪滤波系数
LPF_Init(&ctrl.lpf_acc[i], 0.1f);    // 加速度计滤波系数
Pose_Init(&ctrl.pose, IMU_DT, 2.0f, 0.001f);  // 姿态解算参数

2. 串级 PID 参数

// 横滚/俯仰/偏航 三个轴的 PID
// 外环:角度 Kp/Ki/Kd
// 内环:角速度 Kp/Ki/Kd
// 输出限幅、积分限幅

3. 遥控相关

// 解锁/模式开关阈值
if (ch[CH_THR] < 0.05f) { arm = 0; }
if (ch[CH_AUX1] > 0.8f) { arm = 1; }

// 角度映射范围
ctrl.target_roll = Map_Float(ch[CH_ROL], 0.0f, 1.0f, -30.0f, 30.0f);

4. 双 IMU 融合权重

const float w1 = 0.6f;  // MPU6050_1 权重
const float w2 = 0.4f;  // MPU6050_2 权重

校准要求

  • 陀螺仪: 需要初始化时静置校准
  • 加速度计: 需要水平校准
  • 遥控器: 需要设置中性位置和行程

编译与烧录

编译

  1. 打开 MDK-ARM/F407_hal.uvprojx
  2. 选择目标 F407_hal
  3. 点击编译按钮或按 F7

烧录

  • 支持 ST-LINK / J-Link 调试器
  • 使用 Keil 的 Download 功能或外部工具

系统状态 LED

状态 RGB 显示
初始化中 白色闪烁
未解锁 红色
已解锁 绿色
自主悬停 蓝色
失控保护 红色闪烁
错误 红色快速闪烁

注意事项

  1. 参数调整: PID 参数和滤波系数必须根据实际飞行器调整,默认值仅作参考
  2. 安全飞行: 首次试飞前请充分测试,做好安全防护措施
  3. 传感器校准: 使用前务必校准 MPU6050 和遥控器
  4. SD 卡日志: 飞行数据会记录到 SD 卡,便于后续分析
  5. ESP32-CAM: CAN 通信需要配套的固件

依赖项目

  • STM32F4xx HAL Drivers
  • FreeRTOS

许可证

本项目仅供学习和研究使用。

联系方式

如有问题或建议,请通过以下方式联系:

About

基于 STM32F407 + FreeRTOS 的四旋翼飞行器飞控固件

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages