注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

不懂风情,承蒙错爱。

Making love to Raspberry Pi

 
 
 

日志

 
 
关于我

我爱如莲的少男少女,他们笑容纯真,不说假话。

网易考拉推荐

TEA5767模块制作树莓派FM收音机  

2013-04-19 15:40:55|  分类: 嵌入式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
TEA5767模块特点:世界频道,频率范围从76—108MHZ自动数字调谐。高灵敏度,高稳定性,低噪音,低功耗。收音模块、收音机模组,超小体积。
  1. 高灵敏、低噪声高频放大器,
  2. 收音频率:87.6MHz~108MHz,(支持频率范围在76MHz~87.5MHz 之间的校园收音频道),
  3. LC 调谐振荡器使成本更低,RF AGC 电路
  4. 内置调频中频选择 ,I2C 总线控制
  5. 内置FM 立体声解调器 ,PLL 合成调谐解码器
  6. 两个可编程端口 ,软静音,SNC(立体声噪声消除)
  7. 自适应立体声解码,自动搜索功能
  8. 等待模式,需要一个7.6MHz晶体
  9. 40 脚LQFP 封装
管脚分布:
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
 

天线使用的是75cm有线天线,因为75cm是100MHZ波长的1/4.TEA5767没有声音放大器,声音输出幅度很小,耳机直接连上没有声音,所以方案中我把音频输出练到了PC的声卡上。
TEA5767程序:
芯片是通过一个一个5位数据控制的。在写TEA5767 IC2的时候地址是 0×60,读取地址0×61。Arduino IDE只支持7位地址,最有一位奇偶校验是自动分配的。所以我们用到的地址就是0×60
   frequency=87.5; //starting frequency


   frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word

   frequencyH=frequencyB>>8;

  frequencyL=frequencyB&0XFF;

  delay(100);

  Wire.beginTransmission(0x60);   //writing TEA5767

  Wire.send(frequencyH);
  Wire.send(frequencyL);
  Wire.send(0xB0);
  Wire.send(0x10);
  Wire.send(0x00);
  Wire.endTransmission();
上面是负责开启FM接收器频率的
频率通过14位的数字控制,即两个8位。
下面给出运算公式:
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
 3 byte (0xB0): high side LO injection is on,.
 TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
4 byte (0×10) : Xtal is 32.768 kHz
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
5 byte (0×00)
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
读取TEA5767
每次读取都是循环过程

Wire.requestFrom(0x60,5); //reading TEA5767

  if (Wire.available()) 

  {
    for (int i=0; i<5; i++) {

      buffer[i]= Wire.receive();
    }

    freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000;

    lcd.print("FM ");

    lcd.print((freq_available/1000000));

    frequencyH=((buffer[0]&0x3F));

    frequencyL=buffer[1];

    if (search_mode) {

      if(buffer[0]&0x80) search_mode=0;

    }

    if (search_mode==1) lcd.print(" SCAN");
    else {
      lcd.print("       ");
    }

    lcd.setCursor(0, 1);

    lcd.print("Level: ");
    lcd.print((buffer[3]>>4));
    lcd.print("/16 ");

    if (buffer[2]&0x80) lcd.print("STEREO   ");
    else lcd.print("MONO   ");

  }

1 byte has information about search status and part of frequency word
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
2 byte has remaining information about frequency

3 byte – Stereo indicator
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
4 byte – Signal level
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
 5 byte – reserved

频道搜索:
Search mode is on by pressing up or down buttons longer. TEA 5767 stars scanning up or down with 100kHz steps.  Search stop level can be selected.

1 byte (Search mode on/off)

TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
 
2 byte (Search up/down , stop level)
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
 
TEA5767模块制作树莓派FM收音机 - 夏一林 - 不懂风情,承蒙错爱。
If station if found ready flag is on (1 byte).
完整代码:
/// Arduino FM receiver with TEA5767 http://www.electronicsblog.net
#include <Wire.h>
#include <LiquidCrystal.h>

unsigned char search_mode=0;

int b=0;
int c=0;

#define Button_next 30
#define Button_prev 31

unsigned char frequencyH=0;
unsigned char frequencyL=0;

unsigned int frequencyB;
double frequency=0;

double freq_available=0; 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 

