AVR单片机的调频立体声收音机设计*
2014-09-06何乃味
何乃味
(柳州职业技术学院, 柳州 545006)
何乃味
(柳州职业技术学院, 柳州 545006)
介绍一种以低功耗单片机ATmega8L为控制核心,以RDA5807P芯片作为FM接收器的调频收音机。该收音机通过单片机ATmega8L的I2C总线接口读写RDA5807P收音模块的数据,用按键及红外遥控器进行搜台、音量调节等操作。用LCD显示接收频道的频率,当前音量大小等信息。设计中给出了实现FM调频收音机的硬件电路、读/写RDA5807P收音模块及红外遥控解码程序的思路。经多次比对测试,该收音机可以清晰、稳定地收听省府及本地发射的所有调频电台。
AVR单片机;调频立体声收音机;I2C总线;红外遥控
引 言
早期的数字FM处理芯片TEA5767[3-4]由Philips公司开发并被广泛地使用,但该芯片需要外加音频放大电路才能驱动耳机。鉴于此,国内锐迪科微电子公司独立开发了一颗具备高接收灵敏度的FM立体声数字芯片RDA5807P,具有自动搜台、重低音、静音、休眠、直接驱动耳机等优异的性能。本文介绍用RDA5807P芯片设计和制作了一款带遥控功能的收音机。
1 收音机总体设计方案
收音机的总体设计框图如图1所示。本收音机采用单节3.7 V、容量1500 mAh的锂电池作为电源,在使用寿命期内可以用手机充电器反复对它进行充电,使用非常方便。采用低功耗的AVR单片机ATmega8L作为微控制器,负责处理和协调各模块电路的工作,ATmega8L的工作电压为2.7 ~5.5 V,片内有512字节的EEPROM,不用专门外接EEPROM芯片就可以将掉电前接收电台的频道和音量信息保存起来,重新开机后又可以恢复原来的信息。调频收音机模块采用国产芯片RDA5807P加上少量的外围元件组成,由微控制器通过I2C总线接口对芯片内部寄存器进行写/读操作。通过键盘或红外遥控发射器可以进行自动搜台、手动选台、音量调节、静音操作。LCD用于显示当前收听电台的频率、音量等级等信息。音频功率放大器放大当前收听电台的音频信号,驱动扬声器发出声音。
图1 收音机总体设计框图
2 系统硬件电路设计
2.1 电源管理模块电路设计
电源管理模块电路如图2所示。LM2054是一款单节锂电池恒流、恒压线性充电芯片,最大充电电流可达到800 mA。它只需外接极少的外部元件,预设4.2 V充电电压,精度达到±1%。充电时,若锂电池电压低于4.2 V,充电指示灯D101亮,充电达到预设值4.2 V后指示灯D101熄灭。
图2 电源管理模块电路
2.2 微控制器及键盘、显示、红外遥控接收电路设计
微控制器及键盘、显示、红外遥控接收电路如图3所示。
图3 微控制器及键盘、显示、红外遥控接收模块电路
键盘K1~K6用于选频、音量调节等。红外遥控接收头连接到单片机ATmega8L的PB0,用单片机的输入捕获功能进行解码。为了减少液晶显示器LCD1602A占用单片机过多的I/O口,数据接口只使用高4位,在写入命令或数据时,分两次写入,先写高4位,再写低4位。为了降低LCD的用电量,LCD的背光灯用单片机的PD3和PC1进行控制,当用户设置好想收听的电台,5 s后LCD背光灯自动熄灭。
2.3 调频收音模块电路设计
调频收音模块电路如图4 所示。RDA5807P是国产的FM立体声收音机接收芯片,加上极少的外围元件且基本不需要校准,通过程序设定即可接收欧洲、美国和日本的调频波段[2-3]。单片机通过I2C总线SCL和SDA将访问RDA5807P芯片所需的地址、命令、数据写入内部的寄存器中,也可以通过该总线读出芯片内部寄存器中的数据,取得接收频道的数据和音量值,供显示使用。RDA5807P的输出经磁珠F301、F302及电容器C303、C304抑制高频干扰后,可以直接驱动32 Ω的耳机发出声音,也可以接到下级音频功放进行放大,推动扬声器发出声音。
图4 调频收音模块电路
2.4 音频功率放大电路设计
图5 音频功率放大器模块电路
2.5 红外发射模块电路设计
红外遥控发射器电路[5]如图6所示。BA5104是一块红外遥控编码芯片,内接有上拉电阻,无键按下时,电路中无电流流通,振荡电路不起振,无遥控编码信号输出。当有某一键按下时,电路产生455 kHz的振荡信号,由BA5104内部电路进行12分频,获得38 kHz的载波信号。此时按键的编码信息和C1、C2引脚的状态信息对38 kHz载波进行编码调制,经15引脚串行输出,由三极管Q501、Q502构成的达灵顿驱动电路放大,经外发射管向空间发射,同时14引脚输出高电平,发射状态指示灯D501点亮。
图6 红外遥控发射模块电路
3 系统软件程序设计
软件程序设计主要包括读写RDA5807P芯片相关的模块程序、频率及音量显示模块程序、按键检测与功能设定模块程序、遥控解码及功能设定模块程序等。本设计选用CodeVisionAVR作为开发软件,软件中集成有LCD1602、I2C总线驱动程序,不用再编写相应的底层函数,使用非常方便。故在此仅介绍RDA5807P芯片工作在RDA5807P 模式及采用I2C总线接口进行搜台的程序设计和红外遥控解码程序的设计。
3.1 搜台程序设计
搜台程序可用硬件模式进行搜台,也可以采用软件模式进行搜台。本文着重介绍硬件模式搜台,软件模式搜台可参照硬件搜台模式进行编程。
I2C总线接口是由START、命令字节、数据字节及每个字节后的ACK及NACK比特、STOP组成。RDA58027P芯片写器件地址为0x20,读器件地址为0x21。RDA5807P芯片内部的I2C总线接口有4个写数据寄存器,其地址分别是0x02、0x03、0x04、0x05。2个读数据寄存器,其地址分别为0x0A、0x0B,每个数据寄存器又分为高字节和低字节。这些数据寄存器的地址是不可见的,不能通过单片机直接对指定地址的数据寄存器进行读/写操作。因此,单片机在发出读/写命令字节后,接下来必须对数据寄存器进行连续地读/写操作。其子程序如下:
//收音模块寄存器连续写操作子程序//
void RDA5807P_write_reg(void){
unsigned char i;
i2c_start();
//发起始信号
i2c_write(RDA5807P_ADDRESS); //写器件地址
for(i=0;i<8;i++) //收音模块连续写操作
{i2c_write(RDA5807P_reg_data[i]);}
i2c_stop(); //发停止信号
}
//收音模块寄存器连续读操作子程序//
void RDA5807P_read_reg(unsigned char *reg_buf){
i2c_start(); // 发起始信号
i2c_write(RDA5807P_ADDRESS|1);
//收音模块连续读操作
reg_buf[0]=i2c_read(1);
//读一个字节数据,返回ACK
reg_buf[1]=i2c_read(1);
//读一个字节数据,返回ACK
reg_buf[2]=i2c_read(1);
//读一个字节数据,返回ACK
reg_buf[3]=i2c_read(0);
//读一个字节数据,返回NO ACK
i2c_stop(); //发停止信号
}
硬件模式搜台程序设计主要是通过调用连续写和连续读操作子程序来对收音模块寄存器进行读/写,其程序流程图如图7所示。
图7 硬件模式搜台程序流程图
根据该流程图编写的子程序如下:
//收音模块硬件模式搜台子程序
void RDA5807P_FM_seek(void){
unsigned int chan,temp;
//reg_data[4]用于保存读取0x0A,0x0B寄 //存器时的数据
unsigned char reg_data[4]={0x00,0x00,0x00,0x00};
RDA5807P_reg_data[3]&=~(1<<4);
//TUNE置0,调谐禁用
RDA5807P_reg_data[0]|=(1<<0);
//SEEK位置1,允许自动搜台
RDA5807P_write_reg(); //调用连续写字节函数
while(0==(reg_data[0]&0x40)){
//等待0x0A寄存器中STC标志置位
delay_ms(20);
RDA5807P_read_reg(reg_data);
//读取0x0A寄存器的状态
}
chan=reg_data[0]&0x03; //获取当前工作频点
chan=reg_data[1]|(chan<<8);
chan=chan<<6;
RDA5807P_reg_data[2]=(chan>>8)&0xff;
//保存当前工作频点
RDA5807P_reg_data[3]=(chan&0xff);
//调用连续写字节函数
temp=(RDA5807P_reg_data[2]<<8)+(RDA5807P_reg_data[3]&0xc0);
temp=temp>>6;
frequency=(unsigned long)(100*temp+87000)/100;
//计算当前频率值并保存
}
3.2 红外遥控解码程序设计
由BA5104的编码格式[5]可知:遥控码的一帧长度为12位,其中包括3位起始码、2位用户码、7位指令码。遥控码的每一帧时间间隔为4T,T=1.6879 ms为一位遥控码的周期。一帧完整的遥控码如图8所示。
图8 一帧遥控码
遥控码中“1”用3T/4的高电平与T/4的低电平表示,“0”用T/4的高电平与3T/4的低电平表示,一位遥控码的波形[6]如图9所示。
图9 一位遥控码
由图9可见,要用单片机来判断遥控发射器发出的是“0”还是“1”,关键是要判断接收脉冲下降沿至上升沿之间的时间。可以采用外部中断法,也可以采用输入捕获功能法[6],本文采用后一种方法。解码的思路是:初始化时,将ATmega8L的ICP1引脚设置为输入状态,下降沿触发,当红外接收头接收到红外遥控信号时,产生下降沿,单片机自动将TCNT1寄存器中的值保存至ICR1寄存器中,在捕获中断服务程序中将ICR1中的值保存至T1中;然后将ICP1设置为上升沿触发,当再次产生捕获中断时,将ICR1中的值保存至T2中,将ICP1设置为下降沿触发,并将TCNT1置0。之后计算出T2-T1的时间并保存至事先开辟的数组中,要注意的是,T2-T1有可能出现负值,此时要将(T2-T1+0xffff)再保存,直到接收完12位数据。ICP1中断服务程序流程图略——编者注。
保存在数组中的数据,当其值为3/4×1.687 9ms≈1 266μs 时,被认为接收到“1”,当其值为1/4×1.687 9 ms≈422 μs时,被认为接收到“0”。由于遥控发射器和单片机所使用的晶振频率与标称值会有一定的偏差,所以在程序中要留有一定的余量。识别“0”和“1”的程序流程图略——编者注。
结 语
经过多次比对测试,该收音机可以清晰、稳定地收听省府及本地所发射的调频电台信号。
[1] 肖慧超,王英坤.基于ARM Cortex-M3内核收音机模块的实现[J].微计算机信息(嵌入式与SOC),2009(25):125-126.
[2] 蓝土庆,黄春贵.基于单片机和TEA5767HN的FM收音机系统的设计[J].现代电子技术,2011(34):181-183.
[3] 芦贶.基于TEA5767的USB调频收音机设计[J].深圳职业技术学院学报,2010(9):12-17.
[4] 林锋,孙军. 采用TEA5767的调频收音电路设计[J].电声技术,2005(4):34-37.
[5] 包书祥. 8通道红外遥控集成电路BA5104/SM5032C[J].电子制作,2005(7):43-44.
[6] 何乃味. 红外遥控芯片BA5104的软件解码方法探讨[J].电子设计工程,2012(20):16-18.
[7] 马潮. AVR单片机嵌入式系统原理与应用实践[M].北京:北京航空航天大学出版社,2007.
何乃味(讲师),研究方向为电子技术应用与嵌入式系统应用。
He Naiwei
(Liuzhou Vocational&Technical College,Liuzhou 545006,China)
This article describes a kind of FM radio which its controlling core is a low-power microcontroller ATmega8L and the MCU’s receiver is RDA5807P chip . The radio can read and write RDA5807P radio module through the I2C data interface of by the microcontroller ATmega8L .The radio can conduct search, volume control and other operations with buttons , LCD displays the frequency receiver channels and the current volume size and other information.The design are gives the realization FM radio hardware circuit, the read / write RDA5807P radio module and an infrared remote control decoding program ideas. After several comparison tests, the results show that the radio can be listened to all the FM radio that provincial and local emission clearly and stably.
AVR MCU; FM stereo radio; I2C; infrared remote control
广西教育厅2013年科研立项项目(项目编号:2013LX224)。
TIP216
A
迪娜
2014-01-06)