基于Arduino RDA5807 FM接收器的FM调频广播电路

描述

几乎每个人都使用手机收听音乐、新闻、播客等。但是不久以前,我们都依靠当地的FM广播电台来获取最新的新闻和歌曲,这些广播电台逐渐失去了知名度,但是在互联网出现紧急情况时处于关闭状态时,收音机在将信息传输到用户方面扮演着重要角色。无线电信号始终存在于空中(由电台广播),我们所需要的只是一个FM接收器电路,以捕获这些无线电信号并将其转换为音频信号。

在本篇文章中,我们将制作一个Arduino FM接收器。我们将基于Arduino使用RDA5807 FM接收器IC并对它进行编程,以便播放任何可由用户使用电位计进行调谐的FM广播电台。我们还将使用音频放大器和电路来控制Arduino FM收音机的输出音量,听起来有趣吗?让我们开始吧。

FM调频广播的工作原理

无线电台将电信号转换为无线电信号,并且这些信号在通过天线传输之前必须进行调制。可以调制信号的方法有两种,即AM和FM。顾名思义,调幅(AM)在发送信号之前先对幅度进行调制,而在调频(FM)中,信号的频率要在通过天线发送之前进行调制。在无线电台,它们使用调频来调制信号,然后发送数据。现在,我们需要制作的是一个可以调谐到特定频率的接收器,接收这些信号,然后再将这些电信号转换为音频信号。我们将在本文中使用RDA5807 FM接收器模块,从而简化了电路。

所需组件

●    Arduino Nano开发板

●    RDA5807接收器

●    音频放大器

●    连接线

●    100K电位器

●    面包板

RDA5807接收器

RDA5807是具有完全集成的合成器的单芯片FM立体声无线电调谐器模块。该模块支持全球范围内的50 – 115MHz频带、音量控制和静音,可编程去加重(50 / 75us),接收信号强度指示器和SN​​R,32.768KHz晶体振荡器,数字自动增益控制等。下图显示了RDA5807M调谐器的框图。

Arduino

它具有数字低中频架构,并集成了一个低噪声放大器(LNA),该放大器支持FM广播频段(50至115 MHz)、可编程增益控制(PGA)、高分辨率模数转换器和高保真数模转换器(DAC)。限幅器可防止过载,并限制相邻通道产生的互调产物的数量。 PGA放大混频器输出信号,然后用ADC数字化。 DSP内核管理通道选择、FM解调、立体声MPX解码器和输出音频信号。该IC的RDA5807引脚排列图如下。

Arduino

该模块工作在1.8 – 3.3V的电源。当进入静止状态并选择了控制接口时,模块会在VIO上电时进行复位,并且还支持通过触发02H地址的0到1中的bit1进行软复位。该模块使用I2C通信与MCU进行通信,并且连接以启动条件、命令字节和数据字节开始。 RDA5807具有13个16位寄存器,每个寄存器执行特定功能。寄存器地址以00H开头,该地址分配给芯片ID,以0FH结尾。在所有13个寄存器中,有些位保留,而有些则是R / W。每个寄存器根据分配给它们的位执行诸如改变音量、改变通道等任务。

将模块连接到电路时,由于模块引脚是焊盘形式,我们无法直接使用该模块。因此,我使用一块洞洞板和一些插针,将模块的每个引脚焊接到插针上,如下图所示。

音频放大器

音频放大器是一种电子设备,可将低功率电子音频信号放大到足以驱动扬声器或耳机的电平。我们使用LM386构建了一个简单的音频放大器,其电路如下所示。

Arduino FM接收器电路图

我们使用了两个电位器来调节FM频段和控制音频放大器的音量。要更改音量,您可以改变电位器,电位器连接在LM386的1至8号引脚之间,也可以改变电位器,其连接在LM386的3号引脚之间。下图显示了Arduino FM收音机的完整电路图。

我在放大器上做的一些微小改动。我没有在放大器中使用两个电位器,而是仅使用一个。我用电阻互换了用来改变增益的电位器。因此,现在我们的项目有两个电位器,一个用于调节,另一个用于改变音量。用于调节通道的电位器与Arduino nano连接。电位器的中心引脚连接到Arduino nano的A0引脚,其余两个引脚中的一个连接到5V,另一个连接到GND。另一个电位器用于控制收音机的音量,并按上图所示进行连接。

Arduino的引脚A4和A5连接到RDA5807M的SDA和SCL引脚。请记住,接收器模块只能在3.3V电压下工作。因此,将Nano的3v3引脚连接到接收器模块的VCC引脚。建立连接后,设置如下所示

