DIY简易音频信号源
玩模拟电路的都需要个音频信号源吧?(只晚射频电路的除外,避免抬杠
) 就算没有专门的信号源,电脑声卡、MP3甚至手机都可以拿来顶替一下。我也经常是用连在电脑上的DAC来获得音频信号的,我也DIY了模拟的低失真信号源,不过那只有单个频点。好,先看我今天做出来的信号源效果图:
呃,这是什么鬼玩意儿? 信号源?
别着急,先看这个:
妥妥的正弦波,这次对了吧。没错,这就是我的信号源出来的。
下面这个呢,看起来好象波形失真了……
其实不是,这只是个巧合,示波器现在是当X-Y显示器用的,再来几个就明白了:
如果X,Y输入同频正弦,相位差90度,示波器X,Y增益相当的话,画出来就是一个圆了。
好,效果图看完了,信号源长啥样?
这东西其实并不大,因为用了单片机,而且可以3.2V电池直供电使用。输出两路音频正弦信号,频率1Hz~23999Hz, 1Hz步进可调。频率很准的,因为是晶振决定。
MCU就是ST的Cortex-m0: STM32F051
不过我这次把MCU给“超频”用了,晶振是49.152MHz, 超过了规格最大48MHz一点。原因是为了采样频率在48000Hz上。那么我用什么来产生模拟信号呢?单片机自带了DAC,这个可以用,但是精度差了点。我另外用了一片音频的Sigma-Delta DAC: Cirrus Logic的CS4344:
就是直插电容旁边的小芯片了,音频专用哦,用在信号源上正合适。这个DAC也很便宜,最高支持192kHz的采样频率,不过我这里只用到48kHz. 通过I2S接口把PCM编码送过去,就出来模拟信号了,因为STM32F051已经有I2S接口了,所以用起来很方便。
线路挺简单的,我多引了些I/O到插针位上,方便以后做其它应用。CS4344的I2S信号MCLK, BCK, LRCK, DATA连到MCU上,作为slave设备。CS4344的模拟输出就按照手册上的简单接法输出了,没有加滤波电路,实际上高频噪声影响还是有的。PCB版图:我惯用的Eagle软件出图。
原来想用一块1602 LCD做显示,几个按钮做控制。后来觉得1602模块本身体积更大,弄出来又不小巧了,一时也没选定盒子。于是我就决定用串口控制吧,设置好了以后可以拔下来,整个更小巧。所以软件上就是更新波形数据,和接收串口命令的干活…… 一个在DMA的中断里面,一个在串口接收中断里面。
正弦函数我并没有在程序中计算,而是存了一个表,用查表法。一方面是ROM刚好够用,另一方面是对Cortex-M0的浮点库不熟悉就没有此时尝试。采样频率是48000Hz, 如果要输出1Hz的信号,那么一个周期需要48000个样本,根据对称性,只需要存储1/4的正弦就够了。一个样本用24-bit足够,16-bit也差不多(截尾会有一些谐波),我任性地直接用了32-bit整型。计算1Hz的整数倍就很简单,相当于查表时每次跳N个就行了。
最后再强调一下使用CS4344等Sigma-Delta DAC相对于MCU片上DAC的优点:一个是量化精度比较高,谐波失真也低不少。二是独立于MCU,减少了干扰。三是降低了数据处理量,因为DAC带有8倍的上采样,硬件给你完成了插值。(不然,在48k采样率下,直接用零阶保持出来一个20k的信号是什么样子?)