void setup()   { 

  Wire.begin();
  lcd.begin(16, 2);

  /// buttons  

  pinMode(Button_next, INPUT);
  digitalWrite(Button_next, HIGH); //pull up resistor

  pinMode(Button_prev, INPUT);
  digitalWrite(Button_prev, HIGH); //pull up resistor

  frequency=87.5; //starting frequency

  frequencyB=4*(frequency*1000000+225000)/32768; //calculating PLL word

  frequencyH=frequencyB>>8;

  frequencyL=frequencyB&0XFF;

  delay(100);

  Wire.beginTransmission(0x60);   //writing TEA5767

  Wire.send(frequencyH);
  Wire.send(frequencyL);
  Wire.send(0xB0);
  Wire.send(0x10);
  Wire.send(0x00);
  Wire.endTransmission();

  delay(100);

}

void loop()
{

  unsigned char buffer[5];

  lcd.setCursor(0, 0);

  Wire.requestFrom(0x60,5); //reading TEA5767

  if (Wire.available()) 

  {
    for (int i=0; i<5; i++) {

      buffer[i]= Wire.receive();
    }

    freq_available=(((buffer[0]&0x3F)<<8)+buffer[1])*32768/4-225000;

    lcd.print("FM ");

    lcd.print((freq_available/1000000));

    frequencyH=((buffer[0]&0x3F));

    frequencyL=buffer[1];

    if (search_mode) {

      if(buffer[0]&0x80) search_mode=0;

    }

    if (search_mode==1) lcd.print(" SCAN");
    else {
      lcd.print("       ");
    }

    lcd.setCursor(0, 1);

    lcd.print("Level: ");
    lcd.print((buffer[3]>>4));
    lcd.print("/16 ");

    if (buffer[2]&0x80) lcd.print("STEREO   ");
    else lcd.print("MONO   ");

  }

  ///// buttons read

  //////////// button_next////////// 
  if (!digitalRead(Button_next)&&!b) {

    frequency=(freq_available/1000000)+0.05;

    frequencyB=4*(frequency*1000000+225000)/32768+1;

    frequencyH=frequencyB>>8;
    frequencyL=frequencyB&0XFF;   

    Wire.beginTransmission(0x60);   

    Wire.send(frequencyH);
    Wire.send(frequencyL);
    Wire.send(0xB0);
    Wire.send(0x1F);
    Wire.send(0x00); 

    Wire.endTransmission(); 

    //////////////////////

    b=100;

  };

  if (!digitalRead(Button_next)&&b==1) {

    ///scannnn UP

    search_mode=1;

    Wire.beginTransmission(0x60);   

    Wire.send(frequencyH+0x40);
    Wire.send(frequencyL);
    Wire.send(0xD0);
    Wire.send(0x1F);
    Wire.send(0x00); 

    Wire.endTransmission();

    /////////////////

    b=100;

  };    

  if (!b==0) b--;

  //////////// button_prev////////// 
  if (!digitalRead(Button_prev)&&!c) {

    frequency=(freq_available/1000000)-0.05;

    frequencyB=4*(frequency*1000000+225000)/32768+1;

    frequencyH=frequencyB>>8;
    frequencyL=frequencyB&0XFF;

    Wire.beginTransmission(0x60);   

    Wire.send(frequencyH);
    Wire.send(frequencyL);
    Wire.send(0xB0);
    Wire.send(0x1F);
    Wire.send(0x00); 

    Wire.endTransmission(); 

    c=100;

  };

  if (!digitalRead(Button_prev)&&c==1) {

    ///scannnn DOWN

    search_mode=1;

    Wire.beginTransmission(0x60);   

    Wire.send(frequencyH+0x40);
    Wire.send(frequencyL); 

    Wire.send(0x50);
    Wire.send(0x1F);
    Wire.send(0x00);
    Wire.endTransmission();   

    c=100;

  };          

  if (!c==0) c--;

  ////////////////////

}
Code have some problem with frequency control/indication. Button press doesn’t always adds/subtracts exactly 0,05 MHz. Also later i found in application note, that after search frequency word must be rounded and sent back to tuner, because with 32768 Hz Xtal search step is not 100 kHz, but 98.304 kHz.

芯片资料:
  评论这张
 
阅读(3212)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017