这篇文章放很久了,是这个采集系统的硬件部分。简单来说,硬件部分就是一个STM32H7,上面的SPI用来控制ADC的配置和初始化,至于ADC的转换数据通过SAI外设读取,在内部有俩种编码方式,二进制流和OpenVIBE的编码方式。ADC转换的时候需要一个准确的基准,使用了一个ADI的REF。然后为了提高系统的信噪比,在电源输入路径上面使用了变压器驱动,避免电源轨道上面的耦合,在输出数据的时候,可以使用UART以及USB外设(USB-CDC)。
上面的陀螺仪是有一个结论,这个运动伪像可以被接收到的,可以被在信号里面减掉。
电源除了MicroUSB输入以及也可以在独立的引脚输入
右边就是串口上面的隔离,这里也有一个SPI的输出,都是隔离的
多通道的隔离器,这个是串口
这个是TI的,为SPI做隔离器
USB隔离器
就是这样
我这里想说的是,因为电源会供给所有器件,为了安全和减少一些噪音,就使用了小型的变压器。
芯片配变压器
内部的样子
参数
很明显就是原样隔离转换的。
在最终输入还加了保护的二极管
可以通过TI的
里面长这样
我们看一个X光的拍片子的样子
这个是共模电压点
上下都是一对儿差分
SWD就可以
有一个数字地
链接SWD和电源,所以在烧录的时候就要连接
编译无错误
使用V2就可以了
调试
每一个数组里面都有内容
一个线程
经常有人问,这个东西是真同步吗?所以要讨论延时,就是来自于体系架构的延时性:
这个是和总线的连接延时
APB2-120MHz
还有一个SAI居然在APB4上面,速度最大可以跑到100MHz
AD7771使用ADI的一个demo,就是SAI外设读取数据,在精密转换这里
IIO项目
精密转换固件
SAI的外设
虚拟的串口
链接图
uint8_t datas[uint8_ad_adc_number][uint8_ad_number];
使用2维数组来储存ADC的数据:
uint8_t:这是数组元素的数据类型,表示无符号8位整数。也就是说,数组中的每个元素都可以存储一个0到255之间的数值。
datas:数组名称,用来标识这个数组。
[uint8_ad_adc_number][uint8_ad_number]:这是数组的维度,表示这是一个二维数组。
二维数组的每一行: 代表一个ADC通道采集到的数据。
二维数组的每一列: 代表一次采样中,所有ADC通道采集到的一个数据点。
uint8_t datas[4][10];
这个数组中有4行,10列。第一行存储第一个ADC通道的10个采样数据,第二行存储第二个ADC通道的10个采样数据。
// 访问第一个ADC通道的第二个采样数据
uint8_t value = datas[0][1];
通过索引来访问数组中的元素。
这个就是SAI数据的接收
使用这样的代码获取所有的数据块
这个是源码
32字节长的数据
在源码里面,一旦这个标志位出现,就开始捕获。
代码这段是切换数据流的方式
OpenVIBE的打包方式,有头有尾,里面包装ADC,和陀螺仪
然后使用USB的口输出
我们也可以打开这个开关,把数据装到SD卡里面的