[arduino|module]TEA5767调频收音模块测试(视频)

Photobucket

TEA5767 是常用的调频FM收音模块,价钱也蛮便宜,一般也就是五六块钱的样子,多用于mp3/mp4中,比起过去模拟的收音机,数字收音机只需要这么一片小小的模块,是不是很神奇呀?本文就介绍个人使用arduino对TEA5767进行测试的一点心得。

Photobucket

TEA5767 使用I2C总线驱动,其7位地址码为0x60,市面上常用的模块基本都做成邮票样子的封装。感谢由圣源电子提供的模块基板,可以让各个引脚通过杜邦线就能与Arduino实现连接。引出的接线柱把输入和输出分开,一边是电源和I2C控制引脚,另一边是音频信号输出和天线。

Photobucket

图片中,1604液晶屏的显示内容,第1行显示依次为通过I2C总线发送的5个字节(十六进制显示),第2行显示为从TEA5767返回的5个字节。具体的意义可参考datasheet。第4行显示是根据模块参数计算出的频率值。

有以下心得:

  1. 模块输出的音频信号很弱,无法直接驱动耳机,需要外接功放(有源音箱,“有源”的意思,就是内部有功放);
  2. 天线还是蛮重要的,虽然接收部分频率的时候,并不需要天线,甚至加天线还有反效果,但是大多数电台都需要接天线才能获得比较好的收听效果,长度、朝向都有一定的影响;
  3. 频率计算公式还是有点玄机;
  4. 市区内高楼林立,室内测试这个模块可能效果不会尽如人意;

频率计算方面,大多数的计算方法,都是从目标频率值换算出模块参数,精度的损失比较严重,还有一定的偏差。而在实测中发现,寄存器的控制精度,可以达到1/122MHz,也就是说,可调节出98.73这样的频率是没有问题的,我使用公式:

word freq = 0x2eef;
word mhz = round((float)freq / 1.22 + 23.);
value_input[0] = highByte(freq);
value_input[1] = lowByte(freq);

从模块参数换算出对应频率,这个公式是通过本地能收听到的17个电台,列表拟合直线获得。

同理,可使用公式

word freq_name = 9870; 
word freq = (word)((freq_name - 23.) * 1.22);

通过模块参数来计算出实际频率值。得出的mhz的值为整数,98.70MHz对应其的数值为9870。在单片机系统中,尽量避免复杂的浮点数运算。

Photobucket

在测试中,还发现TEA5767的自动搜台有点不靠谱。自动搜台的主要依据是频率的ADC电平值(在第4位接收字节的高4位显示,范围为0-15,0x0-0xf),如果目标频率大于阀值(可以自己设置,可为0x05, 0x07, 0x0a),则提示搜到电台。在自动搜台中,阀值设得太低,可能还未达到最优值就提示搜到台,阀值设置太高又搜不到几个台,漏台现象严重。而且部分电台,耳朵听感觉很清晰,而ADC的值又未必很高。作为初级的FM模块,其实也不太指望他们搜台很准,但是为了放出TEA5767实际的收听效果,我还是使用手动调节的方式进行测试。

在Arduino平台上,借助Wire类库,可以非常简单地驱动使用I2C总线的元器件。核心代码如下(不含显示、编码开关部分),可直接复制进 ADE 编译下载,我自己用的版本是1.0.1。


// Test TEA5767 FM Radio Module on Arduino
// description: http://aguegu.net/?p=1137
// author: Weihong Guan / aGuegu
// created on: 2012-07-17
 
#include "Wire.h"

void readfromWire(int device, int count, byte * p);

void setup()
{
	byte value_input[5] = { 0x00, 0x00, 0xc0, 0x32, 0x00 };
	byte value_output[5];

	word freq_name = 9870; //目标频率值 * 100
	word freq = (word)((freq_name - 23.) * 1.22);
	value_input[0] = highByte(freq);
	value_input[1] = lowByte(freq);

	Wire.begin();
	Wire.beginTransmission(0x60);
	Wire.write(value_input, 5);
	Wire.endTransmission();

	word mhz = round((float)freq / 1.22 + 23.);

	readfromWire(0x60, 5, value_output);		
}

void loop()
{
		
}

void readfromWire(int device, int count, byte * p)
{
	Wire.requestFrom(device, count);

	while (Wire.available())
	{
		*(p++) = Wire.read();
	}
}

在实测过程中,个人感觉模块内部的波段选择(欧美模式为87.5-91.0MHz,日本模式为76M-108MHz)对于手动调台没有什么影响,可能只是对自动搜台的一个边界限制。我认为用于接收一般波段外的节目(比方说校园广播)也是没问题的,我有左右都手动搜一遍,不过还真没收到什么台,希望在校园内的朋友可以测试一下,应该是可以的。在视频中也可以听到看到实际的调台过程和收听效果,不差哦。

视频介绍:

附:福州地区调频电台表

Freq(mHz) hex dec adc radio
87.6 29a3 10659 13 福州交通之声
89.3 2a72 10866 13 福州音乐频道
90.1 2ad4 10964 12 福州左海之声
90.6 2b11 11025 11 海峡之声汽车生活广播
91.3 2b65 11109 7 福建汽车音乐调频
92.6 2c05 11269 9 中央人民广播电台音乐之声
93.5 2c76 11382 9 中央人民广播电台中国之声
94.4 2ce0 11488 15 福州广播新闻台
94.9 2d1e 11550 10 无台,但是信号很强,静音信号
96.1 2db1 11697 7 福建经济电台
98.7 2eef 12015 11 福建都市生活广播
99.6 2f5b 12123 12 海峡之声巴士广播网
100.7 2fe2 12258 6 福建交通广播
102.3 30a1 12449 11 中华之声
103.6 3144 12612 12 福建新闻广播
104.7 31c9 12745 7 福州新闻综合广播
106.2 327d 12925 11 福州广播新闻台
107.1 32ef 13039 13 中国华艺广播

参考链接:TEA5767 数据手册(英文)

市面上的 TEA5767 模块还分简化版和完整版,个人感觉简化版的收听效果还更好些。

特别感谢:圣源电子微笑的Rockets严泽远

关于aGuegu

向着更高的逼格
此条目发表在模块分类目录,贴了, , , , , , , , 标签。将固定链接加入收藏夹。