1. 项目概述:构建基于Si4731和PIC18F97J94的收音机系统
这个项目将带您用Si4731收音芯片和PIC18F97J94微控制器打造一个可编程的FM/AM收音系统。Si4731是Silicon Labs推出的一款高性能数字收音芯片,支持全球范围内的FM和AM广播接收。而PIC18F97J94则是Microchip公司PIC18系列中的一款功能强大的8位微控制器,具备128KB闪存和丰富的外设接口,非常适合作为收音系统的控制核心。
在实际操作中,我们会先搭建硬件电路,然后编写控制程序,最终实现一个可以存储频道、调节音量、显示频率的完整收音系统。这个项目不仅能帮助您理解数字收音机的工作原理,还能掌握嵌入式系统开发的基本流程。
2. 硬件选型与电路设计
2.1 Si4731收音芯片特性解析
Si4731是一款高度集成的数字收音芯片,具有以下关键特性:
- 支持FM频段(64-108MHz)和AM频段(520-1710kHz)
- 数字信号处理(DSP)架构,提供优异的接收性能
- I2C控制接口,方便与微控制器通信
- 内置低噪声放大器(LNA)和自动增益控制(AGC)
- 支持RDS(Radio Data System)功能
在实际电路设计中,Si4731需要连接天线、音频输出和微控制器。天线输入端建议使用75Ω同轴电缆连接,并添加适当的匹配电路。音频输出可以直接驱动耳机或连接功放电路。
2.2 PIC18F97J94微控制器配置
PIC18F97J94是一款高性能8位MCU,特别适合这个项目:
- 64MHz工作频率,128KB闪存
- 丰富的外设:I2C、SPI、UART等
- 低功耗特性(XLP技术)
- 100引脚TQFP封装,提供足够的IO资源
在项目中,我们将使用PIC18F97J94的以下功能:
- I2C接口与Si4731通信
- GPIO连接按键和LED显示
- 内置ADC用于音量调节
- 定时器用于扫描电台
提示:PIC18F97J94的I/O电压为3.3V,而Si4731也是3.3V器件,这简化了电平匹配设计。
3. 系统硬件搭建
3.1 原理图设计要点
完整的收音系统原理图应包括以下部分:
- 电源电路:3.3V稳压,建议使用低压差线性稳压器(LDO)
- Si4731核心电路:包括晶振、天线接口、音频输出
- PIC18F97J94最小系统:复位电路、编程接口
- 用户界面:按键、旋钮、显示屏
- 音频放大电路:可选,取决于输出需求
关键连接:
- Si4731的SCL/SDA连接到PIC的I2C引脚
- Si4731的RESET引脚连接到PIC的GPIO
- 音频输出通过电容耦合到功放或耳机接口
3.2 PCB布局注意事项
收音机对噪声敏感,PCB布局需特别注意:
- 将模拟部分(射频和音频)与数字部分分开
- 电源走线要足够宽,并添加去耦电容
- 天线输入走线尽量短,并做50Ω阻抗匹配
- 晶振靠近芯片放置,周围避免高速信号线
4. 软件开发与编程
4.1 开发环境搭建
我们将使用MPLAB X IDE和XC8编译器进行开发:
- 安装MPLAB X IDE v5.50或更高版本
- 安装XC8编译器(免费版足够用于此项目)
- 配置PICkit或ICD编程器
- 新建项目,选择PIC18F97J94器件
4.2 Si4731驱动开发
Si4731通过I2C接口控制,基本操作流程:
- 初始化I2C外设(400kHz标准模式)
- 发送复位脉冲(拉低RESET引脚至少1ms)
- 等待Si4731就绪(约20ms)
- 发送初始化命令序列
关键寄存器配置示例:
// 设置FM频段 void Si4731_SetFM() { I2C_Start(); I2C_Write(0x22); // Si4731写地址 I2C_Write(0x01); // POWER_UP命令 I2C_Write(0x50); // FM接收模式 I2C_Stop(); }4.3 用户界面实现
典型的收音机功能应包括:
- 频道扫描和存储
- 音量控制
- 频率显示
- 预设频道调用
这些功能可以通过几个按键和旋转编码器实现。例如:
// 处理旋钮输入 void HandleEncoder() { if(ENC_A != ENC_A_LAST) { if(ENC_B != ENC_B_LAST) { // 顺时针旋转 CurrentFreq += FreqStep; } else { // 逆时针旋转 CurrentFreq -= FreqStep; } Si4731_SetFreq(CurrentFreq); } ENC_A_LAST = ENC_A; ENC_B_LAST = ENC_B; }5. 系统调试与优化
5.1 常见问题排查
在开发过程中可能会遇到以下问题:
收不到电台信号:
- 检查天线连接
- 确认频段设置正确
- 测量Si4731电源电压
I2C通信失败:
- 用示波器检查SCL/SDA信号
- 确认上拉电阻值(通常4.7kΩ)
- 检查器件地址(0x22/0x23)
音频噪声大:
- 检查电源滤波
- 确保模拟地和数字地单点连接
- 音频走线远离数字信号
5.2 性能优化技巧
提升收音质量的方法:
- 实现自动增益控制(AGC)算法
- 添加软件消噪滤波器
- 优化频道扫描算法
- 实现信号强度指示(RSSI)
例如,可以通过读取Si4731的RSSI值来优化接收:
uint8_t GetRSSI() { I2C_Start(); I2C_Write(0x22); I2C_Write(0x23); // FM_TUNE_STATUS命令 I2C_Write(0x00); // 参数1 I2C_Stop(); I2C_Start(); I2C_Write(0x23); // Si4731读地址 uint8_t rssi = I2C_Read(0); // 读取RSSI值 I2C_Stop(); return rssi; }6. 功能扩展与进阶应用
6.1 RDS数据解码
Si4731支持RDS(Radio Data System),可以获取电台名称、节目类型等信息。实现RDS解码需要:
- 启用Si4731的RDS功能
- 定期读取RDS数据寄存器
- 解析RDS数据块
- 显示电台信息
6.2 添加存储功能
利用PIC18F97J94的内部EEPROM存储预设频道:
- 定义频道数据结构
- 实现EEPROM读写函数
- 添加频道保存/读取功能
示例代码:
#define PRESET_COUNT 10 typedef struct { uint16_t freq; char name[8]; } PresetChannel; void SavePreset(uint8_t index, PresetChannel preset) { uint8_t *p = (uint8_t*)&preset; for(int i=0; i<sizeof(PresetChannel); i++) { EEPROM_Write(index*sizeof(PresetChannel)+i, p[i]); } }6.3 添加LCD显示
使用PIC18F97J94驱动字符或图形LCD显示频率等信息:
- 选择兼容的LCD模块(如HD44780)
- 连接数据线和控制线
- 实现LCD驱动库
- 设计用户界面
7. 实际制作经验分享
在完成这个项目的过程中,我总结了以下几点经验:
天线选择至关重要:FM收音性能很大程度上取决于天线。我尝试了几种方案后,发现1/4波长(约75cm)的拉杆天线效果最好。如果空间有限,可以使用PCB天线,但需要仔细调谐匹配电路。
I2C上拉电阻值需要优化:最初使用10kΩ上拉电阻导致波形上升沿不够陡峭,通信不稳定。改为4.7kΩ后问题解决。建议用示波器观察I2C信号质量。
电源噪声控制:数字电路噪声会影响收音灵敏度。我在Si4731的电源引脚增加了π型滤波电路(10μF钽电容+100nF陶瓷电容),显著降低了背景噪声。
软件去抖动处理:机械按键和编码器需要软件去抖动。我发现20ms的延时去抖效果不错,但旋转编码器需要更精细的处理,最好使用状态机实现。
频率步进设置:FM收音的步进通常为50kHz或100kHz。我发现在信号强的地区可以用50kHz步进精确调谐,而在信号弱的地区100kHz步进更实用。最终我在软件中实现了可切换的步进值。