1. 为什么我选择SI4835来做一台全球波段收音机
1.1 从一堆收音机芯片里挑出SI4835的真实原因
做收音机DIY这件事,我前前后后折腾过不少方案。最早用分立元件搭过超外差,后来玩过TEA5767、RDA5807这类纯FM芯片,再往后接触了Si47xx系列。绕了一圈回来,最后把主力方案定在了SI4835这颗芯片上,原因很实在。
SI4835是Silicon Labs(芯科)推出的一款全波段数字收音机接收芯片,单芯片集成了从天线输入到音频输出的完整信号链。它支持FM、AM(中波)、SW(短波)和LW(长波),覆盖频率范围大致是:FM 64–108 MHz、AM 520–1710 kHz、SW 2.3–26.1 MHz、LW 153–279 kHz。也就是说,一颗芯片就能把调频广播、中波广播、短波国际广播全部收进来,这对DIY一台“全球波段收音机”来说,是天然契合的。
我选它主要看中三点。第一是集成度高,芯片内部集成了LNA、混频器、中频滤波、ADC/DAC、DSP解调、音频放大,外围只需要少量阻容和一颗晶振就能工作,省掉了传统超外差收音机里那一大堆中周、本振线圈和陶瓷滤波器,对DIY来说焊接和调试难度直线下降。第二是数字调谐,通过I2C总线控制,频率可以精确到1 kHz步进,不用再跟可变电容和拉线刻度盘较劲。第三是音质和灵敏度在同类里属于第一梯队,尤其是短波段的AGC和镜像抑制做得不错,实测在阳台拉一根5米长线天线,晚上能稳定收到不少国际短波台。
提示:SI4835和SI4834、SI4831属于同一家族,引脚和寄存器基本兼容,区别主要在支持的波段和封装。买芯片时注意认准后缀,别买成只支持FM的版本。
1.2 这台收音机到底能做什么,适合谁动手
先说清楚这台机器的定位。它不是要替代你家里的台式收音机,而是一个可玩性极高的DIY平台。做完之后你能得到:一台支持FM/AM/SW/LW四波段、带数字频率显示、可存储电台、音质干净的全波段接收机。你可以把它装进木盒、亚克力盒,甚至做成复古造型,摆在书桌上当个摆件兼实用工具。
适合动手的人分两类。一类是有一定焊接基础、玩过Arduino或STM32的电子爱好者,想从“点灯”进阶到“做一台真正能用的设备”;另一类是无线电爱好者,想低成本体验短波接收,又不想买成品机。如果你连电烙铁都没摸过,建议先拿洞洞板练几下手,再来做这个。
我自己的这台,主控用的是STM32F103C8T6,负责I2C控制SI4835、驱动OLED显示频率和波段、处理按键和旋转编码器。整个项目从画原理图到调试完成,断断续续花了大概两周的业余时间。下面我把完整思路和踩过的坑都摊开讲。
2. 系统架构与核心器件选型拆解
2.1 整体框图:信号链和控制链怎么分
一台收音机本质上分两条链:射频信号链和控制交互链。信号链负责把空中的电磁波变成耳朵能听的声音,控制链负责告诉芯片“现在收哪个频率、哪个波段”。
信号链的走向是这样的:天线 → 阻抗匹配网络 → SI4835的FM/SW/AM输入引脚 → 芯片内部混频、解调 → 音频输出引脚 → 功放(可选)→ 喇叭或耳机。SI4835本身有音频输出能力,可以直接推耳机,但推喇叭功率不够,所以我后面加了一颗PAM8403小功放。
控制链是:STM32 → I2C(SDA/SCL)→ SI4835寄存器 → 设置频段、频率、音量、静音等。同时STM32读取旋转编码器和按键,把用户操作翻译成I2C命令,再把当前状态显示到OLED上。
两条链在SI4835这里交汇,芯片既是信号处理核心,也是被控制的对象。理解这一点,后面调试时就知道问题该往哪条链上找。
2.2 主控为什么用STM32F103而不是Arduino
很多人会问,控制一颗收音机芯片而已,Arduino Uno不够吗?够,但有几个现实问题。
第一是I2C时序稳定性。SI4835对I2C时序有一定要求,尤其在切换波段和写入频率时,如果时序抖动大,容易出现写不进去或者芯片返回错误。STM32F103的硬件I2C虽然早期有坑,但用CubeMX配置好时钟和上拉后,稳定性明显优于软件模拟I2C。第二是资源余量。我要驱动OLED、读编码器、处理按键消抖、还要留出后续加RDS解码或频谱显示的空间,F103的72MHz主频和丰富外设刚好够用。第三是成本。一块F103C8T6最小系统板现在也就十几块钱,比某些Arduino板还便宜。
如果你手头只有Arduino,也完全能做,用Wire库控制I2C即可,只是刷新OLED和响应编码器时可能会有点卡顿。我建议至少用Arduino Nano这个级别,别用太老的板子。
2.3 显示与交互:OLED加旋转编码器的组合
显示我选的是0.96寸I2C OLED(SSD1306),128×64分辨率。为什么不用LCD1602?因为OLED自发光、对比度高、体积小,显示频率数字和波段标识非常清晰,而且也是I2C接口,和SI4835共用一条总线,接线简单。
交互用旋转编码器+轻触按键。编码器负责调频率,顺时针加、逆时针减,按键负责切换波段或确认菜单。相比一堆独立按键,编码器操作更符合收音机的使用直觉。这里有个细节:编码器一定要选带机械定位的(每转一格有“咔哒”感),否则调台时会很难精确停在某个频率上。
2.4 电源与音频功放的选择
电源部分,整机用3.3V和5V双轨。STM32和SI4835用3.3V,OLED和功放用5V。我用一颗AMS1117-3.3从5V降压给数字部分,输入5V来自USB或锂电池升压。注意SI4835的供电要干净,模拟部分最好加LC滤波,否则短波段会有数字噪声干扰。
音频功放用PAM8403,D类,5V供电,能推3W小喇叭,效率高、发热小。如果只打算用耳机听,可以省掉功放,直接把SI4835的音频输出接3.5mm插座。我两种都留了,用跳线选择。
3. 硬件设计与关键电路实操要点
3.1 SI4835外围电路:少即是多,但每个元件都关键
SI4835的外围电路看起来很简单,但每个元件的位置和取值都有讲究。我按官方数据手册的典型应用电路来搭,重点说几个容易出问题的地方。
晶振:芯片需要一颗32.768 kHz晶振作为参考时钟。这颗晶振的负载电容要按规格选,一般是12.5pF或6pF,选错了会导致频率偏移或者起振困难。我一开始随手拿了一颗没标参数的,结果FM频段整体偏了约50kHz,换了匹配的晶振后恢复正常。
天线输入:FM和SW/AM的输入引脚是分开的。FM用耳机线或专用拉杆天线,SW/AM用长线天线或磁棒天线。这里要加阻抗匹配网络,通常是几颗电感和电容组成的LC网络。官方手册给了参考值,但实际要根据你的天线长度微调。我的做法是先按手册搭,然后用扫频仪看输入端的驻波,再微调电容值。
去耦电容:每个电源引脚旁边都要放0.1μF的陶瓷电容,越靠近引脚越好。模拟电源引脚还要加一颗10μF的钽电容。这些电容不是摆设,短波段对电源噪声极其敏感,少一颗就可能收到一片“沙沙”声。
音频输出耦合:音频输出要串一颗1μF到10μF的隔直电容,再接到功放或耳机座。容值影响低频响应,太小会感觉声音“薄”,太大又可能引入低频噪声。我用的是2.2μF,听感比较均衡。
3.2 I2C总线的上拉电阻与走线
I2C总线上挂了SI4835和OLED两个从设备,STM32是主设备。上拉电阻是必须的,一般用4.7kΩ接到3.3V。如果总线上设备多或者走线长,可以降到2.2kΩ增强驱动能力,但别低于1kΩ,否则功耗和上升沿都会有问题。
走线方面,SDA和SCL尽量平行等长,远离射频输入和音频输出线,避免串扰。我第一版PCB把I2C线走在了天线输入旁边,结果调台时OLED会随机闪烁,后来把I2C线改到板子另一侧就解决了。如果是洞洞板搭,用双绞线把SDA和SCL绞在一起,再单独走一根地线,效果也不错。
注意:SI4835的I2C地址是固定的,具体值查数据手册。如果总线上有地址冲突,OLED可以用地址跳线改到另一个地址。
3.3 波段切换的硬件处理
SI4835内部支持多波段,但天线输入路径不同。FM和AM/SW/LW的输入引脚是分开的,所以波段切换本质上是在切换天线。我的做法是用一颗模拟开关(比如CD4052或74HC4052)在STM32控制下切换天线输入,同时通过I2C告诉SI4835当前工作在哪个波段。
这里有个坑:切换波段的瞬间,如果天线开关和芯片寄存器设置不同步,会有短暂的“爆音”或“死寂”。解决办法是先静音芯片,再切天线,再设寄存器,最后取消静音,中间加几十毫秒延时。这个顺序我试了好几次才定下来,顺序错了体验很差。
3.4 PCB布局与接地经验
如果打PCB,建议双面板,底层完整铺地。射频部分和数字部分分区布局,模拟地和数字地单点连接。SI4835底部的散热焊盘要接地,既散热又提供参考地。
晶振尽量靠近芯片,走线短而直,下方不要走其他信号线。天线输入到芯片的走线要短,最好用50Ω阻抗线。音频输出走线远离射频和数字线,避免拾取噪声。
我用的是嘉立创打样,5×5cm双面板,成本很低。第一版有噪声问题,第二版调整布局后短波段底噪明显下降。洞洞板也能做,但短波段效果会打折扣,因为洞洞板的寄生参数不可控。
4. 固件开发:从I2C驱动到交互逻辑
4.1 CubeMX配置与I2C底层驱动
用STM32CubeMX配置工程,时钟树设到72MHz,I2C1开标准模式(100kHz)或快速模式(400kHz)。SI4835支持400kHz,用快速模式刷新更快。GPIO配置好编码器和按键的输入,OLED和SI4835共用I2C1。
生成代码后,先写一个I2C读写封装函数,因为SI4835的寄存器是16位地址+8位数据,需要按它的协议格式来。我封装了SI4835_WriteReg(uint16_t addr, uint8_t data)和SI4835_ReadReg(uint16_t addr)两个函数,后面所有操作都基于它们。
调试I2C时,如果读不到数据,先用逻辑分析仪或示波器看SDA/SCL波形。常见问题是上拉电阻没接、地址写错、或者时序太快。我遇到过因为上拉电阻焊成了10kΩ导致上升沿太慢,换成4.7kΩ就好了。
4.2 SI4835初始化与波段频率设置
上电后要先给SI4835做初始化:复位、设置晶振类型、配置音频输出、设置去加重(FM用50μs或75μs,看地区)。这些寄存器值在数据手册里有推荐配置,照着写就行。
设置频率的核心是把目标频率换算成芯片需要的PLL参数。SI4835内部有PLL,你需要根据频段和参考时钟算出分频比。官方手册给了公式,我把它写成C函数:
// 以FM为例,假设参考时钟32.768kHz // 具体公式以数据手册为准,这里示意 uint16_t freq_to_pll(uint32_t freq_khz, uint8_t band) { // band: 0=FM, 1=AM, 2=SW, 3=LW // 根据band选择不同的分频系数 // 返回写入寄存器的值 }实际写的时候要注意,不同波段的步进不一样:FM是10kHz或50kHz,AM是9kHz或10kHz,SW是5kHz。步进设错了,调台时会跳频或者收不到台。
4.3 旋转编码器读取与消抖
旋转编码器用外部中断+定时器消抖的方式读。编码器A、B两相接到两个GPIO,都开中断,在中断里判断相位差决定加减。但机械编码器抖动严重,直接读会一次转动加好几个数。
我的做法是:中断里只置标志,实际处理放在主循环,并且加10ms的软件消抖。具体是记录上次有效转动的时间,小于10ms的忽略。这样调台手感很顺,不会跳。按键同理,用20ms消抖。
实操心得:编码器如果用的是带按键的那种,按键和旋转共用引脚,要注意区分。我建议旋转和按键用独立的GPIO,省得逻辑复杂。
4.4 OLED显示与菜单逻辑
OLED用现成的SSD1306驱动库,显示内容分三层:顶部显示波段(FM/AM/SW/LW),中间大字显示频率,底部显示信号强度或音量。刷新率不用太高,10Hz足够,太高反而占CPU。
菜单逻辑我做得比较简单:短按编码器按键切换波段,长按进入设置(音量、步进、静音),旋转调频率或改设置值。状态机用switch-case实现,每个状态对应不同的按键处理。这样代码清晰,后续加功能也方便。
4.5 频率存储与断电记忆
收音机断电后要记住上次听的频率和波段,这需要掉电存储。STM32F103内部有Flash,可以划一页出来存参数。但Flash擦写次数有限(约1万次),不能频繁写。我的策略是:只在关机或切换波段时写一次,平时调频率只更新RAM。
如果不想动Flash,也可以外挂一颗24C02 EEPROM,I2C接口,和SI4835共用总线。EEPROM擦写次数高得多,适合频繁存储。我用的是内部Flash,因为省一颗芯片,而且实际使用中不会频繁开关机。
5. 调试实录:那些让我熬夜的坑
5.1 收不到台:从天线到寄存器的排查顺序
第一次上电,OLED显示正常,但喇叭里只有噪声,一个台都收不到。排查顺序是这样的:
先确认天线接对了。FM要用耳机线或拉杆天线,SW/AM要用长线。我一开始把长线接在了FM输入上,当然收不到短波。换到SW输入后,晚上能收到几个台了。
再确认寄存器写对了。用逻辑分析仪抓I2C,发现频率寄存器的值算错了,实际设到了FM频段之外。重新核对公式后解决。
最后确认静音寄存器。SI4835上电默认可能是静音状态,要显式取消静音。我漏了这一步,白白折腾了半天。
5.2 短波段噪声大:电源和布局的锅
短波段对噪声极其敏感。我的第一版用USB供电,短波段底噪很大,全是“嗡嗡”声和数字噪声。后来做了三件事:一是给模拟电源加LC滤波,二是把数字地和模拟地分开走,三是在SI4835电源脚旁边补了0.1μF和10μF电容。改完之后底噪明显下降,弱台也能听清了。
还有一个细节:OLED刷新时会产生噪声。因为OLED和SI4835共用I2C,刷新瞬间电流变化会耦合到电源。解决办法是给OLED单独加一颗LDO,或者在刷新时短暂静音。我选了前者,效果彻底。
5.3 调台跳频:编码器消抖没做好
前面提过,编码器抖动会导致一次转动跳好几个频率。我一开始用中断直接加减,结果调台像抽奖。后来改成中断置标志、主循环消抖处理,问题解决。消抖时间我试过5ms、10ms、20ms,最后定在10ms,手感最好。
另外,编码器的机械定位也很重要。我买过一批便宜的编码器,转动时没有清晰的“咔哒”感,调台很难精确。换了带定位的之后,体验完全不一样。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 完全无声 | 静音未取消、功放没供电 | 查静音寄存器、量功放电压 | 取消静音、检查功放接线 |
| 只有噪声收不到台 | 天线接错、频率算错 | 确认天线波段、抓I2C数据 | 换天线输入、重算PLL |
| 短波段噪声大 | 电源不干净、布局差 | 示波器看电源纹波 | 加LC滤波、分地 |
| 调台跳频 | 编码器抖动 | 观察转动时频率变化 | 加消抖、换编码器 |
| OLED闪烁 | I2C冲突、电源跌落 | 抓I2C波形 | 改地址、单独供电 |
| 频率偏移 | 晶振负载电容不对 | 对比实际频率 | 换匹配晶振 |
5.5 几个让我印象深刻的实操心得
第一个心得:先让芯片出声,再优化。我一开始想把所有功能都做完美再上电,结果卡在某个寄存器上很久。后来改变策略,先用最小配置让SI4835出声,确认信号链通了,再逐步加显示、加交互。这样每步都有反馈,调试效率高很多。
第二个心得:数据手册要反复看。SI4835的寄存器很多,有些位的含义在正文和附录里说法不同。我遇到过一个音频配置位,正文说默认0,附录说默认1,实际测试发现附录是对的。所以手册要交叉验证,别只看一处。
第三个心得:天线决定上限。芯片再好,天线不行也白搭。我试过用一根20cm的短线收短波,效果很差;换成5米长线加一个简单的天调,同样的芯片,接收效果天差地别。所以别在芯片上死磕,先把你手头的天线搞好。
6. 外壳、扩展与后续玩法
6.1 外壳选择与装配
外壳我试过三种:塑料防水盒、亚克力板拼装、木质音箱盒。塑料盒最好加工,开孔用烙铁烫或者手钻都行,但屏蔽效果一般。亚克力好看,但需要激光切割,成本高。木质盒最有复古感,但要注意内部贴铜箔做屏蔽,否则短波段会受干扰。
我最后用的是木质盒+内部铜箔的方案。喇叭装在面板上,OLED和编码器开孔固定,天线用BNC座引出。整体看起来像一台小台式收音机,摆在桌上很顺眼。
6.2 可扩展的功能方向
这台机器做完之后,还有很多可以加的东西。比如RDS解码,FM广播里藏着电台名称和节目信息,SI4835支持RDS,加几行代码就能显示出来。再比如频谱显示,把信号强度做成柱状图或瀑布图,OLED就能当个小频谱仪用。还有自动搜台,扫描整个频段把有信号的频率存下来,一键切换。
如果想联网,可以加一颗ESP32做WiFi,把频率和信号强度上传到手机,或者做网络收音机的补充。不过那就偏离纯收音机的初衷了,看个人兴趣。
6.3 成本清单与采购建议
整个项目的物料成本大概如下(按单件算):
| 器件 | 型号 | 参考价 |
|---|---|---|
| 收音芯片 | SI4835 | 15-25元 |
| 主控 | STM32F103C8T6最小系统 | 12-18元 |
| 显示 | 0.96寸OLED | 8-12元 |
| 功放 | PAM8403模块 | 3-5元 |
| 编码器 | 带按键旋转编码器 | 2-4元 |
| 晶振 | 32.768kHz | 1-2元 |
| 阻容 | 若干 | 5-10元 |
| PCB | 5×5cm双面 | 5-10元 |
| 外壳喇叭等 | - | 20-40元 |
总计大概70-120元,比买一台成品全波段收音机便宜,而且过程本身就是乐趣。采购时注意SI4835别买到翻新片,尽量选正规渠道。晶振和编码器别贪便宜,这两个直接影响体验。
6.4 给新手的几点实在建议
如果你准备动手,我的建议是:先做FM,再做SW。FM电路最简单,天线用耳机线就行,容易出成果,能给你信心。SW涉及天线匹配和噪声控制,难度高一些,等FM调通了再上。
焊接时先焊矮的元件,比如电阻电容,再焊芯片和插座。SI4835如果是QFN封装,建议用热风枪或者找代焊,手工烙铁容易虚焊。我用的是SSOP封装的版本,手工焊难度低一些。
调试时准备一台成品收音机做对比。同一个频率,成品机能收到,你的收不到,说明是硬件或天线问题;成品机也收不到,可能是时段或传播条件问题。有个参照物,排查会快很多。
最后,别怕失败。我第一版PCB打回来,短波段完全不能用,第二版才调好。电子DIY就是这样,每次踩坑都是在积累经验。等你晚上拉上天线,从短波里听到几千公里外传来的声音时,那种成就感是买成品机给不了的。