何乃味
(柳州職業技術學院, 柳州 545006)
?

何乃味
(柳州職業技術學院, 柳州 545006)
介紹一種以低功耗單片機ATmega8L為控制核心,以RDA5807P芯片作為FM接收器的調頻收音機。該收音機通過單片機ATmega8L的I2C總線接口讀寫RDA5807P收音模塊的數據,用按鍵及紅外遙控器進行搜臺、音量調節等操作。用LCD顯示接收頻道的頻率,當前音量大小等信息。設計中給出了實現FM調頻收音機的硬件電路、讀/寫RDA5807P收音模塊及紅外遙控解碼程序的思路。經多次比對測試,該收音機可以清晰、穩定地收聽省府及本地發射的所有調頻電臺。
AVR單片機;調頻立體聲收音機;I2C總線;紅外遙控
早期的數字FM處理芯片TEA5767[3-4]由Philips公司開發并被廣泛地使用,但該芯片需要外加音頻放大電路才能驅動耳機。鑒于此,國內銳迪科微電子公司獨立開發了一顆具備高接收靈敏度的FM立體聲數字芯片RDA5807P,具有自動搜臺、重低音、靜音、休眠、直接驅動耳機等優異的性能。本文介紹用RDA5807P芯片設計和制作了一款帶遙控功能的收音機。
收音機的總體設計框圖如圖1所示。本收音機采用單節3.7 V、容量1500 mAh的鋰電池作為電源,在使用壽命期內可以用手機充電器反復對它進行充電,使用非常方便。采用低功耗的AVR單片機ATmega8L作為微控制器,負責處理和協調各模塊電路的工作,ATmega8L的工作電壓為2.7 ~5.5 V,片內有512字節的EEPROM,不用專門外接EEPROM芯片就可以將掉電前接收電臺的頻道和音量信息保存起來,重新開機后又可以恢復原來的信息。調頻收音機模塊采用國產芯片RDA5807P加上少量的外圍元件組成,由微控制器通過I2C總線接口對芯片內部寄存器進行寫/讀操作。通過鍵盤或紅外遙控發射器可以進行自動搜臺、手動選臺、音量調節、靜音操作。LCD用于顯示當前收聽電臺的頻率、音量等級等信息。音頻功率放大器放大當前收聽電臺的音頻信號,驅動揚聲器發出聲音。

圖1 收音機總體設計框圖
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 紅外遙控發射模塊電路
軟件程序設計主要包括讀寫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)