基于 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 配置文件
| 文件/模块 | 功能描述 |
|---|---|
| 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 | 飞行应用 |
| 任务名称 | 优先级 | 栈大小 | 功能描述 |
|---|---|---|---|
| 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 中配置:
#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); // 姿态解算参数// 横滚/俯仰/偏航 三个轴的 PID
// 外环:角度 Kp/Ki/Kd
// 内环:角速度 Kp/Ki/Kd
// 输出限幅、积分限幅// 解锁/模式开关阈值
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);const float w1 = 0.6f; // MPU6050_1 权重
const float w2 = 0.4f; // MPU6050_2 权重- 陀螺仪: 需要初始化时静置校准
- 加速度计: 需要水平校准
- 遥控器: 需要设置中性位置和行程
- 打开
MDK-ARM/F407_hal.uvprojx - 选择目标
F407_hal - 点击编译按钮或按
F7
- 支持 ST-LINK / J-Link 调试器
- 使用 Keil 的 Download 功能或外部工具
| 状态 | RGB 显示 |
|---|---|
| 初始化中 | 白色闪烁 |
| 未解锁 | 红色 |
| 已解锁 | 绿色 |
| 自主悬停 | 蓝色 |
| 失控保护 | 红色闪烁 |
| 错误 | 红色快速闪烁 |
- 参数调整: PID 参数和滤波系数必须根据实际飞行器调整,默认值仅作参考
- 安全飞行: 首次试飞前请充分测试,做好安全防护措施
- 传感器校准: 使用前务必校准 MPU6050 和遥控器
- SD 卡日志: 飞行数据会记录到 SD 卡,便于后续分析
- ESP32-CAM: CAN 通信需要配套的固件
- STM32F4xx HAL Drivers
- FreeRTOS
本项目仅供学习和研究使用。
如有问题或建议,请通过以下方式联系: