Fork me on GitHub

20/06/14

PIC: TEA5767

PIC: TEA5767


Dessa vez, iremos montar um rádio FM digital, utilizando o módulo TEA5767.

O circuito integrado TEA5767 é um rádio FM estéreo em um único chip. Possui um baixo consumo de energia e não requer nenhum tipo de ajuste no circuito. Sintoniza bandas FM Japonesas( 76 - 91 MHz ) ou Europeias ( 87.5 - 108 MHz ). Comunica-se com o microcontrolador através de um barramento I2C.

O módulo possui 10 pinos. O pino BUS MODE quando em nível baixo habilita a comunicação via I2C. Para habilitar a comunicação 3-Wire apenas coloque o pino em nível alto. Os pinos SDA ( dados ) e SCL ( clock ) são os pinos da interface I2C. É alimentado com tensão entre 2.5V até 5V. Possui duas saídas para o áudio estéreo ( LEFT e RIGHT ). O pino 10 é para a ligação de uma antena.

BIBLIOTECA
MikroC PRO PIC
#define TEA5767_ADDRESS 0xC0

static char WriteBytes[5] = { 0x00, 0x00, 0xD0, 0x10, 0x00 };

struct
{
    union
    {
        char FREQUENCIA_H : 6;
        char SEARCH_MODE : 1;
        char MUTE : 1;
    };

    char FREQUENCIA_L;

    union
    {
        char SWP1 : 1;
        char MUTE_LEFT : 1;
        char MUTE_RIGHT : 1;
        char MONO_TO_STEREO : 1;
        char HLSI : 1;
        char SEARCH_STOP_LEVEL : 2;
        char SEARCH_UP_DOWN : 1;
    };

    union
    {
        char : 5;
        char BAND_LIMIT : 1;  //1 = Japan FM Band, 0 = US/Europe FM Band
        char STANDY_BY_ON : 1;
        char SWP2 : 1;
    };

} TEA5767 at WriteBytes;

void TEA5767_Write()
{
    Soft_I2C_Start();
    Soft_I2C_Write( TEA5767_ADDRESS );
    Soft_I2C_Write( WriteBytes[0] );
    Soft_I2C_Write( WriteBytes[1] );
    Soft_I2C_Write( WriteBytes[2] );
    Soft_I2C_Write( WriteBytes[3] );
    Soft_I2C_Write( WriteBytes[4] );
    Soft_I2C_Stop();
}

void TEA5767_Read( unsigned long *freq_hz, char *flags, char *sinal )
{
unsigned long Freq_Tmp = 0;
char ReadBytes[5];

    //Faz a leitura de 4 bytes
    Soft_I2C_Start();
    Soft_I2C_Write( TEA5767_ADDRESS | 1 );
    ReadBytes[0] = Soft_I2C_Read( 1 );
    ReadBytes[1] = Soft_I2C_Read( 1 );
    ReadBytes[2] = Soft_I2C_Read( 1 );
    ReadBytes[3] = Soft_I2C_Read( 1 );
    ReadBytes[4] = Soft_I2C_Read( 0 );
    Soft_I2C_Stop();

    //Calcula a frequencia em hz
    ((char*)&Freq_Tmp)[1] = ReadBytes[0] & 0x3F;
    ((char*)&Freq_Tmp)[0] = ReadBytes[1];

    Freq_Tmp <<= 13;

    if( TEA5767.HLSI )
          Freq_Tmp -= 225000;
      else
          Freq_Tmp += 225000;

    *freq_hz = Freq_Tmp;

    //Nivel do sinal recebido
    *sinal = ReadBytes[3] >> 4;

    //flags
    (*flags).B0 = ReadBytes[2].B7;  //mono ou stereo
    (*flags).B1 = ReadBytes[0].B7; //estacao foi encontrada, caso o scan estiver ativado
    (*flags).B2 = ReadBytes[0].B6;  //atingiu o limite de banda
}

void TEA5767_Sintonizar( unsigned long freq_hz )
{
      //Formula = 4 * ( FREQ + 225000 ) / 32768

      if( TEA5767.HLSI )
          freq_hz += 225000;
      else
          freq_hz -= 225000;

      freq_hz >>= 13;

      TEA5767.FREQUENCIA_H = ((char*)&freq_hz)[1];
      TEA5767.FREQUENCIA_L = ((char*)&freq_hz)[0];
      TEA5767.SEARCH_STOP_LEVEL = 1;

      TEA5767_Write();
}

void TEA5767_Scan( char direcao )
{
     TEA5767.SEARCH_MODE = 1;
     TEA5767.SEARCH_UP_DOWN = direcao.B0;
     TEA5767.SEARCH_STOP_LEVEL = 2;
     TEA5767_Write();
}

EXEMPLO




