如果你最近刷过电子DIY类的视频或论坛,大概率会被那种巴掌大小、能自己搜台、能调音量的FM收音机小板吸引。我这次把RDA5807M加PAM8403这套经典组合,用立创EDA完整走了一遍流程——从原理图、PCB布局布线,到打板焊接,再到写单片机程序控制FM调谐,全程踩坑记录都放在这里。
这套方案最大的价值在于:两颗芯片加起来不到十块钱,外围元件少到一只手能数完,但最终能做出带频率显示、带喇叭外放、音质还过得去的真实FM收音机。整个项目不依赖昂贵的仪器,一个万用表、一把烙铁、一个最小系统板就能完成。无论你是入门电子爱好者、想找课程设计题目的学生,还是想体验“自己画板自己听响”的玩家,这份笔记都值得收藏。
1. 项目概述与整体设计思路
1.1 这块板子到底能做什么
先明确一下做出来的东西是什么形态。这是一个以 RDA5807M 为核心的数字调谐FM收音机,支持87MHz到108MHz频段接收,通过I2C总线用单片机控制选台、音量、静音和信号扫描;音频信号从RDA5807M输出后,送到PAM8403 D类功放推动一个3W左右的小喇叭。
它能做的事情很实在:
- 手动输入频率,收听当地FM广播;
- 按键进行台站搜索、音量加减;
- 通过I2C读取RSSI信号强度,判断当前电台信号好坏;
- 扩展一个OLED或LCD屏,实时显示当前频率和音量;
- 保留耳机输出接口,方便晚上安静收听。
我做的时候还顺手加了一个音频输入切换功能,通过跳线帽选择“收音机模式”和“外部音频输入模式”,这样这块小板子除了当收音机,还能当桌面小功放用,实用性一下子高了不少。
1.2 为什么选RDA5807M + PAM8403这套组合
先说结论:这套组合是成本和性能平衡得最好的一套方案,特别适合第一次自己从头画板子的新手。
RDA5807M是上海某半导体公司推出的一颗低功耗FM接收芯片,支持I2C数字控制,内部集成了低噪声放大器、混频器、中频滤波器、解调器和音频放大器,芯片本身只需要一个32.768kHz晶振和少量去耦电容就能工作。相比传统方案里常见的LA1600加变容二极管调谐电路,RDA5807M把“模拟调谐”变成了“写寄存器”,你不需要手工调节中周磁芯,也不用担心变容管非线性导致频率漂移,这在DIY层面直接砍掉了大量玄学调试点。
PAM8403则是一颗3W+3W的D类立体声功放芯片,工作在5V电压下,效率能到80%以上,内置过流、过温保护。它最讨喜的地方是外围非常精简,输入加两个耦合电容,输出加一组LC滤波,再接上喇叭就能出声,几乎不需要调试。而且芯片自带SD关断引脚,可以直接用单片机GPIO控制功放开合,避免上电一瞬间的爆音。
成本上,RDA5807M散片大概三四块钱,PAM8403模块零售也就一两块钱,加上晶振、电容、电位器、喇叭、PCB,整套物料成本可以压在25元以内。这个价位能做到立体声FM接收加功放外放,十年前想都不敢想。
1.3 系统架构与控制方案取舍
整个系统可以拆成两条链路:信号链路和控制链路。
信号链路是这样的:天线接收到的射频信号进入RDA5807M的RFIN引脚,芯片内部完成混频、中频滤波、解调后,从LOUT和ROUT两个引脚输出模拟音频,再经过耦合电容送到PAM8403的同相输入端,PAM8403放大后从OUTL+、OUTL-、OUTR+、OUTR-四个引脚输出,直接驱动喇叭。
控制链路则是单片机通过I2C总线读写RDA5807M的内部寄存器,完成频率设置、音量调节、静音控制、信号检测等功能。
控制芯片的选择有三种常见路线:
- 如果你手头有Arduino Nano,直接用Wire库,代码最简单;
- 如果你熟悉STM32,用硬件I2C或模拟I2C都行,顺便还能做按键扫描和OLED显示;
- 如果你追求极限体积,用一颗ATtiny85这样的小封装单片机也足够,就是调试麻烦点。
我这次用的是STM32F103最小系统板,一方面是因为手头正好有,另一方面是想顺便体验一下在更接近真实产品的环境下控制收音机芯片。实际连好之后发现,用哪颗单片机并不关键,只要I2C时序正确、地址不搞错,RDA5807M都能正常工作。
2. 原理图设计细节与关键元器件解析
2.1 RDA5807M最小系统怎么搭
RDA5807M常见封装是SOP16,引脚不算密集,手工焊接完全可行。设计最小系统时,核心关注五个部分。
第一是电源。RDA5807M的工作电压范围大概在2.7V到3.6V,我推荐直接给它供3.3V。电源引脚旁边要放两个去耦电容,一个100nF的高频去耦,一个10uF的钽电容或陶瓷电容做低频储能,两个电容尽量靠近芯片电源引脚放置。这一点很多新手容易忽略,总觉得电容加上就行,实际上放置位置不对,高频噪声照样能窜进芯片。
第二是I2C接口。SCL和SDA两个引脚都要接上拉电阻,阻值用4.7k比较标准。上拉电阻的电源端接哪个,决定了I2C的高电平电压,这里直接接到3.3V就行。如果单片机是5V供电,要注意电平匹配问题,最好加一个电平转换,或者确认单片机I2C引脚能正确识别3.3V高电平。
第三是晶振。RDA5807M需要一个32.768kHz的时钟晶振,这个晶振的负载电容通常在12.5pF左右,可以在晶振两端各接一个15pF到22pF的电容到地。如果没有这两个电容,晶振也可能起振,但频率稳定度会大打折扣,收台时容易出现频率偏一点点的现象。
第四是音频输出。芯片的LOUT和ROUT引脚输出的是模拟音频信号,输出阻抗不低,建议经过1uF到10uF的隔直电容后再送往后级。有些资料里会直接把这个输出推到耳机接口,中间不加功放,也是可行的,RDA5807M内部其实带了简单的音频放大,直推32欧耳机没有问题。
第五是天线输入。RDA5807M的灵敏度很不错,在开阔环境用一根十几厘米的导线当天线就能收到不少台。RFIN引脚可以直接接一根短导线,也可以通过一个100pF左右的电容串联后再接天线,起到隔直流作用。如果你希望接收效果更好,可以做一个简单的1/4波长天线,调频广播波长为3米左右,1/4波长就是75厘米,但那样做出来携带不方便,日常用短线天线或者耳机线当天线更实际。
2.2 PAM8403功放部分的设计要点
PAM8403的典型应用电路在数据手册里写得很清楚,照着画就行,但我还是说说几个关键点的选择逻辑。
输入部分,INL和INR引脚是音频输入端,内部有偏置电路,外部必须串入耦合电容隔直,电容值选0.1uF到1uF都可以。容量越大,低频响应越好,但上电瞬间的“砰砰”声也越明显。我实测用0.47uF比较均衡,低频不会太薄,开机爆音也能控制在可接受范围内。
输出部分,PAM8403是D类功放,输出端是PWM波,不能直接接喇叭了事,需要通过LC低通滤波器还原成音频信号。标准电路是在每个输出引脚上串联一个22uH的电感,再接一个220nF电容到地,组成LC滤波。实际DIY时,很多人会用电感代替磁珠,效果更好一些。千万别省掉这个滤波,否则喇叭里全是高频开关噪声。
控制部分,SD引脚是关断控制脚,低电平关断。我的做法是接一个10k下拉电阻到地,再用单片机GPIO通过一个1k电阻控制,默认低电平,等系统初始化完成后再拉高,这样能避免上电瞬间的爆音。注意,SD引脚不能悬空,悬空状态下功放可能进入不确定状态。
增益方面,PAM8403内部增益固定,不需要外接反馈电阻。实际使用时如果感觉声音太大,可以在输入端用电阻分压或者用音量电位器衰减。我直接在输入前加了一个10k电位器,这样收音机音量控制和功放增益可以分开调节,互不干扰。
2.3 电源规划与星型接地的提前设计
这个部分可能是整个项目最容易被忽视但最影响成败的地方。
系统里有三个用电主体:单片机的3.3V或者5V、RDA5807M的3.3V、PAM8403的5V。如果全从USB 5V取电,RDA5807M需要经过LDO降压到3.3V。我选了一颗AMS1117-3.3,便宜、稳定、够用。
但真正值得花心思的是接地设计。FM收音机属于射频接收类设备,对电源噪声和地噪声非常敏感,功放又是大电流开关类设备,两者放在一块板子上,接地处理不好就会出现“收台少、底噪大、音量一开就呜呜叫”的问题。
我的做法是星型接地:把板子上的地分成三个区域,一是RDA5807M和晶振所在的模拟地,二是单片机、I2C上拉电阻所在的数字地,三是PAM8403功放及其滤波电路所在的功率地。三块地在原理图阶段网络标签先分开命名(AGND、DGND、PGND),到了PCB阶段再通过单点汇合到电源输入端的滤波电容负极处。
具体走线时,每个区域的GND先各自独立走线,不要互相交叉、不要大面积共用,最后在电源输入位置汇合。这样做的核心目的,是让数字电路和功放的大电流脉动不流过RDA5807M的地平面,避免地线干扰变成音频底噪。很多接到板子之后发现收音机“沙沙声特别大”的案例,八成都是地没处理好。
3. 立创EDA实操:原理图到PCB布线
3.1 在立创EDA中搭建工程与放置元件
立创EDA是我目前用起来最顺手的国产免费EDA工具,它最大的优势是元件库和立创商城打通,大多数常用芯片都能直接搜索到官方做好的原理图符号和PCB封装,省去自己画封装的时间。
打开立创EDA标准版,新建一个工程,命名为RDA5807M_FM_Radio。然后从库中搜索RDA5807M,找到立创商城认证的封装,直接放置到原理图。如果搜出来的型号带扩展后缀,注意确认封装是不是SOP16,不要选成QFN之类不好手工焊的封装。
继续搜索PAM8403、AMS1117-3.3、32.768kHz晶振、喇叭接线端子、耳机座、电位器,全部放好。放置完成后,按照原理图把各个引脚用导线或网络标签连接起来。我的习惯是电源和地都用网络标签连接,信号线尽量直接连线,这样图纸层次清楚,后期检查也方便。
全部连接完后运行一次ERC电气规则检查,重点看有没有未连接的引脚、短路和输出冲突。RDA5807M有些引脚在特定模式下不用,比如RDS相关引脚,如果你暂时不打算做RDS显示,这些引脚可以悬空,但最好在ERC规则里设置忽略未连接引脚,避免误报。
3.2 PCB布局布线:星型接地与信号完整性的实战
原理图通过ERC后,切换到PCB设计界面。这时你会看到一堆元件“飞线”挤在一起,不要慌,先别自动布局,手动按功能分区摆放才是正路。
我的布局顺序是这样的:先把RDA5807M放在板子中央偏左的位置,晶振放在离芯片时钟引脚最近的地方,去耦电容紧贴芯片电源引脚,I2C上拉电阻放在SCL和SDA连线中间。再把AMS1117放在板子电源输入端,RDA5807M的3.3V供电从LDO输出端单独走线过去,不要横穿整个板子。
PAM8403放在板子右侧,和喇叭接线端子靠在一起,它的输入电容靠近芯片输入引脚,输出LC滤波网络靠近芯片输出引脚。三个区域的地在PCB上直观体现为“AGND区域”“DGND区域”“PGND区域”各自成片。
布线时的几个硬性要求:
- 电源走线加宽到40mil以上,尤其是5V到PAM8403这一段;
- 功放输出线尽量短,左右声道保持对称;
- 音频输入线要短且远离数字信号线,防止数字噪声耦合进音频;
- I2C的SCL、SDA两条线不要走太长,且最好并行走,减少差分干扰;
- RDA5807M的RFIN天线输入引脚附近不要铺地铜,保持一点空白区域,避免寄生电容把射频信号吸收掉。
星型接地的具体走法,我的做法是:AGND区域的地铜箔先通过一根单独走线连到电源输入电容的负极;DGND区域的地也单独一根走线连过去;PGND因为电流大,用一块较宽的地铜皮直接覆盖功放区域,再单独连接到同一个点。这样三块地没有形成环路,最后汇合点就是电源地。
3.3 铺铜、DRC检查与下单打样
布线完成之后,把PCB顶层和底层都铺上地铜。这里有个细节:因为我们已经手动规划了三个地分区,铺铜的时候要小心,不要随手一块整铜把三个地全部短接在一起,那样星型接地就白做了。我一般在铺铜时用“铺铜区域”工具分别框出AGND、DGND、PGND三个区域,每个区域之间留一点间隙,最后通过走线在单点汇合。
铺铜完成后跑一遍DRC,重点检查间距和未连接网络。立创EDA的DRC报告会直接列出问题坐标,双击可以跳转查看。最常见的问题是过孔和焊盘间距不足、铺铜间隙过小、还有个别走线没有连上。
确认没有DRC错误后,在菜单里选择制造 -> PCB下单,系统会生成Gerber文件。嘉立创的小批量打样服务对这类小板子很友好,5元打样基本能覆盖5片,注意板子长宽尽量控制在10cm以内,超出会按面积加钱。我这次板子做的是双面2层,1.6mm板厚,绿色阻焊,沉金工艺有没有都无所谓,喷锡就够用了。
4. 焊接、程序烧录与整机调试
4.1 贴片焊接顺序与避坑技巧
板子到手后先别急着上电,用万用表通断档测一遍电源正负极之间有没有短路,确认没问题再开始焊接。
焊接顺序上,我习惯“由小到大、由电源到核心”。先用镊子夹住AMS1117,对准焊盘,用烙铁固定对角两个引脚,再拖焊其余引脚。焊完LDO后,接着焊周围的去耦电容,注意电容极性,钽电容有极性,贴片陶瓷电容和MLCC没有极性但位置要对。
RDA5807M是SOP16封装,引脚间距0.65mm左右,手工焊接要么用拖焊法,要么用热风枪。我建议新手先用松香加拖焊:在引脚上涂固体松香,烙铁头蘸足焊锡,沿着一侧引脚慢慢拖,焊锡会顺着引脚流动,最后用吸锡带清理多余焊锡即可。焊完后建议用放大镜或手机微距镜头检查一遍,重点看相邻引脚之间有没有锡桥。
PAM8403我推荐用热风枪吹,温度三百摄氏度左右,风量不要太大,对着芯片均匀加热,焊锡熔化后芯片会自动归位。注意PAM8403底部如果有散热焊盘,要先在焊盘上刷一层薄薄的焊锡膏,再放芯片,这样散热和接地都能保证。
全部焊接完成后,先只接USB 5V电源,用万用表测AMS1117输出是不是3.3V,测PAM8403的5V供电是不是正常。确认电压无误后,再用手指轻触RDA5807M的音频输出引脚,如果喇叭有“嗡嗡”声,说明功放部分工作正常。
4.2 控制程序实现:频率调谐与音量控制
我用的单片机是STM32F103,程序逻辑其实不复杂,核心就是通过I2C往RDA5807M的寄存器里写值。
RDA5807M的I2C地址是0x10(7位地址),库函数Wire.beginTransmission传入的就是这个7位地址。如果你用逻辑分析仪抓波形,会发现通信地址是0x20,那是地址左移一位后的8位写地址,两个说法指向同一个芯片,别被搞晕。
控制芯片需要先掌握几个关键寄存器:
- 寄存器0x02:芯片使能、软复位控制;
- 寄存器0x03和0x04:频率调谐相关,频率字的高低位会分配在这两个寄存器里;
- 寄存器0x05:左右声道音量控制;
- 寄存器0x0A:读取信号强度RSSI、调谐完成标志等状态。
写一个简化版的控制代码,思路如下:
#include "i2c.h" #define RDA5807M_ADDR 0x10 void rda5807m_write_reg(uint8_t reg, uint16_t val) { uint8_t buf[2]; buf[0] = val >> 8; buf[1] = val & 0xFF; HAL_I2C_Mem_Write(&hi2c1, RDA5807M_ADDR << 1, reg, I2C_MEMSIZE_8BIT, buf, 2, 100); } void rda5807m_init(void) { rda5807m_write_reg(0x02, 0xC001); // 使能芯片,软复位 HAL_Delay(100); rda5807m_write_reg(0x02, 0x0001); // 退出复位,正常工作 rda5807m_write_reg(0x05, 0x0F0F); // 左右声道音量设置为最大 } void rda5807m_set_frequency(float mhz) { uint16_t freq_word = (uint16_t)((mhz * 1000 + 760) / 10); rda5807m_write_reg(0x03, freq_word >> 8); rda5807m_write_reg(0x04, (freq_word << 8) | 0x10); }这段代码里最值得注意的是频率字换算。RDA5807M内部频率步进是10kHz,换算公式是频率字 = (目标频率kHz + 760) / 10。举例来说,想收103.9MHz,计算过程是 103.9兆赫 = 103900kHz,加760等于104660,除以10后得到10466。这个10466换算成十六进制是0x28E2,高字节0x28写入寄存器0x03,低字节0xE2左移8位再置上TUNE位0x10写入寄存器0x04。TUNE位置1后芯片开始调谐,调谐完成后音频输出就会切换到新频率。
如果你在调试时发现某个频率收不到台,先检查这个换算过程算出来的值对不对,很多例程用100倍、10倍的写法各不相同,混用最容易出错。
4.3 整机联调与音质优化
程序烧录后,先不要急着搜台,用I2C扫描工具读一下RDA5807M的地址是否出现在总线上。如果扫描不到,多半是接线或者供电问题,后面章节会专门说排查方法。
确认I2C通信正常后,调用一次设置频率的函数,选择你所在城市信号比较强的FM发射台频率。如果喇叭里传出了广播声,恭喜你,核心链路已经打通了。
接下来的音质优化是个细活。
先把RMS音量调到中等偏小,然后听不同台的效果。如果底噪偏大,第一件事是静态灵敏度检查:不接天线时,听喇叭里的沙沙声是否均匀,如果有一阵阵的周期性噪声,大概率是电源或地环路问题,而不是芯片问题。
我实际调试时遇到的一个典型问题是:音量开到一半以后喇叭出现轻微“嗡嗡”声,排查下来是AMS1117的输入输出电容距离太远。LDO需要较近的输入输出电容来保持环路稳定,否则在负载突变时会有低频振荡。把输入端的10uF和100nF电容移到LDO引脚附近后,问题直接消失。
天线的位置和长度也会明显影响音质。同样的电路,把天线从一根15厘米的裸铜线换成耳机线,收台数量和信号清晰度都提升了一个等级。这是因为耳机线本身对地有分布电容,相当于一个简易天线匹配网络。如果你想固定使用那种短天线,可以考虑在RFIN引脚和天线之间串一个3.3pF到10pF的小电容,实测对弱信号的灵敏度改善有一定帮助。
5. 常见问题与排查技巧实录
5.1 通电完全无声,功放无反应
这是最打击新手的问题。我的排查习惯是从电源端开始,一级一级往后查。
先用万用表量AMS1117输出是否为3.3V,再量PAM8403的5V是否正常,然后量RDA5807M的VCC引脚是否真有3.3V。很多时候问题出在LDO电容虚焊导致LDO振荡,输出端电压正常但实际带载能力差,一接芯片就掉电。
接着检查功放SD引脚电平。PAM8403的SD引脚如果被拉低,功放直接关断,芯片表面摸起来微温但没有声音。我在调试时好几次都是因为跳线帽没插导致SD引脚悬空,功放默认不工作。
最后检查音频通路。用万用表二极管档,红表笔接地,黑表笔触碰功放输入引脚,喇叭应该能听到轻微的“咔咔”声。如果没有任何声音,问题大概率在功放或者喇叭端。
5.2 噪声大、收台少、底噪明显
收台少和底噪大往往是同一个根源:射频信号没有正常进入芯片,或者被干扰抵消了一部分。
第一步检查天线。裸铜线当天线时,不要把它弯成一团贴在板子上,尽量拉直或悬空,离地铜和电源线远一点。RDA5807M的RFIN引脚附近如果被地铜大面积包围,相当于信号被短路到地,收台数量会断崖式下降。
第二步检查电源纹波。用示波器看AMS1117输出端的纹波,如果超过50mV,就要检查输入端的滤波电容是否足够。把USB供电换成电池供电或质量好的充电宝,往往能明显改善底噪。
第三步检查接地。用一根飞线把功放区域的地和RDA5807M区域的地直接短接一下(相当于破坏星型接地的单点特性),如果底噪反而减小,说明你原来的接地汇合点选得不对,试试把汇合点移到LDO输出电容的负极处。
5.3 I2C通信失败,扫描不到芯片地址
I2C通信失败的排查顺序很固定。
先确认接线:SCL接SCL、SDA接SDA,两个引脚有没有接反。这听起来像废话,但我在调试时真的因为杜邦线颜色太接近插反过一次,浪费了一个晚上。
再确认上拉电阻:立创EDA原理图里画了4.7k上拉,但PCB上有没有实际贴上去,这是另一回事。有一次我画完PCB后PCB布局阶段把上拉电阻删了没补回去,导致I2C一直通信失败,最后查出来就是缺电阻。
接着检查电平匹配:如果单片机是5V供电,而RDA5807M是3.3V供电,SDA和SCL的高电平可能低于芯片识别阈值。稳妥的做法是给RDA5807M供电3.3V,单片机如果是5V,把I2C上拉电阻接到3.3V,并且单片机引脚如果是开漏模式,就能保证高电平在3.3V不会超出芯片耐受范围。
如果以上都查过了还不行,用示波器抓一下SCL和SDA波形,看信号幅度、上升沿是否正常。上升沿太缓的话,上拉电阻阻值太大,换成2.2k试试。
6. 写在最后的实际体验心得
这套板子做完到现在,我断断续续听了两三个月,最大的感触是:在FM收音机这类射频加音频混合的项目里,真正决定成败的不是芯片有多高级,而是电源和接地处理得多仔细。同样的RDA5807M,之前我随手飞线搭过一套,能响但噪声大得没法听;这次认真设计了星型接地和分区铺铜之后,底噪明显降低,弱台也能稳定收到了。
如果你也想复刻这个项目,我的建议很直接:第一轮先用面包板和杜邦线把代码调通,确认RDA5807M能正常初始化、能搜到台,再动手画PCB。直接画板容易把硬件问题和软件问题混在一起,排查起来非常头疼。第二轮画PCB时,把电源滤波电容留足位置,把星型接地提前规划好,其余按部就班做,成功率会高很多。
后续想继续玩的话,可以给板子加一块OLED显示当前频率,或者通过RDA5807M的RDS功能解析电台名称,再进一步还能加一个蓝牙音频输入切换,让这块小板子在收音机和桌面功放之间自由切换。这个项目的上限,远比它“简易收音机”的定位要高。