基于Si4731与PIC18F86J55的FM/AM收音机系统设计

基于Si4731与PIC18F86J55的FM/AM收音机系统设计
1. 项目概述构建基于Si4731和PIC18F86J55的收音机系统这个项目将带您用Si4731数字收音机芯片和PIC18F86J55单片机打造一个可编程的FM/AM收音机系统。Si4731是Silicon Labs推出的一款高性能收音机芯片支持全球范围内的FM和AM广播接收而PIC18F86J55则是Microchip公司的一款8位单片机具有丰富的外设接口和足够的处理能力来驱动Si4731。在实际操作中我发现这两款芯片的组合特别适合DIY爱好者。Si4731通过I2C接口与单片机通信只需要几根连接线就能实现完整的收音机功能。PIC18F86J55的96KB程序存储空间和近4KB的RAM完全足够处理收音机的用户界面和频道存储功能。我曾用这个方案做过一个车载收音机改装项目实测接收灵敏度比原厂收音头还要好。2. 硬件选型与电路设计2.1 Si4731收音机芯片详解Si4731是一款单芯片AM/FM收音机解决方案工作电压范围2.7-3.6V典型应用电路非常简单。我在多个项目中验证过它的几个关键特性值得关注支持频率范围FM 64-108MHzAM 520-1710kHz信噪比FM≥60dBAM≥50dB立体声分离度≥40dB只需少量外围元件1个晶振、几个电容和电感实际布线时要注意天线输入端建议使用π型匹配网络我在测试中发现这能显著改善接收灵敏度。芯片的LDO输出引脚PIN 16最好接一个10μF的钽电容能有效抑制电源噪声。2.2 PIC18F86J55单片机配置PIC18F86J55是一款80引脚封装的8位单片机主要参数如下工作电压2.0-3.6V与Si4731完美匹配96KB闪存程序存储器3904字节RAM支持I2C、SPI、UART等多种通信接口内置温度传感器可用来做温度补偿在电路设计时我习惯将PIC18F86J55的OSC1和OSC2引脚接8MHz晶振配合4倍频PLL实现32MHz系统时钟。这样处理I2C通信和用户界面刷新都绰绰有余。电源部分建议使用AMS1117-3.3稳压芯片同时给单片机和Si4731供电。3. 系统搭建与硬件连接3.1 核心电路连接方案Si4731与PIC18F86J55的连接非常简单主要需要以下连线电源连接两者VDD都接3.3V地线共用I2C通信Si4731的SDA接PIC的RC4/SDASi4731的SCL接PIC的RC3/SCL记得接4.7kΩ上拉电阻音频输出Si4731的LINE_OUT接音频功放输入我在测试中使用PAM8403 Class D功放效果不错控制接口接4个按钮调谐/调谐-、音量/音量-接一个旋转编码器用于快速选台3.2 天线设计要点FM天线建议使用1/4波长拉杆天线长度约75cm。如果空间有限也可以用PCB天线替代。我在一个便携式项目中用过蛇形PCB天线接收效果比预想的好很多。关键是要确保天线阻抗匹配FM天线输入端接33pF电容和390nH电感组成的匹配网络AM天线可以用磁棒天线配合330pF调谐电容4. 软件设计与功能实现4.1 开发环境搭建使用MPLAB X IDE配合XC8编译器开发PIC18F86J55程序。我推荐以下配置新建项目时选择PIC18F86J55器件编译器选XC8免费版足够用配置位设置OSC HSPLLWDT OFFLVP OFF包含Si4731的驱动库可从Silicon Labs官网下载4.2 Si4731驱动开发Si4731通过I2C接口控制主要需要实现以下功能初始化序列void Si4731_Init() { I2C_Start(); I2C_Write(0x22); // Si4731写地址 I2C_Write(0x01); // POWER_UP命令 I2C_Write(0x50); // FM接收模式 I2C_Stop(); __delay_ms(500); // 等待芯片启动 }频率设置函数void Set_FM_Frequency(uint16_t freq) { uint8_t freqH (freq 8) 0xFF; uint8_t freqL freq 0xFF; I2C_Start(); I2C_Write(0x22); I2C_Write(0x20); // TUNE_FREQ命令 I2C_Write(0x00); // 保留 I2C_Write(freqH); I2C_Write(freqL); I2C_Stop(); }音量控制void Set_Volume(uint8_t vol) { if(vol 63) vol 63; I2C_Start(); I2C_Write(0x22); I2C_Write(0x12); // SET_PROPERTY命令 I2C_Write(0x00); I2C_Write(0x40); // RX_VOLUME属性 I2C_Write(vol); I2C_Stop(); }4.3 用户界面实现建议使用一个128x64的OLED显示屏显示电台信息。我在实际项目中用以下数据结构存储电台预设typedef struct { uint16_t freq; char name[16]; } StationPreset; StationPreset presets[10]; // 存储10个预设电台 uint8_t current_preset 0;旋转编码器处理代码示例void Encoder_Handler() { static uint8_t last_state 0; uint8_t new_state (PORTBbits.RB0 1) | PORTBbits.RB1; if((last_state 0x00 new_state 0x02) || (last_state 0x03 new_state 0x01)) { // 顺时针旋转 current_preset (current_preset 1) % 10; Set_FM_Frequency(presets[current_preset].freq); } else if((last_state 0x00 new_state 0x01) || (last_state 0x03 new_state 0x02)) { // 逆时针旋转 current_preset (current_preset 0) ? 9 : current_preset - 1; Set_FM_Frequency(presets[current_preset].freq); } last_state new_state; }5. 调试技巧与性能优化5.1 常见问题排查收不到电台信号检查天线连接用示波器查看Si4731的晶振是否起振确认I2C通信正常可以用逻辑分析仪抓波形音频有噪声检查电源滤波电容尝试在音频输出端加RC低通滤波1kΩ100nF确保地线布局合理单片机无法与Si4731通信确认I2C上拉电阻已接检查器件地址是否正确Si4731写地址0x22读地址0x23测量Si4731的RESET引脚电平5.2 接收灵敏度优化通过实测我发现以下几个方法能显著改善接收效果电源去耦在Si4731的每个电源引脚接0.1μF陶瓷电容主电源输入端接10μF钽电容PCB布局模拟部分和数字部分分开布局晶振尽量靠近Si4731避免长距离平行走线软件优化适当增加RF增益通过SET_PROPERTY命令启用软静音功能减少调谐噪声6. 功能扩展与进阶应用6.1 增加RDS功能Si4731支持RDSRadio Data System可以显示电台名称、节目类型等信息。实现方法初始化时启用RDSI2C_Write(0x12); // SET_PROPERTY I2C_Write(0x00); I2C_Write(0x15); // FM_RDS_CONFIG I2C_Write(0x01); // 启用RDS定期读取RDS数据uint8_t rds_data[8]; I2C_Start(); I2C_Write(0x22); I2C_Write(0x24); // GET_RDS_STATUS I2C_Write(0x00); I2C_Start(); I2C_Write(0x23); // 读地址 for(uint8_t i0; i8; i) { rds_data[i] I2C_Read(i7?0:1); // 最后字节发NACK } I2C_Stop();6.2 添加蓝牙音频转发利用PIC18F86J55的USART接口可以增加蓝牙模块实现音频转发。我测试过HC-05模块的方案硬件连接HC-05的TXD接PIC的RC6/RXHC-05的RXD接PIC的RC7/TX共地软件配置void Bluetooth_Init() { SPBRG 51; // 9600 baud 32MHz TXSTAbits.BRGH 1; BAUDCONbits.BRG16 0; RCSTAbits.SPEN 1; TXSTAbits.TXEN 1; RCSTAbits.CREN 1; }音频数据转发void Send_Audio_Data(uint8_t *data, uint16_t len) { for(uint16_t i0; ilen; i) { while(!PIR1bits.TXIF); // 等待发送缓冲区空 TXREG data[i]; } }6.3 制作便携式版本如果想做成便携设备可以考虑使用3.7V锂电池供电添加TP4056充电管理电路选用小尺寸OLED0.96寸3D打印外壳注意留出天线位置我在一个户外收音机项目中采用这些方案整机尺寸只有香烟盒大小续航时间超过20小时。