STM32F4驱动MAX98357生成正弦波信号
STM32F4系列价格低廉,性能高,但是STM32F4系列很多芯片没有自带的DAC,买有DAC的系列又很贵,不划算,因此必须挂载外部DAC。STM32F4系列都有一个特制的音频接口:I2S,这个接口是特制的SPI接口,专用于传输音频信号。本次实验选择的DAC是MAX98357A,这个芯片的优点是价格很低(5元),不需要配置寄存器,自带功放。缺点是这个芯片只能播放左声道,能播放右声道的是B,想处理双声道必须买一套芯片。不过我这里只想搞单声道所以无所谓了。
STM32F4很复杂,用库函数开发很麻烦,尤其是I2S还要配合DMA使用,因此需要使用CUBEMX开发。KEIL版本需要大于V5.3 处理音频信号时,最好使用DMA,自动将内存中的数据搬运到I2S里。传统DMA存在一个问题:无法连续传输数据,因此在这里使用了双缓冲:当DMA读取A数组时,单片机写B数组;当DMA读B数组时,单片机写A数组。这样做的好处是:①数组可以有很多元素,这样就减少了中断次数,不必生成一个数据就中断一次,②交替的读写数组,降低了对时序的要求,单片机可以在处理音频后做其他工作。
代码的话我现在还在写,等到写完了我会发网盘链接。I2SDAC还在快递中,现在已经用示波器看到了STM32生成的I2S信号。 下面是我用示波器测的波形。I2S有两个时钟,一个是22k,一个是22*16k。AB数组存的是0xFFFF和0x0000,因此可以看见间断的振荡信号 Aline744 发表于 2024-3-2 08:48
下面是我用示波器测的波形。I2S有两个时钟,一个是22k,一个是22*16k。AB数组存的是0xFFFF和0x0000,因此可 ...
应该是0x5555和0x0000 I2S输出波形,之前玩过,采样率还是低了些,频率做不上去,不如用dds芯片做 撸主可以考虑一下TLV5638,这个芯片又小又好驱动,支持双路,SPI写两个寄存器就行,还可以两通道同步(写完第二路以后第一路的模拟出口才更新)。不足是只有12bit,有些高精度场合可能不够。我有几个项目用过这个芯片。 量子隧道 发表于 2024-3-2 10:09
撸主可以考虑一下TLV5638,这个芯片又小又好驱动,支持双路,SPI写两个寄存器就行,还可以两通道同步(写完 ...
谢谢推荐,我去看看 量子隧道 发表于 2024-3-2 10:09
撸主可以考虑一下TLV5638,这个芯片又小又好驱动,支持双路,SPI写两个寄存器就行,还可以两通道同步(写完 ...
这个芯片还是不太合适,首先是贵,然后就是没有功放,我这个要驱动扬声器的 iffi123 发表于 2024-3-2 09:27
I2S输出波形,之前玩过,采样率还是低了些,频率做不上去,不如用dds芯片做
I2S方便做音频,DDS处理音频很不灵活 bis 发表于 2024-3-2 18:41
用CubeMX尽量选LL库,那个HAL库写的跟屎一样。
我坚持直接寄存器操作,反正自己的程序,不需要什么移植 MAX98357到货了 iffi123 发表于 2024-3-2 09:27
I2S输出波形,之前玩过,采样率还是低了些,频率做不上去,不如用dds芯片做
换个esp32s来玩,它的i2s甚至能输出vga/s-video/am radio信号,亲测有效;P
vga的效果还不错,s-video黑白也还行,am radio就有点力不从心了,只能将就听出说话,杂音很大 这个芯片输出的是高频信号,使用0.15u电容并联10k电阻进行滤波,得到波形,看起来音质不是很好,不过能响就行
页:
[1]
2