一.项目介绍:
这是一块音频前置放大电路,采用了麦克风作为信号输入,用一片低噪声四运放对音频信号进行放大滤波,音频信号的输出默认为功放电路,在接入音频头的时候自动切换到3.5mm音频座输出。左上角51单片机的作用是驱动AD7920将放大后的音频信号转为数字信号,并发送到串口工具Vofa+显示。受单片机和串口工具的限制连续采集模式最高采样率只能达到15KHz,缓存模式采样率可以达到96KHz,但会丢失一部分波形。
二.设计思路:
从ADALP2000套件中选取麦克风作为信号输入源,电路图如下:
图1:麦克风驱动电路
其功能是拾取声音转换为电信号并进行音频放大。麦克风内部包含有一个场效应管作放大用,可以将震动引起的微弱电流放大,灵敏度较高。图1中以V1代替,V2为5V供电电源与电阻R1,R2,R4,R5共同给麦克风提供合适的偏置电压。C1,C22,C23可以滤除电路中的共模差模干扰,信号从C2,C3隔直后给到后续电路。
图2:一级放大
麦克风产生的正负差分信号给到第一级放大电路;放大倍数由R18/R3决定。R18可以改成50K电位器,调节电位器可以调节放大倍数。R19,R20可以为电路提供2.5V的电压偏置,以达到最大测量动态范围,这两个电阻不宜过大,不然会产生噪声,为了降低电阻产生的噪声加入C13滤波。下半部分电路与以上同理。
图3:第二级是差分放大电路
第二级放大电路的作用是将前面的差分信号重新合并为单端信号, 放大倍数由R11,R24,R9,R25决定。采用以上一二级电路结构的目的是为了降低信号噪声,按实际搭建电路测试情况看这种接法确实比单端放大噪声小很多。
图4:滤波电路
放大后的信号经过C5,R13,R14,C7滤波,滤波频率按照高通100Hz,低通16KHz设计。这里的U2为跟随器不做放大,R15,R16提供2.5V偏置电压。
图5:输出电路
经过放大的信号经过R33,C21滤波后给到AD7920输入端,此处RC滤波器做抗混叠滤波器用,频率设计16KHz,AD7920的采样率为96K,应付16KHz以内的信号足够了,也不会产生混叠。信号切换电路:采用了一个P型,一个N型MOS设计为互斥输出。由于官方提供的MOS管ZVP2210 ,ZVN3310的导通电压较高,增加C14,R10,R12偏置电路,给Pmos提供一个合适的电压范围。电路中R30,R26可以换成电位器,用来调节输出信号幅值。开关信号由V4代替,实际电路中开关信号脚接到3.5mm音频接口的4号引脚,该引脚在接入音频头的时候会被拉到地。
图6:输出电路
功放电路如图6,增益由R2,R1决定,W1可以调节声音大小。
三.仿真:
图7:仿真结果
如图7,电路增益51dB,在100Hz和16KHz的衰减为3dB满足要求带通滤波要求。切换电路也可以正常工作。
四.波形显示:
波形显示部分采用EFM8单片机驱动AD7920采集放大后的音频信号,再通过串口发送到PC端VOFA+显示方案。为达到更高的采样率,做了两处优化:1.将SPI和UART通讯时序进行穿插,在UART发送间隙启动SPI时序;2. int型数据改为数组形式,节约数据处理时间。关键代码如下:
{
ad7920_cs = 0; //
SPI0DAT = 0x00; ////
putchar(arr[1]);
while (!SPI0CN0_SPIF); //
SPI0CN0_SPIF = 0; //
temp = 0; //
temp = SPI0DAT; //
main_count[(eo+1)%2] += temp * 256; //
putchar(arr[2]);
SPI0DAT = 0x00; ////
putchar(arr[3]);
while (!SPI0CN0_SPIF); //
SPI0CN0_SPIF = 0; //
ad7920_cs = 1; //
putchar(0x0A);
delay_us(1);
temp = 0; //
temp = SPI0DAT; //
main_count[(eo+1)%2] += temp; //
main_count[(eo+1)%2] -= 1500; //
//arr[0]=main_count[eo%2]/1000+0x30;
main_count[eo%2] = main_count[eo%2]%1000;
//putchar(arr[0]);
arr[1]=main_count[eo%2]/100+0x30;
main_count[eo%2] = main_count[eo%2]%100;
arr[2]=main_count[eo%2]/10+0x30;
main_count[eo%2] = main_count[eo%2]%10;
arr[3] = main_count[eo%2]%10+0x30;
eo++;
}
五.遇到的问题:
遇到的问题有两方面:噪声,采样率;
噪声问题:一开始采用单端放大方案,面包板搭建电路。但是在接上喇叭后发现有较大噪声,拔掉麦克风后噪声略有减小,说明电源与放大电路都存在噪声;
然后转为洞洞板焊接,电源噪声得到改善。但是接上麦克风噪声依旧,更换电路运放发现精密运放效果优于通用型运放,噪声进一步改善。为了追求更高的信噪比,将信号源改为差分接法,排除零点漂移影响。
采样率问题:
51单片机性能限制,SPI跑满4M,UART最高2M,且只能单线程工作。多次调整通讯时序,数据处理方式,实时采样频率也只能做到15KHz;这意味着3KHz-16KHz的信号会出现失真和混叠的问题;
图8:混叠
连续采样模式采样频率为15KHz,由定理可知被测频率超过7.5KHz的时候出现混叠失真。如图8:音频信号12KHz的波形和3.3KHz的波形,频率基本一致符出现混叠失真。但该频率仍为有效信号,采用滤波电路只会将有效信号一并过滤,所以不可取。唯一的解决办法是提高采样频率。
为解决该问题,引入缓存模式,即采集一段时间数据(51单片机内存有限,此处只能存储40个数据),然后一次输出。连续模式用于100Hz-3KHz的信号,缓存模式用于3KHz--16KHz的信号。
图9:提高采样率
如图9;采样率提高到96KHz后可以将3.3KHz和12KHz的信号明显区分开,但由于单片机缓存、上位机打印速率限制波形会有丢失问题,看起来比较奇怪。
缓存模式代码如下:
else if(count_flag==1)
{
if(count<=arr_count)
{
ad7920_cs = 0;
main_count[count] = 0;
SPI0DAT = 0x00;
temp = 0;
while (!SPI0CN0_SPIF)
;
SPI0CN0_SPIF = 0;
temp = SPI0DAT;
main_count[count] += temp * 256;
SPI0DAT = 0x00;
temp = 0;
while (!SPI0CN0_SPIF)
;
SPI0CN0_SPIF = 0;
temp = SPI0DAT;
main_count[count] += temp;
ad7920_cs = 1;
count++;
ad7920_cs = 1;ad7920_cs = 1;ad7920_cs = 1;ad7920_cs = 1;ad7920_cs = 1;
}
else
{
count_flag=2;
count=0;
}
}
else if(count_flag==2)
{
if(count<arr_count)
{
printf ("%d\n", main_count[count]-1500);
count++;
}
else{count=0;count_flag=1;}
}
六.优化方向:
1.在测试过程中发现不同的喇叭频率特性不同,ADALP2000配件中的喇叭在高频和人声部分表现都不错。但在高频时候容易出现破音,所以还需要根据喇叭特性对前面电路参数进行微调。
2.采样率:现有系统的瓶颈在串口上位机软件,最高只能跑到2MHz,且在发完一次数据后需要延时几十uS,如果去掉延时,误码率会上升很多。后续可增加一块显示屏来显示波形。
3.输入信号范围为0.1mV-1V,现有电路可以通过调节反馈电阻的大小改变放大倍数,使得信号不会出现饱和失真。后续可以增加MOS开关,单片机通过读取AD值来判断放大倍数,做到自动切换量程。