前一阵子动手做了一个超声波阵列定向声波发射器,算是我玩电子DIY以来最烧脑也最有成就感的一件事。外形上它只是一块亚克力板,上面密密码码焊了十几个银色的圆形探头,可通电之后你和它正常说话的距离,站在正前方两三米能听清声音,往旁边挪两步,声场立刻像被捏扁的小气球一样瘪下去。这种“声音手电筒”一样的效果,第一次演示时把身边几个朋友全看愣了。
其实这个项目里没有常规的扬声器纸盆,发声靠的就是那排工作在40kHz的压电陶瓷换能器,核心机制是让载波信息通过空气本身的非线性效应,在声场里被“解调”成可听声,也就是常说的小型参量阵扬声器。开门见山说结论:如果你想找个项目把单片机、模拟调制、容性负载功率放大、阵列波束合成这些硬核知识点一次打通,今天这个选题再合适不过。
我会按实际搭建的顺序写:为什么声音能被超声“搬运”到空气里、每一级硬件怎么选、阵列布阵怎么算、调试翻车记录、以及哪些坑值得后来人避开。整个流程两三个周末能跑完,下面直接开始。
1. 定向声波的核心原理:空气不是线性的
1.1 先理解“差频”
很多人第一次听说定向声波时都问同一个问题:超声波人耳根本听不见,那声音到底从哪来?答案藏在空气的“非线性”里。我们平时默认空气对声音是线性介质,这在大众日常里没有任何问题;但一旦声压够大,空气的体积压缩和恢复就不再是完全线性的“胡克关系”了,传播过程中会产生新的频率分量。
最直观的例子是差频:同时向空间发射40kHz和41kHz两个超声信号,由于空气非线性,声场里会出现两者之差1kHz的声波,正好落在人耳听觉范围内。所以你在阵列前面听到的1kHz纯音,不是任何一个换能器本身发出来的,而是空气自己“混频”的结果,有点像模拟电路里两个正弦过非线性器件产生交调分量。
实际做音频传输时很少直接做双频正弦,因为要表达的语音频率是不断变化的,不能靠单纯两个固定频率来承载。工程上更常用另一种方式:用可听声信号去做一个40kHz载波的幅度调制,发射出去的超声包络就是音频本身,空气非线性在自解调时把包络还原成可听声。这个思路还有个名字叫参量阵列,50多年前提出,后来用在定向音箱、声学研究甚至非接触式声场控制上。
1.2 调制深度和失真的取舍
明白幅度调制后,下一个绕不开的问题是失真。如果你拿一个普通AM信号直接驱动换能器,解调出来的可听声会带有明显的谐波失真,说话声音发劈、发闷,听着像收音机过载。原因是空气非线性解调出来的“包络平方项”本质上会把原信号做一次非线性变换,不是简简单单把包络剪下来就完事。
想改善音质,公认有效的做法是预失真,最常见的是平方根预处理:在调制前对音频信号做一次开方变换,让空气解调时把这个非线性抵消掉一部分。很多基于微控制器的DIY项目就把这一步放在数字域里做,省掉大量模拟补偿电路。我自己入门时没有一上来就加,因为链路还没调通,加了反而分不清问题出在调制还是预失真,建议你第一次做也先把预失真关掉,确保“载波→AM→自解调→可听声”链路稳定再慢慢优化。
调制深度方面也要克制。普通AM下,调制深度太高会将载波包络压得过低,导致音频削波失真;太低又会让声音沉在超声载波底下听不清楚。我实测下来,先用调制指数0.3到0.5起步比较稳,链路稳定后再慢慢往上推,直到听到有明显破音就回退几个百分点。
1.3 为什么偏偏选40kHz载波
选载波频率不是一个可以随便拍脑袋的决定。空气对超声波的吸收随频率上升得非常快,20kHz时衰减还勉强能接受,到60kHz以上,同样距离的衰减会急剧增大,等你走到几米外,声场能量早就散没了。40kHz相对正好平衡了声压输出、元器件成本和指向性,而且市面上有大量成熟的40kHz压电换能器,随便搜都有型号可买,做起来门槛低。
同时40kHz的波长约为8.5mm,这个数值直接决定了换能器阵列设计的物理尺寸,我后面在阵列章节会反复用到它。只要记住一个结论:DIY定向声波,除非你有特殊场景需求,否则第一选择就是40kHz,没必要跟100kHz较劲。
2. 硬件每一环怎么选:换能器、调制器、功放、匹配
2.1 换能器选型与阵列基础
整个项目的核心元件是40kHz压电陶瓷换能器。我用的规格是直径约10mm的发射型压电片,典型参数:谐振频率40kHz,静态电容大约2nF左右,谐振阻抗几百欧姆,价格也不贵。这里非常不建议用接收型代替发射型,接收型灵敏度高但能承受的驱动功率和声压输出都要弱一大截,我测试时拿接收型阵列勉强出音,效果和耳语差不多,换成发射型后整个局面立刻大变。
压电换能器本质上是个容性负载,低频下几乎开路,谐振点附近阻抗才会降下来。多只并联后,总电容累加,等效电容可能到20到40nF。如果你的功放级设计不考虑这一点,很容易出现电流全部变成无功电流、功率管热得烫手但辐射声压却上不去的情况。
换能器的引线焊接要特别注意,压电陶瓷片本身很脆,烙铁温度过高、用力过猛,轻则性能劣化,重则直接裂片报废。我的习惯是把烙铁温度调到350℃左右,快速点焊,不长时间加热。还有一点:所有探头焊接到线缆时极性要一致,这个细节虽然简单,但焊接过程中一旦有两个反了,整个阵列的声场会互相抵消一部分,指向性和增益立刻掉下来。
2.2 信号产生与调制:两条路线
信号源和调制方案决定了整个系统的复杂度。先说我最早做的模拟路线:用有源晶振或单片机IO产生40kHz载波,再配合模拟乘法器(比如MC1496)把音频和载波相乘,得到双边带信号。这个方案音质上限高,被很多老工程师喜欢,但MC1496的外围电路极其啰嗦,偏置电阻、平衡调节、供电电压要求多,对新手来说非常劝退。我试过这个方案小半个月,最后因为调平衡太痛苦,整套换掉了。
第二条路线现代且高效:把超声驱动本身当成一个D类放大器来做。单片机产生40kHz PWM作为载波,每个PWM周期根据当前音频采样值动态调整占空比,相当于把音频包络编码进脉冲宽度。输出经过压电换能器的谐振带通特性,自然形成幅度调制的超声正弦。硬件上不需要模拟乘法器,只需要一个能输出高稳定PWM的微控制器,比如STM32,再加一对半桥驱动即可。
这条路线还顺带解决了效率问题。因为MOSFET工作在开关状态,不是线性放大,大部分能量都被换能器和空气非线性带走,功放级发热明显低于线性功放。我做第二版时全程用这个方法,调试难度和稳定性都让人满意。下面给一段核心思想的示意代码,寄存器初始化省略,主要看占空比更新逻辑:
// STM32 PWM频率40kHz:PSC=0, ARR=1799 (72MHz / 1800 = 40000Hz) while (1) { uint16_t audio = read_adc(0); // 读取音频采样值 uint16_t duty = 900 + (audio * depth / 4095); if (duty > 1400) duty = 1400; // 限制调制范围 if (duty < 400) duty = 400; TIM1->CCR1 = duty; // 更新占空比 }无音频时占空比固定为50%(CCR=900),相当于载波满幅输出,有音频时在50%附近跟随包络摆动,把调制深度控制在约35%到78%占空比之间,等效于标准AM调制。预失真如果要做,也可以在audio值送入前做开方计算,后续扩展很灵活。
2.3 功率级:为什么单端驱动不行
换能器阵列既然是容性负载,那功率级的选择就不是“能响就行”。单端驱动是最容易踩的坑:把阵列一端接在MOSFET漏极,另一端接地,理论上也能工作,但实际声压输出很低,因为整个阵列一端被固定在地电位,驱动电压摆幅只有电源电压的一半。
更合理的是H桥差分驱动。两路PWM互补驱动半桥,换能器两端电压一正一反,同一电源电压下,压电片两端峰值电压翻倍,相当于有效驱动电压翻倍。实测下来,12V供电的H桥方案,声压比单端驱动提高很明显,而且对电源利用率也高。
具体实现我用的是半桥栅极驱动芯片加一对N沟道MOSFET,比如IR2104加IRF540N这类常见组合。H桥的关键是死区控制:上下管切换时必须有一小段时间同时关断,防止直通短路。带死区控制的专用驱动芯片会自动处理,比自己在软件里扣边沿要可靠得多。
2.4 匹配网络:电感抵消容抗
换能器阵列容性负载带来的问题是无功电流过大。假设阵列总电容大约30nF,40kHz下容抗就是大概130Ω。如果不做任何匹配,一大半驱动电流是在电容和MOSFET之间来回充电放电阻性损耗,真正变成超声辐射的有效功率非常少。
常规解法是在阵列两端并联一个谐振电感,让电感和静态电容在40kHz附近谐振。谐振电感值可以这么估算:先把总电容代入容抗公式算出容抗,再让感抗和它相等,公式是L = 1/((2πf)²C),电容30nF对应电感大约0.5mH。实际绕制时可以买成品电感或磁环绕线,然后用示波器观察电压波形,微调圈数使谐振点落在40kHz附近。
这一步是很多DIY项目容易忽略的。没加匹配之前,我用手摸MOSFET散热片,几乎烫得不敢碰;加上匹配电感后发热量立刻降到正常水平,声压还大了一圈,这笔账非常划算。
2.5 电源和散热的硬指标
不要小看这个项目的耗电。16个换能器并联,H桥驱动在40kHz下持续开关,峰值电流可以达到几安培。我第一版用普通USB电源供电,开机没多久就直接过流保护,后来换成12V 3A的开关电源才稳住。
功率管的散热也要提前规划。IRF540N这类TO-220封装的MOSFET,不装散热片长时间跑会烫到没办法摸,好一点的方案是两块小铝散热器加导热硅脂。即便有匹配电感,开关损耗依然存在,测试时多留一分余量总没坏处。
3. 换能器阵列设计:指向性其实是布阵布出来的
3.1 阵元间距为什么不能随便排
单只压电换能器本身已经有一定指向性,但还远没那么强。真正把一个普通的小喇叭变成“声音手电筒”,靠的是多只换能器组成阵列后,各单元声波在远场相干叠加形成的波束。阵列设计的第一个关键参数就是阵元间距。
波长λ在40kHz约为8.5mm。教科书会告诉你,阵元间距最好不要大于半波长(约4.3mm),否则波束旁瓣和栅瓣会很强,出现“旁边也能出声”的串扰。但压电片直径就有10mm,半波长间距根本摆不下。实际怎么办?我的经验是让所有探头按规则网格紧密排列,中心距尽量一致,即使间距超过了半波长,单个探头的方向性也会把大角度栅瓣压掉不少,只保留主瓣和前几个不明显的副瓣,听感上已经非常“聚焦”了。
3.2 阵列口径和波束角的关系
另一个核心指标是波束角,它几乎完全由阵列口径决定。口径D就是阵列的总尺寸,比如4个10mm探头紧贴排成一行,中心距10mm,一行总长约40mm。那么垂直方向的波束宽度大约就是λ/D弧度,换算成度数大概是8.5/40×57.3≈12度。这是半功率波束宽度的量级,实际听感就是正面清晰、偏开十几度声音就掉下来一截。
想让波束更窄,最简单的办法是增大阵列口径。把阵列从4×4升级到8×8,口径翻倍到80mm,波束就差不多能压到6度左右。代价是换能器数量翻四倍、驱动板路数增加、调试难度成倍上升。我是建议第一次做先上4×4,把方向性调出来,再考虑扩阵。
3.3 布阵工艺比想象中重要
阵列的机械固定直接决定声场质量。我用3mm亚克力板开孔,按10mm等间距钻16个圆孔,探头从孔中穿过,背面用热熔胶和AB胶双保险固定住。开孔一定要用激光切割或手工钻头精确对齐,不能有肉眼可见的歪斜,否则相位一致性就会被机械公差破坏。
所有探头的引线尽量保持等长。虽然这个项目频带不是特别高,但16路并联时,如果有的线长有的线短,分布电容和电感不对称,各个探头的相位就会有细微差异,最终表现在波束中心出现凹陷、指向性不对称。我第一次布线比较随意,正面声场中心反而闷,后来换成一圈线束整齐捆扎、每路长度差控制在1cm以内,问题立刻好转。
3.4 相位一致性的反向教训
相位一致性听起来很理论,实际排查起来很直观。你可以用示波器的两个差分探头同时测两只换能器两端的波形,看它们的正弦相位是否对齐。如果两只反相,波形整体会差半个周期。我曾经检修过一块“指向性差得离谱”的阵列,最后根源就是16只里面竟然有3只极性接反,并联后声场互相干扰得厉害。换能器焊完没做统一极向标记,这个坑后来我用红色记号笔在负极全部标一遍才彻底避开。
4. 搭建与调试过程实录
4.1 整条信号链怎么连
整个系统的信号走向大概是:音频输入(驻极体麦克风或3.5mm音源)→ 单片机ADC采样 → 数字域可选预失真 → 40kHz PWM占空比调制 → 栅极驱动IC → H桥MOSFET → LC匹配网络 → 换能器阵列 → 空气自解调。
单片机负责采样、调制和PWM输出,最好用主频高一点的,STM32F103就够用;PWM两路互补输出到H桥。如果芯片只输出单路PWM也可以,另一路取反用74HC04之类反相器做,但要额外注意死区,所以我还是推荐带互补输出的MCU。
电源部分按前面说的,12V主电源给功放,5V或3.3V给单片机和驱动IC。布线时功率地和小信号地要单点汇接,实在不行至少铺一块完整的地平面,否则PWM开关噪声很容易串到音频回路里,导致解调出来的声音有持续的“滋滋”底噪。
4.2 用示波器确认每一级波形
调试千万别跳级,我的顺序是从前往后一级一级看波形,哪一级不对立刻揪出来:
- 单片机PWM输出端应看到稳定的40kHz方波,占空比不停随音频变化。
- 半桥输出端波形应该是对称的方波或近似正弦(取决于后面匹配网络),死区时间正常。
- 换能器两端用示波器探头看,应看到一个被音频包络调制的高频信号,包络线跟输入音频形状一致。
- 用驻极体麦克风靠近阵列前方,麦克风输出端出现低频可听声成分,此时接个小耳机就能听到声音。
一个容易被忽略的问题:调试时如果把示波器探头直接跨在换能器两端,探头本身的电容会影响谐振频率。最好使用10×探头,并尽量让探头尖和接地弹簧保持短距离,不然你看到的波形是失真假象,还会影响优化判断。
4.3 第一次出声失败的全过程
第一次通电测试,我站在阵列前方快两米,麦克风里几乎只能听到微弱的底噪。当时以为是阵列数量太少,后来逐级检查才发现,问题出在调制深度:为了防止削波,我把深度调得很低,载波能量几乎全在直流分量里,发射出去的超声包络变化太小,空气非线性解调出来的声音当然弱得可怜。
把调制指数提到0.5左右后,声音立刻清晰不少。这里给个经验值:测试时先把音频输入固定成一个1kHz正弦波,听声或看示波器的麦克风输出,等链路调到波形干净后,再换成人声,不然人声频带很宽,无法判断到底哪一级失真。
4.4 指向性测试的操作细节
搭好阵列后,指向性测试值得认真做。我用一个手机固定播放扫频信号,人站固定距离,沿阵列前方的一条圆弧缓慢横向移动,记录不同角度下的听感强弱。最开始测出来正前方有声音,但偏25度声音还挺大,检查下来是阵列两侧的探头接线松动,等效于有效口径缩小。
指向性不好还有一个容易被忽略的因素:阵列前面不要放任何遮挡物,包括透明亚克力板。换能器声波需要无障碍辐射,一块薄板都能反射超声,造成波束畸变。我的亚克力板是装在探头后面固定用的,发射面保持裸露。
5. 常见问题与排查技巧实录
| 现象 | 常见原因 | 处理办法 |
|---|---|---|
| 完全无声 | 载波没输出/功放没供电 | 示波器逐级查PWM信号和MOSFET输出 |
| 只有微弱底噪 | 换能器用成接收型/方向不对 | 换成发射型,检查所有探头极性 |
| 声音小且含糊 | 调制深度太低/匹配失谐 | 提高调制指数,检查匹配电感 |
| 高频刺耳杂音 | PWM谐波过大/死区不当 | 加低通滤波,检查死区设置 |
| 功放发热严重 | 容性负载无功过大/散热不足 | 加匹配电感、加大散热片 |
| 有“吱吱”爆音 | 调制深度过高/输入削波 | 降低增益,限制输入峰值 |
| 波束偏斜 | 个别探头损坏/接线错位 | 逐路测试相位,替换故障探头 |
下面几个案例印象最深:
“声音只有贴着脸才听得见”:这个不是功率问题,而是驱动电压不够或阵列口径太小。我测试时发现12V下声音在1米内尚可,放到2米明显衰减,后来把功放级供电从12V提升到24V(H桥差分后峰值电压48V),同样距离声压直接翻了一倍多。注意升级供电后,MOSFET耐压和散热也要同步升级。
“指向性不强,侧面也有声”:排第一嫌疑的永远是相位一致性问题。我后来专门写了一段测试程序,轮流单独点亮每只换能器,用驻极体麦克风逐个测波形的相位,逐一排除反接或接触不良。这个步骤看起来很笨,但定位问题极其高效。
“测试时手机录音全部削波”:这是麦克风离阵列过近导致的过载。当时想录个演示视频,把手机怼在阵列前面不到半米,结果高频超声和低频解调声一起进来,手机AGC直接爆掉。录这类视频,手机离阵列两米以上,用后置麦克风并降低增益反而效果好。
6. 安全、改进方向与我的几点体会
6.1 大功率超声要注意的事
做定向声波玩到后期,很容易被“声功率越大越刺激”带跑偏,但安全问题必须放在前面。实验阶段,阵列正前方会形成一个高能超声束,虽然人耳对纯超声不敏感,但长时间暴露、或功率大到一定程度,仍然可能引起听力疲劳甚至不适。我在测试时始终戴着防噪耳罩,虽然不能完全隔绝超声,但至少能防止高强度声束直接轰击耳道。特别是把电源电压提到24V后,正面声压已经不小,这个保险一定不能省。
另外压电片属于易碎元件,尤其是在高压驱动时,如果有探头出现裂纹,让它继续长时间工作可能过热甚至碎裂;发现某一只声音异常变小或波形明显变形,及时断电更换。
6.2 后续还能往哪些方向改
基础版做完后,后续升级有几个非常现实的方向:
- 预失真:在代码里对音频采样值开方,能显著降谐波失真,人声更自然。
- 多通道独立相位:如果你愿意把驱动板做成16路独立PWM输出,就能实现相位差扫描波束,做出真正的电子波束偏转。
- 阵列扩容:从4×4升级到8×8,波束更窄,声压更大,但成本和调试量也要有心理准备。
- 频响校正:40kHz换能器阵列在中高频段响应和普通音箱差异很大,用均衡器补一补人声清晰度会更好。
6.3 个人体会
这个项目做完,我最大的感受是收获不来自“定向声波”这个结果,而是中间被逼着搞懂了容性负载匹配、阵列相位一致性、调制深度取舍这些原本只在书里见过的东西。它非常适合作为从纯单片机到真正了解声学系统的一座桥。如果你也准备动手,送三个字:别跳级。先单只换能器出声,再四只并联,再上阵列,每步验证通过再往下推,出了问题才不容易抓瞎。
最后再分享一个小细节:测试时最好准备一根带BNC到鳄鱼夹的连接线,把驻极体麦克风输出接到功放或声卡上实时监听,这比对着示波器看波形直观得多。声音这东西,参数再漂亮最后还得耳朵验收。