Drone-Mercury 从零开始的四轴无人机制作(二)- 硬件与PCB
该项目目前还是正在进行的一个状态,Github中提供了现在最新的进度。如果对您有帮助,请点个星星支持一下!
Github地址: https://github.com/Xiangyu-Fu/Drone-Mercury
Drone-Mercury 从零开始的四轴无人机制作(二)- 硬件与PCB
2. 硬件与PCB
首先来看一下硬件的部分。硬件的部分是非常重要的一环。但是很多时候问题是,没有足够的资料来对整个知识网络进行一个整理和汇总,因此我们就没法获得一个整体上对产品设计上的观念和感觉。所以这也是为什么我想从底层开始构建一个完成的项目。只有这样我们才可以对其它的方向进行一个概念性的理解,来增强对整体的一个把握。
在这个项目开始之前,我一直觉得硬件部分是比较困难的,不过,根据我现在的想法来看,的确是这样。不过硬件更多的困难是体现在物理世界的,很多debug也是要考虑物理问题,这是我觉得和软件层面最大的不同。所以,在我目前看来,硬件方面是非常基于经验的。因为硬件不像是编程,如果报错会给你反馈,然后通过搜索,以及各种debug方法,你就可以定位到出错的位置。但是硬件就很大不同,比如芯片间通信出现问题,可能是因为芯片的虚焊,或者也可能是芯片因为短路烧毁。但是,如果经验较为充足,你就可以有一套的bebug思路,从最有可能的问题开始排查,一一排除错误。这当然可以自己摸索,不过,我觉得可能更有效的方法是有老师领路,这样真的可以走很多弯路。不过,自己钻研也是不错的,但会比较花时间,各有利弊吧。
如Drone-Mercury 从零开始的四轴无人机制作(一)里面所说的,这个项目是基于STM32C8T6的。由于对硬件方面没有太多经验,所以硬件的原理图主要参考了以下的材料
- 《四轴飞行器DIY》
- 野火霸道开发板v2原理图
PCB部分网上有很多教程,可以很快的入门。整体的硬件设计在Altium Designer 21中完成的,如果想查看设计图的话需要注意版本问题。
2.1 原理图
下图展示了整体的原理图部分,主控芯片采用了STM32C8T6,采用了16MHz的外源晶振。主要分成了以下的几个部分,
- STM32主控电路,
- 电机驱动电路,
- NRF24L01接口电路,
- MPU6050模块电路,
- 电源模块电路,
- 指示灯驱动电路,
- 电池, UART插针
2.1.1 STM32主控电路
STM32C8T6主控电路主要是包括了一些驱动STM32C8T6的模块,包括供电以及16MHz的外源晶振。晶振也可以采用常用的8MHz。
除去一些驱动模块,这里还有一个LED指示模块连接在GPIOB 3上,我们可以通过这个LED现实一些状态。由
R
4
,
R
5
,
C
3
R4, R5, C3
R4,R5,C3组成的电源电压检测模块,使用ADC来检测电源电压。以及Debug接口SWD,这里采用四线SWD的方式与下载器连接,其中四个口分别是
V
C
C
,
G
N
D
,
T
M
S
,
T
C
K
VCC, GND, TMS, TCK
VCC,GND,TMS,TCK。使用四根线连接到下载器的SWD端口就可以使用下载器下载程序了。
关于下载器,一般只要是支持Cotex-M3的下载器是都可以的。
2.1.2 电机驱动电路
以上是电机驱动电路,肯定是由四个相同的模块组成的。下图为采用SOT23封装的AO3402, 其数据表见此。
我们使用定时器来输出PWM信号由此控制MOSFET AO3402的开闭,因而可以控制电机的输出。 D 1 − D 4 D1-D4 D1−D4用于保护MOSFET,防止电机产生的电流损坏AO3402。 R 20 − R 23 R20-R23 R20−R23是下拉电阻,用于释放点AO3402自身电容上的电压,以便快速响应PWM的控制。
2.1.3 NRF24L01接口电路
NRF24L01是一个8pin的排针座,画PCB的时候注意方向。下图是PCB中的NRF24L01插槽。
我在第一版PCB中弄错了方向,这会让整个造型显得非常怪异。NRF24L01采用SPI与STM32C8T6连接,使用2.4 GHz频带通信,可以在250 kbps到2 Mbps的波特率下工作。如果在开放空间中使用且波特率较低,则其范围可达100米。不加功放大概在7-10m左右。
该模块可以使用125个不同的通道,这使在一个地方拥有125个独立工作的调制解调器的网络成为可能。每个通道最多可以有6个地址,或者每个单元可以同时与最多6个其他单元通信。
在传输过程中,该模块的功耗仅为12mA左右,甚至低于单个LED。 模块的工作电压为1.9V至3.6V,但好处是其他引脚可以承受5V逻辑,因此我们可以轻松地将其连接到STM32,而无需使用任何逻辑电平转换器。
其示意图如下所示,图片来源见水印。
2.1.4 MPU6050模块电路
以上是MPU6050的电路,主要是很多的供电引脚。MPU6050采用了I2C与STM32C8T6通信。在PCB布线的时候,I2C的通信线应该尽可能的短,并尽量保证SCL与SDA的长度一致,这样为了防止电磁干扰和信号的长度差。
R 6 , R 7 R6, R7 R6,R7是上啦电路,电阻值的选取范围为 2 − 10 k Ω 2-10k\Omega 2−10kΩ。由于连接到I2C总线上的器件是漏极开路或者集电极开路,因此允许把多个I2C总线器件连接到总线上。同时,因为接了上拉电阻,所以在总线空闲时间,SDA和SCL线都是默认高电平,可以防止外部干扰造成误启动。
下图中所示为PCB视角下的MPU6050。
2.1.5 电源模块电路
电源模块主要分为两个部分,升压电路和稳压电路。
升压电路
LTC3200 是低噪声、恒定频率开关电容器电压倍增器。它们在 2.7V 至 4.5V 输入范围内产生稳定的5V输出电压,输出电流高达 100mA。在这里,LTC3200将电池电压从3.7V升到5V。
稳压电路
XC6206是一款高精度,低功耗,3引脚LDO高电压调整器芯片,并采用 CMOS工艺和激光微调技术. 在输出电流较大的情况下,输入输出压差也能很小。XC6206系列芯片内部包括一个电流限制电路,一个驱动三极管,一个高精度参考电压源和一个误差校正电路。
在这里我们将电源分成两个部分,分别为数字信号电源和模拟信号电源。其目的是,令数字脉冲信号产生的波纹不会影响到模拟信号的采集。
数字信号为高低电平,快速的高低电平转换(如各类通信接口和单片机内部运行)会使电源内部产生同步开关噪声。由于一般数字信号在1.8V以下为低电平,1.8V以上为高电平,较小的纹波对数字信号本身影响不大,而模拟信号对这样的纹波是相当敏感的。如果单片机的AD是8位的,那电源波动1/256就会对采样结果产生影响,如果AD位数更高,对电源的要求也就更高。利用电阻的感性,我们采用 0 Ω 0\Omega 0Ω电阻隔离数字地和模拟地。
2.1.6 指示灯驱动电路
以上为四个方向上的LED的驱动电路, 可以用于状态展示。所有的LED都通过引脚LED3控制。
发光二极管的正向饱和电压为1.6~2.1 V,正向工作电流为5~20 mA。为了降低功耗,可以把它的工作电流限制在2 mA左右,只是发光微弱一点。
2.1.7 电池, UART插针
这里采用了预留焊盘的方式与电池连接,因为比较简易。可以直接去购买匹配的公母线来连接到电池,非常方便。
2.2 PCB
再确认了原理图之后,就可以进行PCB的制作了。我使用的软件是Altium Designer21。关于如何制作PCB我在这里就不赘述了,因为网上提供了很多更为详细的教程。现在当前版本的PCB如下所示,所有模块都通过了测试。其中有几点需要注意的是,UART排针和SWD排针的位置有些不太好,应该放在更边缘一些的位置,甚至是移动到侧边。因为当前的设计非常影响软件的测试。但是由于在国外,不方便制作新的PCB版,所以我就凑合着用了。
PCB是采用了一个4层板的设计,只有在顶层放置元器件,2,3层作为供电层,底层作为信号层。
以上是二维模式下的视图。
以上是三维模式下的视图。
2.2.1 BOM表
以下是所有用到的元器件。这里比较需要注意的是封装,有些元器件提供很多不同的封装,在下单的时候需要注意下。钽电容的方向也要注意好,不要焊错。
2.2.2 PCB注意事项
还有些在画PCB时需要注意的地方:
-
电池电压检测:通过R4,R5电阻分压,再检测R5上电压来计算电池的电压,计算公式为 V B A T = V T / R 5 × ( R 4 + R 5 ) V_{BAT}=V_T/R_5×(R_4+R_5) VBAT=VT/R5×(R4+R5),其中 V T V_T VT为AD采样电压。
-
采用四线SWD的方式与下载器连接,其中四个口分别是 V C C , G N D , T M S , T C K VCC, GND, TMS, TCK VCC,GND,TMS,TCK。直接连接下载器就可以下载程序了。
-
BOOT0 设置为低电平输入,R2焊接 20 k Ω 20 k\Omega 20kΩ电阻,R3不焊。程序从单片机内部启动。
-
多检查一下原理图部分各个模块的接线是否正确,因为很容易发生命名错误的问题。
2.2.3 焊接
如果检查没有问题就可以把工程文件发给制作PCB的厂家了,这里我使用的是JLC。收到的板如图所示
焊上各种原器件后,就如下图所示
需要注意的是上图有个错误是关于BOOT0的电平。正确的焊接方法是,R2焊接
20
k
Ω
20 k\Omega
20kΩ电阻,R3不焊。
在焊接的时候一定要注意虚焊问题,很多时候出现错误是因为虚焊造成的。建议在焊接完成后使用万用表测试各个针脚的连接情况。
2.3 总结
以上大致就是这个项目的硬件部分,由于这个部分大约是一年前完成的,也有很多细节忘记了。之后也会根据以后项目中发现的问题去更改。接下来就是各个模块的测试部分了,在每个模块中,我想主要分成两个部分,首先是基于基础库的测试程序,为了方便与之前的内容进行衔接,然后就是基于HAL库的程序,这样可以更好地为之后的程序进行移植,和保证与时俱进。 而且目前基于HAL库的内容比较少,也算是能起到一定的借鉴之用。