基于STM32四轴飞控制作笔记
前言 大四选了个四轴飞控作为毕业设计的题目,近来没事,把之前的制作做个总结开源出来。
硬件设计
1.遥控MCU模块和飞控的MCU模块都采用stm32f103c8t6单片机,很多高校的嵌入式教学也是基于这款的。 2.NRF24L01模块是一款2.4G无线收发器模块,通过SPI协议与MCU进行通信。由于NRF24L01采用QFN封装,手上又没有风枪之类的工具,不好焊接。于是就直接买现有的模块进行设计了。关于它的资料和代码我参考与野火的教程: http://doc.embedfire.com/products/link/zh/latest/module/wireless_misc/nrf24l01.html 3.MPU6050模块是一个6轴传感器模块,也就是加速度三个轴和陀螺仪三个轴。空谈无用,如下图从MPU6050数据手册上的截图: 红色编号1、2、3分别是三个轴的加速度传感器,4、5、6分别是三个轴的角速度传感器,7是温度传感器。大多数传感器的原理就是通过AD采集去实现的,这里也一样,7路ADC采集的值存放到相应的寄存器中。用户通过红色编号9的I2C接口去读取相应寄存器的的值。读取到的值通过数学算法解算后就能得到角度了(也就是姿态角)。还有一种比较简单得方法获取姿态角,就是通过红色编号8的DMP模块来获取,但好像移植到工程中代码量有点大,感觉还不如采用MCU解算算法好用。 MPU6050和DMP方式获取姿态角的参考资料推荐看野火的stm32教程,简单易懂。 https://www.bilibili.com/video/BV1ms411M7Cf?p=60 至于采用MCU算法来解算的方式,代码可以参考正点原子的minifly飞控代码。 http://www.openedv.com/docs/fouraxis-fly/minifly.html
4.电机驱动模块原理图如下: Q1是一个MOS管,这里可以把他看成一个开关,利用PWM技术开控制开关管的导通与关断的频率,就可以控制点机两端的电压大小,从而达到控制电机转速的目的。其MOS驱动原理可参考: https://bbs.nuedc-training.com.cn/thread-465-1-1.html
5.MCU主控模块原理图如下: 6.飞控电源模块原理图如下: 由于是使用3.7V的锂电池供电,使用一个MOS管驱动,但是电机只要运行起来,就会产生非常大的干扰,直接导致STM32复位或不运行,故此采用升压+稳压的方案设计,该方案先经过升压电路升压到5V,在经过稳压电路稳压到3.3V供MCU和传感器使用。 ME2188 是一系列高转换效率、低功耗、高工作频率的 PFM 同步升压 DC-DC 转换芯片。参考芯片手册设计原理图。 稳压部分由于手上现成的TL431芯片和三级管,就采用分立元件搭成的线性电源 稳压电路的基本组成电阻R1和稳压管D1构成,输入电压经过R1到稳压管D1,稳压管D1上会得到一个稳定的电压,假如是3.9V的稳压管就得到3.9V电压,稳压管与三极管基极连接,发射极输出,构成三极管射极跟随器,即发射极电压跟随着基极电压,由于Vbe管压降的存在(硅管0.6V~0.7V),输出电压等于稳压二极管稳压值减去三极管be极导通压降,就可以输出3.3V电压了(3.9V-0.6V)。 假如输入是12V,三极管导通后,CE端会直接输出12V电压吗? 答案是肯定不会。那为什么还能稳定输出3.3V呢?原因如下:当 E 极电压为 12V 时, E 点电位就会超过 B 点的电位,此时Vbe之间的电压就小于 0.6V, 三极管截至 (Ib =0, Ic=0)。 这时 E 极的电压就会开始急剧下降, 当下降到3.3V 的时候,Vbe的电压恢复到 0.6V ,三极管导通。这时 E 极的电压就开始往上升,Vbe之间的电压又开始小于 0.6V 并往逐渐减小,CE 之间的阻抗作用越来越大, 直到三极管关闭。 这样周而复始,最终使 E 极电压稳定在3.3V。 我这里使用TL431来替代3.9V稳压管就形成了上面的电路。TL431是一个有良好热稳定性能的三端可调精密电压基准集成芯片,具有体积小、价格低廉、性能优良等特点:它的输出电压用两个电阻就可以任意地设置到从参考电压(2.5V)到36V范围内的任何值,典型动态阻抗仅为0.2Ω,电压参考误差为±0.4%,负载电流能力从1.0mA到100mA,温度漂移低,输出噪声电压低等。 7.ADC模拟摇杆
ADC模拟摇杆的内部 可以看成电位器,PF7引脚可以看成滑片,当摇杆摇动时,电位器滑片滑动,PF7的电压就会变化,此时通过ADC去采集PF7电压,在把ADC采集的值通过无线模块发送到飞控上,控制PWM波的占空比,就能控制飞控了。
软件设计
飞控软件核心就是PID控制器的实现 当前偏差Error,由遥控器给定的目标值(用户设置的姿态)减去MPU6050检测到的测量值所得。 最近偏差Integral,由现在的误差减去上一次误差所得。 历史偏差Differ,是过去的所有误差之和。 P,I,D三个变量是PID的三个参数,PID的输出为PIDout = PError+ IIntegral+ D*Differ。然后把PIDout输出到电机上即可。
标准的PID公式如下: 积分积分 有着累积的意思,这里在程序中的实现就是所有误差的累加。这里就是通过历史的误差来控制系统。
微分,在中学时学过,函数的斜率可以通过微分表示,函数的斜率可以表示函数变化的趋势,预测未来的意思。程序中用 现在的误差减去上一次误差来表示微分项。
对于一个初学者来说飞控程序比较复杂,建议参考开源的飞控代码,反复阅读,然后根据此框架改驱动来适配我们的硬件平台。这里推荐小马哥的飞控代码,其框架比较简单,对新手比较友好。 https://oshwhub.com/PQG2030PQG/kai-yuan-si-zhou-fei-xing-qi
四轴飞控工程文件: 链接:https://pan.baidu.com/s/1vZ7N8XxfHs_EBqMNCYKiIA 提取码:kv0j –来自百度网盘超级会员V1的分享
|