No exemplo, há dois botões, que são utilizados para sintonizar a frequência e, também para procura automática das estações de rádio. A procura das estações ocorre quando o botão é pressionado por mais de 1 segundo. Para sintonizar, basta pressionar o botão, que a frequência irá decrementar ou incrementar em 100KHz ( 0.1MHz ).

O Display de LCD exibirá a frequência da rádio, o tipo da saída de áudio ( Stereo ou Mono ) e também o nível do sínal recebido. 
MikroC PRO PIC
//Projeto: Radio FM com TEA5767
//MCU: PIC18F4550
//CLOCK: 48MHz ( 20MHz + PLL )
//Autor: Tiago Henrique
//Compilador: MikroC PRO PIC
//Habilitar as seguintes bibliotecas:
// - Conversions
// - Software_I2C
// - LCD


//copie e cole o código da biblioteca aqui!!!

sbit Soft_I2C_Scl           at RD1_bit;
sbit Soft_I2C_Sda           at RD0_bit;
sbit Soft_I2C_Scl_Direction at TRISD1_bit;
sbit Soft_I2C_Sda_Direction at TRISD0_bit;

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

sbit ButtonUp at PORTB.B2;
sbit ButtonDown at PORTB.B3;

unsigned long frequencia = 103500000; //frequencia de uma rádio em Hz
char nivel;
char radio_flags = 0;
char texto[12];
char tempo = 0;

void main()
{
        ADCON1 = 0x0F;    //desativa o canal analogico
        CMCON = 7; //desativa o comparador analogico
        NOT_RBPU_Bit = 0; //habilita os resistores de pull-up da PORTB

        Soft_I2C_Init(); //inicializa a comunicacao I2C

        Lcd_Init(); //iniciliaza o display lcd
        Lcd_Cmd( _LCD_CURSOR_OFF );
        Lcd_Cmd( _LCD_CLEAR );

        TRISB.B3 = 1; //botao de sintonia ( - ), botao de procura ( down )
        TRISB.B2 = 1; //botao de sintonia ( + ), botao de procura ( up )

        TEA5767_Sintonizar( frequencia ); //Sintoniza o radio

        while( 1 )
        {
             if( !ButtonUp )
             {
              tempo = 0;

              while( !ButtonUp )//enquanto o botao estiver pressionado
              {
                tempo++;
                if( tempo >= 200 )
                    break;
                Delay_ms( 5 );
              }
               
              frequencia += 100000;
              TEA5767_Sintonizar( frequencia );
              
              if( tempo >= 200 )  //1 segundo pressionado?
              {
                   TEA5767_Scan( 1 );
                  Lcd_Out( 2, 8, "SCAN" );
              }
             }
             else if( !ButtonDown )
             {
              tempo = 0;

              while( !ButtonDown )//enquanto o botao estiver pressionado
              {
                tempo++;
                if( tempo >= 200 )
                    break;
                Delay_ms( 5 );
              }
               
               frequencia -= 100000;
               TEA5767_Sintonizar( frequencia );
               
               if( tempo >= 200 ) //1 segundo pressionado
               {
                  TEA5767_Scan( 0 );
                  Lcd_Out( 2, 8, "SCAN" );
               }
             }

             TEA5767_Read( &frequencia, &radio_flags, &nivel );
             
             //imprime no display lcd
             Lcd_Out( 1, 1, "FREQ: " );
             WordToStr( frequencia / 100000, texto );
             Lcd_Chr_CP( texto[1] );
             Lcd_Chr_CP( texto[2] );
             Lcd_Chr_CP( texto[3] );
             Lcd_Chr_CP( '.' );
             Lcd_Chr_CP( texto[4] );
             Lcd_Out_CP( " MHz" );
             
             ByteToStr( nivel, texto );
             Lcd_Out( 2, 12, texto );

             if( radio_flags.B0 )
                 Lcd_Out( 2, 1, "STEREO" );
             else
                 Lcd_Out( 2, 1, " MONO " );

             if( radio_flags.B1 )  //Estacao encontrada
             {
                   TEA5767.SEARCH_MODE = 0;
                   Lcd_Out( 2, 8, "    " );
             }
             
             Delay_ms( 50 );
        }
}

8 comentários:

  1. Excelente blog! Obrigado por divulgar seus circuitos e códigos!

    ResponderExcluir
  2. você poderia disponibilizar esse componente para simulação no proteus? obrigado e ótimo blog

    ResponderExcluir
  3. Mito dos Projetos, vc poderia fazer um desse Menu e Submenu com Lcd, estou tentando fazer um mas ta dificil.

    ResponderExcluir
  4. Como fazer a programação para controlar o volume para o Arduino? Qual é o código? 0x??

    ResponderExcluir
  5. poderia disponibilizar o componente TEA5767 para biblioteca proteus?

    ResponderExcluir

Postagens Relacionadas!!