dcui 发表于 2015-12-6 12:46:58

调频收音模块TEA5767,用arduino控制,请教!!

本帖最后由 dcui 于 2015-12-18 07:25 编辑

我买的TEA5767模块,想做个调频收音机,如图

调频收音模块TEA5767,用arduino控制
电路图如图

调频收音模块TEA5767,用arduino控制

arduino的测试 代码如下:

#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/*1602液晶与UNO连接引脚
LiquidCrystal lcd(rs, enable,d4,d5,d6,d7)*/
unsigned int PLL;
int frey=107.1;
unsigned buffer={0x00,0x00,0xB0,0x10,0x00};
voidsetup() {
Wire.begin();
set_frey();//向TEA5767向频率
lcd.begin(16, 2);
delay(1);
frey_lcd();
}

void loop() {

}

///----------TEA5767相关程序模块--------/////
void set_frey(){//向TEA5767写频率数据
PLL=4*(frey*1000000+225000)/32768;
buffer=PLL>>8;
buffer=PLL & 0xFF;
delay(50);
Wire.beginTransmission(0xc0);
for(byte i=0;i< 5;i++) {
    Wire.write(buffer);
}
Wire.endTransmission();
delay(50);
}

void frey_lcd(){
Wire.requestFrom(0xc1,5);
// if(Wire.available()){
   for(byte i=0;i<5;i++){
    buffer=Wire.read();
    }
    frey=(((buffer&0x3f)<<8)+buffer)*32768/4-225000;
   lcd.print(" FM");
lcd.print(frey/1000000);
   
//}
}
写入arduino后,收不到电台,1602显示为FM0。
请高手帮忙看一看,哪里出问题!
有哪个高手能给一个自动搜台的完整程序吗?
以下是更新!!!(10楼有更新)
/////////////////////////////以下是用TEA5767的库文件编写的程序////////////////
因为这些天身体不舒服,还没有调试!大家帮忙测试一下!!修改完善一下。谢谢!!



/*设想:有2个按钮,一个按钮是搜台并自动存台;另一个按钮读台,把搜到的保存的电台读出来播放,按一下读一个台,再按一下读下一个保存的电台。搜索按钮接D5,下一个电台按钮(读台按钮)接D6*/
#include <LiquidCrystal.h>
#include <TEA5767N.h>
#include <Wire.h>
#include <stdlib.h>
#include <EEPROM.h>

TEA5767N radio = TEA5767N();
// LiquidCrystal lcd(RS, E, D10, D9, D8, D7);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
byte scan_pin=5, next_adj=6;//搜索按钮接D5,下一个电台按钮(读台按钮)接D6
byte isBandLimitReached = 0;

byte pressBtnSum=0;//下一电台按键次数累加
byte keyval_next=0;//按键按下为1,否则为0
//byte old_keyval_next=0;
//byte old_keyval_scan=0;
byte keyval_scan=0;//按键按下为1,否则为0
byte SaveedStationSum =0;
unsigned long starttime=0;//
bool saved=0;//当前播放的电台是否保存

