手把手教你用STM32F407开发板手搓一个四轴无人机(无刷电机版本)
手把手教你用STM32F407开发板手搓一个四轴无人机(无刷电机版本)
本文将详细介绍如何使用STM32F407开发板制作一个四轴无人机。文章将从背景介绍、整体架构设计、硬件设计、软件设计等多个方面进行讲解,并附有详细的代码实现。
一、背景
前段时间,作者帮助师弟完成了一个“无人机喷药”项目。该项目时间比较仓促,但最终还是顺利完成了。师弟是自动化专业,之前学过一些电子电路、微机原理、C语言的课程,但是没有相关项目的开发经验。整个项目前后花了将近3个月的时间。
哔哩哔哩视频效果演示:https://www.bilibili.com/video/BV1aP4y137b3/?vd_source=646ab3ffb3c97fca658a999badabbc66
二、整体架构
整个无人机主要由以下几部分组成:机架、飞控、遥控器和地面站。其中机架可以根据自己的需求自行进行设计并3D打印,飞控和遥控器可以自己画PCB,自己焊接。
如果毕设学校不给报销,或者经费不足,飞控可以直接用单片机代替,遥控器可以用地面站(PC端或者手机端)代替,另外再买个6轴姿态传感器和无线透传模块即可,这样可以节省很多费用和时间。推荐组合:正点原子核心板+匿名科创地面站+MPU6050模块+无线模块。
F330机架
STM32F407最小系统板
地面站
三、硬件设计
硬件设计部分主要包括电源管理、STM32最小系统、IMU九轴姿态传感器+气压计、2.4G无线通信模块、SBUS、串口等其他外围电路。由于篇幅限制,这里只介绍电源管理和STM32最小系统的设计。
1. 电源管理
电源管理是无人机设计中非常重要的一部分。需要确保电源稳定可靠,同时还要考虑电池的续航能力。在本项目中,我们使用了两块电池,一块用于驱动电机,另一块用于供电给飞控板。两块电池通过MOS管进行切换,以确保在电池电量不足时能够及时切换到备用电池。
2. STM32最小系统
STM32最小系统是整个无人机的核心控制单元。在本项目中,我们使用了STM32F407芯片,它具有强大的处理能力和丰富的外设资源,非常适合用于无人机控制。最小系统包括了时钟电路、复位电路、电源电路、JTAG调试接口等部分。
四、软件设计
软件设计部分主要包括FreeRTOS操作系统、PID控制算法、传感器驱动、遥控遥测协议等多个方面。由于篇幅限制,这里只介绍PID控制算法和NRF24L01无线模块的实现。
1. PID控制算法
PID控制算法是无人机控制的核心算法之一。在本项目中,我们使用了四元数算法来解算无人机的姿态数据,然后通过PID控制算法来控制电机的转速,从而实现无人机的姿态稳定和位置控制。
以下是PID控制算法的核心代码:
void PID_Init(struct PID *pid,float kp,float ki,float kd,float Irange,float Ilimit)
{
pid->Kp=kp;
pid->Ki=ki;
pid->Kd=kd;
pid->IntegralRange=Irange;
pid->IntegralLimit=Ilimit;
}
void PID_Control(struct PID *pid,float SetValue,float ActualValue)
{
pid->Error=SetValue-ActualValue;
if( fabs(pid->Error)>pid->IntegralRange || RC_Control.THR<=THROTTLE_MIN)
{
pid->IntegralFlag=0;
}
else
{
pid->IntegralFlag=1;
pid->SumIntegral+=pid->Error;
if(pid->SumIntegral>pid->IntegralLimit) pid->SumIntegral=pid->IntegralLimit;
if(pid->SumIntegral<-pid->IntegralLimit) pid->SumIntegral=-pid->IntegralLimit;
}
pid->Pout=pid->Kp*pid->Error;
pid->Iout=pid->IntegralFlag*pid->Ki*pid->SumIntegral;
pid->Dout=pid->Kd*(pid->Error-pid->PreError);
pid->OutPut=pid->Pout+pid->Iout+pid->Dout;
pid->PreError=pid->Error;
}
2. NRF24L01无线模块
NRF24L01是一款常用的2.4GHz无线通信模块,具有低功耗、高传输速率等特点,非常适合用于无人机的遥控和遥测。在本项目中,我们使用了NRF24L01模块来实现无人机和遥控器之间的通信。
以下是NRF24L01无线模块的核心代码:
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_16);//spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
NRF24L01_CE=1;//启动发送
while(NRF24L01_IRQ!=0);//等待发送完成
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}
以上就是使用STM32F407开发板制作四轴无人机的核心技术要点。希望本文能够帮助读者更好地理解无人机的开发过程,同时也欢迎读者在实际开发中遇到问题时与我交流。