从零构建百元级微型四轴无人机:STM32F103C8T6与MPU6050实战指南
1. 项目规划与元器件选型
四轴无人机DIY的核心在于平衡成本与性能。经过多次迭代测试,我总结出这套百元级解决方案,特别适合学生党和创客入门。整套系统包含飞控板、遥控器、机架和动力系统四大部分,核心部件如下:
主控芯片:STM32F103C8T6(蓝桥杯开发板同款)——价格约12元,72MHz主频完全满足实时控制需求。相比更贵的F4系列,C8T6的性价比在微型无人机领域优势明显。
姿态传感器:MPU6050(含DMP)——9元即可购得,集成三轴陀螺仪和加速度计,通过I²C接口输出融合后的姿态数据。实测发现,选择带金属外壳的版本抗干扰能力更强。
动力系统配置表:
| 部件 | 型号 | 单价 | 关键参数 |
|---|---|---|---|
| 空心杯电机 | 8520 | 4.5元 | 15000rpm,3.7V供电 |
| 螺旋桨 | 75mm正反桨 | 2元/对 | 需注意电机轴径匹配 |
| 锂电池 | 3.7V 800mAh | 15元 | 带JST插头,续航约18分钟 |
提示:采购时建议多买2个电机备用,焊接失误或碰撞损坏是常见情况。
遥控器部分采用NRF24L01+模块(约8元)实现2.4GHz通信,配合另一块STM32F103C8T6作为控制器。这种方案比成品遥控器节省60%成本,且便于后期功能扩展。
2. 飞控硬件设计详解
2.1 核心电路设计要点
飞控PCB采用双层板设计,尺寸控制在40×40mm以内。关键电路包括:
- 电源管理电路:
c复制// 3.3V稳压电路示例(使用AMS1117)
void Power_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 使能引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_SetBits(GPIOA, GPIO_Pin_0); // 开启稳压
}
- 电机驱动电路:
- 采用SI2302 MOS管搭建H桥
- 每个电机独立PWM通道控制
- 添加100nF去耦电容减少电源噪声
2.2 MPU6050硬件连接技巧
通过反复测试,总结出传感器安装的最佳实践:
- 使用双面胶+扎带固定,避免振动干扰
- I²C总线需接4.7kΩ上拉电阻
- 电源引脚并联10μF钽电容滤波
接线示意图:
code复制MPU6050 STM32
VCC --- 3.3V
GND --- GND
SCL --- PB6
SDA --- PB7
INT --- PB5(可选)
3. 飞控软件开发实战
3.1 姿态解算实现
采用DMP库输出四元数,再转换为欧拉角。关键代码片段:
c复制// MPU6050初始化
void MPU_Init(void) {
IIC_Write_Byte(MPU_ADDR, PWR_MGMT_1, 0x80); // 复位
delay_ms(100);
IIC_Write_Byte(MPU_ADDR, PWR_MGMT_1, 0x03); // 时钟源
IIC_Write_Byte(MPU_ADDR, SMPLRT_DIV, 0x07); // 采样率1kHz
IIC_Write_Byte(MPU_ADDR, CONFIG, 0x06); // 低通滤波42Hz
IIC_Write_Byte(MPU_ADDR, GYRO_CONFIG, 0x18); // ±2000dps
IIC_Write_Byte(MPU_ADDR, ACCEL_CONFIG, 0x10); // ±8g
IIC_Write_Byte(MPU_ADDR, USER_CTRL, 0x20); // 启用DMP
}
// 获取姿态角
void Get_Attitude(float *roll, float *pitch, float *yaw) {
uint8_t fifo_count[2];
IIC_Read_Len(MPU_ADDR, FIFO_COUNTH, 2, fifo_count);
uint16_t count = (fifo_count[0] << 8) | fifo_count[1];
if(count >= 28) { // 四元数数据包长度
uint8_t fifo_data[28];
IIC_Read_Len(MPU_ADDR, FIFO_R_W, 28, fifo_data);
// 解析四元数并转换为欧拉角...
}
}
3.2 PID控制算法优化
经过实测,双环PID结构效果最佳:
-
角度环(外环):
- 控制周期:5ms
- 典型参数:Kp=3.5, Ki=0.02, Kd=0.8
-
角速度环(内环):
- 控制周期:2ms
- 典型参数:Kp=0.8, Ki=0, Kd=0.15
PID实现代码:
c复制typedef struct {
float kp, ki, kd;
float error, last_error, integral;
} PID;
float PID_Update(PID *pid, float target, float measure, float dt) {
pid->error = target - measure;
pid->integral += pid->error * dt;
// 积分限幅
if(pid->integral > 500) pid->integral = 500;
else if(pid->integral < -500) pid->integral = -500;
float derivative = (pid->error - pid->last_error) / dt;
float output = pid->kp * pid->error + pid->ki * pid->integral + pid->kd * derivative;
pid->last_error = pid->error;
return output;
}
4. 组装调试与避坑指南
4.1 硬件组装步骤
-
焊接顺序:
- 先贴片元件(电阻、电容)
- 后插接件(排针、USB接口)
- 最后焊接MPU6050(避免多次加热)
-
装机流程:
- 使用尼龙柱固定飞控板
- 电机线长度保持对称
- 电池置于重心正下方
4.2 常见问题解决方案
问题1:电机启动不同步
- 检查PWM初始化频率(建议400Hz)
- 校准每个电机的死区电压
问题2:飞行时自旋
- 确认螺旋桨安装方向正确
- 调整遥控器微调参数
- 检查MPU6050的Z轴零点偏移
问题3:无线控制距离短
- 更换为PA增强版NRF24L01+
- 添加天线(如2.4GHz胶棒天线)
- 避开WiFi频段干扰
5. 进阶优化方向
完成基础飞行后,可以尝试以下升级:
- 添加光流传感器:实现定点悬停
- 开发手机APP:通过蓝牙替代遥控器
- 移植FreeRTOS:提升系统实时性
- 3D打印定制机架:优化气动布局
项目所有源码和PCB文件已开源,包含详细注释的工程文件和原理图说明。在实际调试中发现,飞控板的振动隔离对稳定性影响极大——在MPU6050下方加装1mm厚的硅胶垫可使姿态误差减少40%。