Arduino FM收音机代码说明

该代码将初始化接收器模块,然后以预设频率设置频道。当nano在A0引脚上读取的值发生变化(通过改变电位器)时,频率也会发生变化,从而改变通道。完整的代码在页面末尾给出。

我们在程序开始时添加与RDA5807通信所需的wire库。然后,定义变量“channel”,设置频道。每当收音机启动时,它都会自动调谐到该频道。

#include

uint16_t channel = 187;

接下来,我们将字节加载到RDA5807 IC上的每个寄存器以设置我们的初始配置。然后,我们复位接收器。

uint8_t boot_config[] = {

/* register 0x02 */

0b11000001,

0b00000011,

/* register 0x03 */

0b00000000,

0b00000000,

/* register 0x04 */

0b00001010,

0b00000000,

/* register 0x05 */

0b10001000,

0b00001111,

/* register 0x06 */

0b00000000,   

0b00000000,

/* register 0x07 */

0b01000010,

0b00000010,

};

复位设备后,我们可以调谐设备。要调整频道,我们只需要编程前4个字节。这部分代码会将频道更改为所需的频率。首先在I2C中,我们开始传输,写入或读取数据,然后结束传输。在该接收器IC中,我们无需指定地址,因为数据表清楚地表明I2C接口具有固定的起始寄存器,即用于写入操作的0x02h和用于读取操作的0x0Ah。

uint8_t tune_config[] = {

/* register 0x02 */

0b11000000,

0b00000001,

/* register 0x03 */

(channel >> 2),

((channel & 0b11) << 6 ) | 0b00010000

};

在setup函数中,我们初始化引导配置,然后通过将调整配置字节写入RDA5807M来调整至通道。

void setup()

{

Serial.begin(9600);

pinMode(A0,INPUT);

/* Conect to RDA5807M FM Tuner: */

Wire.begin();

Wire.beginTransmission(RDA5807M_ADDRESS);

Wire.write(boot_config, BOOT_CONFIG_LEN);

Wire.endTransmission();

Wire.beginTransmission(RDA5807M_ADDRESS);

Wire.write(tune_config, TUNE_CONFIG_LEN);

Wire.endTransmission();

}

当使用电位器调谐到某个频率时,我遇到了一个问题。 A0引脚读取的值不是恒定的。噪声与所需的值成比例。我使用了一个连接在A0和GND之间的0.1uF陶瓷电容器,尽管该噪声已降至最低,但仍未达到所需的水平。因此,我必须对代码进行一些更改。首先,我记下了受噪声影响的读数。我发现噪声的最大值是10。因此,我以这样的方式编写程序,即只有在同一引脚的新值和旧值之间的差大于10时,它才会考虑新值。然后调谐到所需的频道。

void loop()

{

int channel1 =187 ,avg=0, newA;

static int oldA = 0;

int result = 0;

newA = analogRead(A0);

if ((newA - oldA) > 10 || (oldA - newA) > 10){

Serial.println(newA);

if(newA!= oldA){

channel = channel1+(newA/10);

myChangeChannel(channel);

oldA=newA;

}

}

}//loop end

以下函数用于设置tune_config数组的字节,然后使用I2C协议将数据发送到RDA5807M。

void myChangeChannel(int channel){ /* void if nothing is returned else int */

tune_config[2] = (channel >> 2);

tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;

Wire.begin();

Wire.beginTransmission(RDA5807M_ADDRESS);

Wire.write(tune_config, TUNE_CONFIG_LEN);

Wire.endTransmission();

}

Arduino FM收音机的工作过程

当模块上电时,我们的代码会复位RDA5807-M并将其设置为所需用户的通道(注意:该频率被视为将增加频率的基准频率)。通过更改电位器(连接到A0),Arduino Nano读取的值会更改。如果新值和旧值之间的差大于10,我们的代码将考虑该新值。根据新值与旧值之间的变化来更改通道。增大或减小音量取决于连接在引脚3和GND之间的电位器。

电路搭建和代码编写完成后,您将拥有自己的FM收音机。希望您喜欢本篇文章并学到一些有用的东西。
编辑:hfy

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
jf_00451303 2022-10-21
0 回复 举报
你好!可以分享一下原理图吗 收起回复
購濕繛獻 2021-05-23
0 回复 举报
你好,那个rda库文件安装后Wire.beginTransmission(RDA5807M_ADDRESS);这里总是报错,请能帮我解决一下吗 收起回复

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分