收到的ST这个骨振动传感器带了一个FPC适配板,免了制作PCB封装的问题,方便接线测试。
不过,因为电压支持只有 1.8V, 于是蝴蝶粉手头的 Nucleo 板子都不能直接用。要不得自己画一块带 3.3V <--> 1.8V 电平转换的板子,要不就想办法把MCU电压用成1.8V 以直接连接。
因为传感器的信号输出是 TDM 接口,STM32 的具备 SAI (Serial Audio Interface) 的型号都可以直接支持(真的不少了,SAI也算主流配置该有的)。我实验音频采集用的是 STM32L476, 借用了一块自己设计的带USB的评估板来接收TDM信号,因为没有引出空余的I/O口,只好飞线连接。
传感器一共需要 MCLK, BCLK, WCLK 三个时钟信号,其中 MCLK 是主时钟,内部ADC转换必须用这个时钟,它决定了采样频率。在 MCLK=12.288MHz 时,对应输出 24kHz 或 16kHz, 8kHz 采样频率。假如 MCLK 变了,采样频率也会随之变化。BCLK, WCLK 是 TDM 接口传输数据需要的,WCLK 输出采样频率,BCLK 决定码流的速率。注意,WCLK 和 BCLK 必须与 MCLK 同步,必须是 MCLK 的整数分频,且 BCLK 也必须是 WCLK 整数倍频。按照手册表格中来,WCLK 就只能取 8kHz/16kHz/24kHz 三种了,对应 MCLK/WCLK 比 1536x, 768x 和 512x
STM32 SAI 的引脚在 TDM 模式与传感器连接关系就是:
SAI_FS ---- WCLK
SAI_SCK ---- BCLK
SAI_SD ---- SDOUT
至于 MCLK, 12.288MHz 时钟的产生有多种办法,只要保证与 SAI 接口的时钟同源就可以了,比如用 MCU 的 MCO 输出,用 SAI, SPI, Timer 等等硬件输出。
TDM是对数字音频常用的I2S接口的扩展,因为 I2S 只能传输 L/R 两个通道数据,而 TDM 支持多通道。这个传感器需要 XYZ 3个通道。按照手册中典型的 8kHz/1.024MHz 这样的 WCLK/BCLK 比例,一个采样周期可以传输 128 bits 数据,等于 8 个 slot (每个数据占16 bits)。
SDOUT 与 WCLK 波形对应是这样的:(我的示波器只有两通道,不能同时看BCLK)
这是选择在前三个slot发送数据,SDOUT相对WCLK没有延迟。SAI 输出 TDM WCLK 高电平为16个BCLK周期(一个slot长度)。
LIS25BA上电的时候是 power-down 的,TDM接口也关闭了,所以必须用 I2C 配置一下才可以用。
SAI 的 TDM 配置方法:
MCU引脚分配,我用了两个SAI模块,其中一个仅仅用来产生 MCLK (原因后面讲)
SAI1 Block A 工作在 TDM (master receive) 模式,并启用 DMA 传输数据。我的 SAI 时钟是 24.576MHz, FS频率(即WCLK频率)是 24kHz,那么要使用 SAI CR1寄存器 MCKDIV 位配置分频。
这里并没有体现出来 FS 的频率,但是手册中有一句:In the SAI, the single ratio MCLK/FS = 256 is considered. 于是,图上的 MCLK_x 该为 256x24kHz = 6.144MHz, 需要 MCKDIV 进行4分频。也正是因为 SAI 的 MCLK/FS 比例与传感器需要的不一致,不能直接用 SAI 输出的 MCLK 给传感器,所以我才单独用了 SAI2 Block B 来提供 MCLK 输出。
我只选择了 slot 0, slot 1两个通道的数据接收,对应到 USB audio 数据的左右声道,方便于录音。因为测试代码是在USB声卡的代码上改来的,DMA采集也保留了32-bit传输,实际有效数据只有低16位。
这个传感器是三轴加速度计,对重力方向也是敏感的,从测试录音的直流偏移可以体现出来。
录音的效果? 因为缺乏载具,拖着一堆飞线也很不方便,我不保证它可靠采集了“骨振动”。如果手持板子,让传感器靠在脸上,录下来的声音很微弱,浑浊。后来,我干脆用手指把传感器按在皮肤上,录了下面这一段,粗略能听出来是在说话了。附件中 mp3 是用软件处理做过加了增益的。
见识了,感谢分享,这种资料还是第一次接触
学习了
引用: 天眼123 发表于 2019-9-24 11:38 我也是靠在脸上声音很浑浊,很微弱,但是当我直接用手将他按在皮肤上时有杂音,也没有其他干扰,不知道楼主 ...
是的,我也发现了杂音,怀疑是电引起的。