void setup() {
pinMode(scan_pin,INPUT);
pinMode(next_adj,INPUT);//
Wire.begin();
lcd.begin(16, 2);
lcd.clear();

radio.mute();
loadstation(0);
radio.turnTheSoundBackOn();
radio.setSoftMuteOn();
radio.setStandByOff();
loadstation(0);
printSelectedFrequency(loadstation(0));
SaveedStationSum = EEPROM.read(0);
}
void loop(){
//检测(next下一电台)按钮是否按下
keyval_next=digitalRead(next_adj);
if((keyval_next==HIGH) {
        delay(20);//延时消抖
        if((keyval_next==HIGH){
        pressBtnSum+=1;
        saved=0;//电台保存状态置为未保存
        if(pressBtnSum> SaveedStationSum){
pressBtnSum=1;
}
loadstation(pressBtnSum);
printSelectedFrequency(loadstation(pressBtnSum));
starttime=millis();//暂存最后一次按钮按下的开始时间(ms)
}
}
//如果播放10秒,则把当前播放的电台频率状态保存
if((millis()-starttime)>10000){
if(saved==0){
saveStation(radio.readFrequencyInMHz(),0);
saved=1;//置电台保存状态为1,为保存状态
}
}
//检测scan按钮是否按下
keyval_scan= digitalRead(next_adj);
if((keyval_scan==HIGH) {
        delay(20);//延时消抖
        if((keyval_scan==HIGH) {
ScanSaveStation();

}

//读电台频率。0存放搜索电台总数;1、2位存当前的播放电台(n=0);3、4位存第1个搜索到的电台频率(n=1),以此类推
void loadstation(byte n){
byte intStation, floatStation;
float station;

intStation = EEPROM.read(2*n+1 );
floatStation = EEPROM.read(2*n +2);

if (intStation != 0xFF) {
    station = (intStation*1.0)+(floatStation*0.1);
    radio.selectFrequency(station);
printSelectedFrequency(radio.readFrequencyInMHz());
}
}
//显示电台频率
void printSelectedFrequency(float station){
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("FM");
lcd.print(station,1);
lcd.print("MHz");
}
/*/自动搜索并保存电台频率。0位存放搜索电台总数;1、2位存当前播放电台;3、4位存第1个搜索到的电台频率,以此类推*/
void ScanSaveStation(){
byte ScanStationSum=0; //已存的电台总数
radio.setSearchMidStopLevel();
//radio.setSearchHighStopLevel();
radio.selectFrequency(88.0);
isBandLimitReached = radio.startsSearchMutingFromBeginning();
float freq = radio.readFrequencyInMHz();
/*第1个搜索到的电台,存到EEPROM中的第3、4位*/
saveStation(freq,1);
printSelectedFrequency(freq);
lcd.print("S1");
ScanStationSum=1;
delay(500);
while(!isBandLimitReached){
isBandLimitReached=radio.searchNextMuting();
freq = radio.readFrequencyInMHz();
ScanStationSum+=1;
saveStation(freq, ScanStationSum);
printSelectedFrequency(freq);
lcd.print("S");
lcd.print(ScanStationSum);
delay(500);
}
//把搜索到的电台总数存到EEPROM中的第0位。
EEPROM.write(0, ScanStationSum);
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("StationSum:");
lcd.print(ScanStationSum);
delay(500);
}

//存电台到EEPROM
voidsaveStation(float station,byte n){
float aux;
byte byteValue;

byteValue = (byte) floor(station);
EEPROM.write(2*n+1, byteValue);
aux = station - floor(station);
aux *= 10.0;
if (aux > 5.0) {
    byteValue = byte(aux);
    if ((((float)byteValue) - aux) > 0.1) {
      byteValue--;
    } else if ((aux - ((float)byteValue)) > 0.1) {
      byteValue++;
    }
} else {
    byteValue = (int) ceil(aux);
}
EEPROM.write(2*n+2, byteValue);
}

zoologist 发表于 2015-12-6 21:00:23

淘宝搜这个模块的卖家

有 arduino版的

另外我记得这个模块有专门的库,你可以搜一下

dcui 发表于 2015-12-7 10:36:02

问题找到了!是这个出问题:int frey=107.1;
应该改为float frey=107.1;
原来用整型数据,导致频率计算错误,而收不到台!现在可以收到台了。
我想做一个能自动搜台,存台的收音机,存台可以存在arduino的EEprom中
有谁有资料可以共享一下?

darkorigin 发表于 2015-12-10 00:37:13

搜台的代码你有么?
有搜台的代码
可以用FOR来遍历各频率 找到高信噪比的频率
然后写EEPROM即可EEPROM可以用2个字节来存频率

tianjiwen 发表于 2015-12-12 00:16:31

我用你程序1602怎么没显示

dcui 发表于 2015-12-14 14:33:19

tianjiwen 发表于 2015-12-12 00:16 static/image/common/back.gif
我用你程序1602怎么没显示

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/*1602液晶与UNO连接引脚
LiquidCrystal lcd(rs, enable,d10,d9,d8,d7)*/
看一看接线是否有错?,要按上面的正确接线!

dcui 发表于 2015-12-15 11:11:11

zoologist 发表于 2015-12-6 21:00 static/image/common/back.gif
淘宝搜这个模块的卖家

有 arduino版的


谢谢,现在找到TEA5767的库了!!正在研究。

yuqingshan 发表于 2015-12-15 15:30:01

谢谢楼主分享资源。
楼主,用Arduino1.5.6-r2编译出现错误:
sketch_dec15a.ino: In function 'void set_frey()':
sketch_dec15a:30: error: call of overloaded 'write(unsigned int )' is ambiguous
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:60: note: candidates are: virtual size_t TwoWire::write(uint8_t) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:69: note:               size_t TwoWire::write(long unsigned int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:70: note:               size_t TwoWire::write(long int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:71: note:               size_t TwoWire::write(unsigned int) <near match>
D:\Arduino\hardware\arduino\avr\libraries\Wire/Wire.h:72: note:               size_t TwoWire::write(int) <near match>
sketch_dec15a.ino: In function 'void frey_lcd()':
sketch_dec15a:40: error: incompatible types in assignment of 'int' to 'unsigned int '

感觉可像库文件Wire.h有些问题,有什么好支招?

dcui 发表于 2015-12-17 09:16:51

yuqingshan 发表于 2015-12-15 15:30 static/image/common/back.gif
谢谢楼主分享资源。
楼主,用Arduino1.5.6-r2编译出现错误:
sketch_dec15a.ino: In function 'void set_ ...

unsigned int 这个错了吧!

dcui 发表于 2015-12-17 20:36:20

本帖最后由 dcui 于 2015-12-17 20:48 编辑

一个按钮自动搜台存台,另一个按钮能够读取保存的电台。
正在测试!自动搜台没问题,测试时最多能收到34个台。但读台有问题,不能全部读出,
不知是存台还是读台的问题,正在查。高手们也帮忙一下。完善一下。
代码如下:#include <LiquidCrystal.h>
#include <TEA5767N.h>
#include <Wire.h>
#include <stdlib.h>
#include <EEPROM.h>

TEA5767N radio = TEA5767N();
// LiquidCrystal lcd(RS, E, D10, D9, D8, D7);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
byte scan_pin=5, next_adj=6;// 搜索按钮接D5,下一个电台按钮(读台按钮)接D6
byte isBandLimitReached = 0;

byte pressBtnSum=0;//下一电台按键次数累加
byte keyval_next=0;//按键按下为1,否则为0
//byte old_keyval_next=0;
//byte old_keyval_scan=0;
byte keyval_scan=0;//按键按下为1,否则为0
byte SaveedStationSum =0;
unsigned long starttime=0;//
bool saved=0;//当前播放的电台是否保存

void setup() {
pinMode(scan_pin, INPUT_PULLUP); //使用内部上拉电阻,按钮接地
pinMode(next_adj, INPUT_PULLUP);
Wire.begin();
lcd.begin(16, 2);
lcd.clear();

radio.mute();
loadstation(0);
radio.turnTheSoundBackOn();
radio.setSoftMuteOn();
radio.setStandByOff();
loadstation(0);
printSelectedFrequency(radio.readFrequencyInMHz());
SaveedStationSum = EEPROM.read(0);
}
void loop(){
//检测(next下一电台)按钮是否按下
keyval_next=digitalRead(next_adj);
if(keyval_next==LOW) {
delay(20);//延时消抖
if(keyval_next==LOW){
    pressBtnSum+=1;
saved=0;//电台保存状态置为未保存
if(pressBtnSum> SaveedStationSum){
pressBtnSum=1;
}
loadstation(pressBtnSum);
printSelectedFrequency(radio.readFrequencyInMHz());
starttime=millis();//暂存最后一次按钮按下的开始时间(ms)
}
}
//如果播放10秒,则把当前播放的电台频率状态保存
if((millis()-starttime)>10000){
if(saved==0){
saveStation(radio.readFrequencyInMHz(),0);
saved=1;//置电台保存状态为1,为保存状态
}
}
//检测scan按钮是否按下
keyval_scan= digitalRead(scan_pin);
if(keyval_scan==LOW) {
delay(20);//延时消抖
if(keyval_scan==LOW) {
ScanSaveStation();
}
}
}
//读电台频率。0存放搜索电台总数;1、2位存当前的播放电台(n=0);3、4位存第1个搜索到的电台频率(n=1),以此类推
void loadstation(byte n) {
byte intStation, floatStation;
float station;
    intStation = EEPROM.read(2*n+1 );
floatStation = EEPROM.read(2*n +2);
    if (intStation!= 0xFF) {
    station = (intStation*1.0)+(floatStation*0.1);
    radio.selectFrequency(station);
printSelectedFrequency(radio.readFrequencyInMHz());
}
}
//显示电台频率
void printSelectedFrequency(float station){
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("FM");
lcd.print(station,1);
lcd.print("MHz");
}
/*/自动搜索并保存电台频率。0位存放搜索电台总数;1、2位存当前播放电台;3、4位存第1个搜索到的电台频率,以此类推*/
void ScanSaveStation(){
byte ScanStationSum=0; //已存的电台总数
radio.setSearchMidStopLevel();
//radio.setSearchHighStopLevel();
radio.selectFrequency(88.0);
isBandLimitReached = radio.startsSearchMutingFromBeginning();
float freq = radio.readFrequencyInMHz();
/*第1个搜索到的电台,存到EEPROM中的第3、4位*/
saveStation(freq,1);
printSelectedFrequency(freq);
lcd.print("S1");
ScanStationSum=1;
delay(500);
while(!isBandLimitReached){
isBandLimitReached=radio.searchNextMuting();
freq = radio.readFrequencyInMHz();
ScanStationSum+=1;
saveStation(freq, ScanStationSum);
printSelectedFrequency(freq);
lcd.print("S");
lcd.print(ScanStationSum);
delay(500);
}
//把搜索到的电台总数存到EEPROM中的第0位。
EEPROM.write(0, ScanStationSum);
lcd.setCursor(0,1);
lcd.print("                ");
lcd.setCursor(0,1);
lcd.print("StationSum:");
lcd.print(ScanStationSum);
delay(500);
}

//存电台到EEPROM
voidsaveStation(float station,byte n){
float aux;
byte byteValue;

byteValue = (byte) floor(station);
EEPROM.write(2*n+1, byteValue);
aux = station - floor(station);
aux *= 10.0;
if (aux > 5.0) {
    byteValue = byte(aux);
    if ((((float)byteValue) - aux) > 0.1) {
      byteValue--;
    } else if ((aux - ((float)byteValue)) > 0.1) {
      byteValue++;
    }
} else {
    byteValue = (int) ceil(aux);
}
EEPROM.write(2*n+2, byteValue);
}

dcui 发表于 2015-12-21 17:24:58

搜台效果不是很好,经常有漏台和假台的问题,看来哪里还要优化!或是要优化库文件?

大Angel101 发表于 2016-3-19 16:34:20

大神,现在就自动搜台那部分没搞懂。能出来讲解一下吗?
页: [1]
查看完整版本: 调频收音模块TEA5767,用arduino控制,请教!!