SI4835全波段收音机DIY:从芯片选型到STM32固件调试实战
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 → I2CSDA/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 OLEDSSD1306128×64分辨率。为什么不用LCD1602因为OLED自发光、对比度高、体积小显示频率数字和波段标识非常清晰而且也是I2C接口和SI4835共用一条总线接线简单。交互用旋转编码器轻触按键。编码器负责调频率顺时针加、逆时针减按键负责切换波段或确认菜单。相比一堆独立按键编码器操作更符合收音机的使用直觉。这里有个细节编码器一定要选带机械定位的每转一格有“咔哒”感否则调台时会很难精确停在某个频率上。2.4 电源与音频功放的选择电源部分整机用3.3V和5V双轨。STM32和SI4835用3.3VOLED和功放用5V。我用一颗AMS1117-3.3从5V降压给数字部分输入5V来自USB或锂电池升压。注意SI4835的供电要干净模拟部分最好加LC滤波否则短波段会有数字噪声干扰。音频功放用PAM8403D类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配置工程时钟树设到72MHzI2C1开标准模式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: 0FM, 1AM, 2SW, 3LW // 根据band选择不同的分频系数 // 返回写入寄存器的值 }实际写的时候要注意不同波段的步进不一样FM是10kHz或50kHzAM是9kHz或10kHzSW是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 EEPROMI2C接口和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 成本清单与采购建议整个项目的物料成本大概如下按单件算器件型号参考价收音芯片SI483515-25元主控STM32F103C8T6最小系统12-18元显示0.96寸OLED8-12元功放PAM8403模块3-5元编码器带按键旋转编码器2-4元晶振32.768kHz1-2元阻容若干5-10元PCB5×5cm双面5-10元外壳喇叭等-20-40元总计大概70-120元比买一台成品全波段收音机便宜而且过程本身就是乐趣。采购时注意SI4835别买到翻新片尽量选正规渠道。晶振和编码器别贪便宜这两个直接影响体验。6.4 给新手的几点实在建议如果你准备动手我的建议是先做FM再做SW。FM电路最简单天线用耳机线就行容易出成果能给你信心。SW涉及天线匹配和噪声控制难度高一些等FM调通了再上。焊接时先焊矮的元件比如电阻电容再焊芯片和插座。SI4835如果是QFN封装建议用热风枪或者找代焊手工烙铁容易虚焊。我用的是SSOP封装的版本手工焊难度低一些。调试时准备一台成品收音机做对比。同一个频率成品机能收到你的收不到说明是硬件或天线问题成品机也收不到可能是时段或传播条件问题。有个参照物排查会快很多。最后别怕失败。我第一版PCB打回来短波段完全不能用第二版才调好。电子DIY就是这样每次踩坑都是在积累经验。等你晚上拉上天线从短波里听到几千公里外传来的声音时那种成就感是买成品机给不了的。