完成程序设计前半部分

This commit is contained in:
2024-04-06 17:46:12 +08:00
parent ef66265255
commit fa984a3610
4 changed files with 88 additions and 1 deletions

View File

@@ -339,18 +339,105 @@ image::doc_attachments/2024-03-26T08-58-51-017Z.png[XC6206 典型应用电路]
本设计中 PCB 工艺选择 FR4 板材,层厚 1.6mm,介电常数典型值为 4.25。通过调整线宽匹配阻抗,根据参考设计,选取传输线宽 28.1mil,与 GND 间距 6mil。传输线布置中要求走线转弯半径大于三倍线宽。
布局完成后的顶层视图如图所示。
image::doc_attachments/2024-04-06T06-05-09-730Z.png[PCB 顶层视图]
布局完成后的底层视图如图所示。
image::doc_attachments/2024-04-06T06-05-45-990Z.png[PCB 底层视图]
实际制作完成后的实验样机如图所示。
// 待插入图片
== 基于 MEMS 和 CNN 的边缘计算振动监测节点的程序开发
为了实现本设计的设计需求,程序开发主要分为三个部分。分别是基于 GD/STM32F405 的主控程序、基于 CH582F 的蓝牙主控程序、以及简单的上位机数据采集和标注程序。三部分的功能和关系如下图所示。
image::doc_attachments/2024-04-06T03-32-14-767Z.png[]
由于采用了卷积神经网络 (CNN) 作为工况识别的方式,考虑到控制板运算性能有限,不适合进行模型训练。所以部署该设备需要分两部分完成,即先采集传感器数据并送至上位机处理,在上位机中将数据格式化,并按照对应工况进行数据标注。标注完成后,使用基于 Keras 框架的 卷积神经网络 (CNN) 进行训练,生成权重数据。由于生成的权重数据体积较大,并且主控设备没有直接对应的推理框架,所以需要使用 Cube-AI 工具进行模型的压缩和转换,以部署到边缘计算主控上。对于边缘计算主控,无论是数据采集阶段,还是推理运行阶段,都需要有对应传感器的设备层驱动、数据预处理过程以及通信模块。当处于推理运行阶段时,下位机主控采集并预处理的数据除了在调试模式中继续发往上位机,还会裁切成对应大小和维度的片段送入 CNN 推理模块中,并获得不同工况的置信度输出。主控将数据暂存并按照格式打包,发送给蓝牙主控和供 Modbus 模块调用,以便实现数据的有线/无线被动查询、无线主动上报功能。对于蓝牙主控,需要实现能解析从主控发送的数据包的板内通信模块,以及蓝牙协议栈。对于数据采集上位机,需要实现和下位机串口通、数据解包和格式化、数据加标签等功能。
=== 基于 MEMS 和 CNN 的边缘计算振动监测节点主控程序开发
==== 程序整体架构
==== 振动信号采集子程序
根据本设计的功能需求,主控主要任务可分解为信号采集层、基于 FFT 的数据预处理层、基于 Cube-AI 的推理层,以及向网关上报数据的数据交换层。
// 补个分层图
==== 信号采集子程序
===== LIS3DH 加速度传感器驱动层设计
LIS3DH 加速度传感器具有 SPI 和 I2C 接口,由于需求的采集频率较高,对于数据传输速率需求也较高,所以选择使用 SPI 作为和传感器的通信方式。
接口设计上,由于使用抽象程度较高的 hal 库,所以可以直接使用 SPI 外设的初始化和字节发送以及读取接口无需自行实现。根据本设计需求LIS3DH 传感器驱动层主要需实现设备初始化、参数配置、加速度数据读取、数据转换等接口。
当 LIS3DH 上电后,需要对其进行初始化和参数配置操作。首先发送指令读取 `whoamI` 寄存器,该寄存器是器件 ID 寄存器,该寄存器值恒为 0x33。通过读取该寄存器值能够判断是否存在总线或者器件故障避免继续后续操作产生误动作。当确认正确后将对应场景所需要的配置写入本设计中对控制寄存器写操作设置开启数据更新。设置数据更新速率为 1kHZ加速度传感器量程为 stem:[\pm4g],并设置输出分辨率为 12bit。
设备集成 32 级 16 位先入先出缓冲区 (fifo),可以在将采集到的数据先存入,等待主控读取。也可以直接查询读取,通过查询 `STATUS_REG` 寄存器,当存在新数据可用或者溢出事件时,读取数据数据寄存器值即可。本设计中由于在数据采集中没有其他阻塞操作,所以采用在主循环中直接查询的方式拉取数据。
当获取到数据后,需要根据设置的分辨率和量程将获取的数据转换成以 `mg` 为单位的加速度值。
===== AHT20 温湿度传感器驱动层设计
AHT20 温湿度传感器具有 I2C 接口,由于温湿度仅作为辅助判断工况的数据,且一般变化率不大,所以不用考虑较高的采样速率。
接口设计上,同样采用 hal 库,所以可直接使用 I2C 外设的初始化和字节发送/读取接口无需自行实现。根据本设计需求AHT20 传感器驱动层主要需实现设备初始化、参数配置、温湿度数据读取、数据转换等接口。
当 AHT20 设备上电后,需等待 100ms然后发送对应状态字并确认回报数据是否有效。
AHT20 没有自动测量的配置,需要主控发送指令触发测量过程。主控发送对应的命令,并等待 80ms。主控可尝试发送读指令至从机读取的第一个字节为状态位当状态位表示就绪时可以继续读取六个字节即温度和湿度的测量值。如果需要校验可以再接受完数据段后发送一个 ACK 应答,从机会继续发送一个字节的校验位 (CRC-8)。
当接收完数据后,将数据转换成以 ℃ 和 %RH 为单位的数值,便于理解。
==== 基于 FFT 的数据预处理
不同的工况可能存在不同的振动特性。对于振动筛等设备,如果为了检测偏载或者重载,可能由于激振源工作状态比较恒定,其表现出来的特征主要是加速度幅值上的变化,可能时域上的特征更适合作为判断条件。而对于某些在不同状况下可能出现不同频率分量或者卓越频率的漂移的工况,采用频域特征进行判断则更为合适。
本设计中采用快速傅里叶变换的方式,将时域数据变换到频域上。
离散傅里叶变换 (DFT) 的运算公式为:
[stem]
++++
X[k]=\sum_{n=0}^{N-1}x[n]W_{N}^{nk}, 0 \leq k \leq N-1
++++
其中,
[stem]
++++
W_{N}^{nk} = e^{-j\frac{2{\pi}k}{N}n}
++++
将离散傅里叶变换公式拆分成奇偶项,则前 N/2 个点可以表示为:
[stem]
++++
X[k] = \sum_{r=0}^{\frac{N}{2}-1}X[2r]W_{N}^{2rk}+\sum_{r=0}^{\frac{N}{2}-1}X[2r+1]W_{N}{(2r+1)k}
=\sum_{r=0}^{\frac{N}{2}-1}X[2r]W_{\frac{N}{2}}^{rk}+W_{N}^{k}\sum_{r=0}^{\frac{N}{2}-1}X[2r+1]W_{\frac{N}{2}}^{rk}
=A[k]+W_{N}^{k}B[k],k=0,1,\ldots,\frac{N}{2}-1
++++
同理,后 N/2 个点可以表示为:
[stem]
++++
X[k+N/2]=A[k]-W_{N}^{k}B[k],k=0,1,\ldots,\frac{N}{2}-1
++++
由此可知,后 N/2 个点的值完全可以通过计算前 N/2 个点的中间过程值确定,对 A[K] 与 B[K] 继续进行奇偶分解,直至变成两个点的 DFT这样就可以避免很多的重复计算实现了快速离散傅里叶变换 (FFT) 的过程。
//Reference: 基于 FPGA 的多普勒信号快速傅里叶变换系统研究
由于采用的主控带有数字信号处理模块 (DSP),所以程序中不需要自行实现。采集到足够点数的时域数据后传入处理函数即可。
==== 基于 Keras 的 CNN 训练过程
==== 基于 Cube-AI 的推理模型转化和部署
==== 基于 Modbus 总序协议的程序设计