Аудиопроцессор TDA7303 (Arduino)

ИМС TDA7303 представляет собой простой и не дорогой аудиопроцессор. TDA7303 имеет коммутируемых 3 стерео входа, регуляторы тембра (ВЧ, НЧ), тонкомпенсацию, предусилитель входа, аттенюаторы выходов (квадро). Управление аудиопроцессором осуществляется через шину I2C.

Основные параметры аудиопроцессора TDA7303:

  • Напряжение питания от 6 до 10 (9 рекомендуемое)
  • Максимальное входное напряжение 2 Vrms
  • Коэффициент гармоник не более 0,01 % (Total harmonic distortion V = 1 Vrms; f = 1 kHz)
  • Отношение сигнал/шум 106 дБ
  • Разделение каналов 103 дБ
  • Регулировка громкости от -78,75 до 0 дБ, шаг 1,25 дБ
  • Регулировка тембра от -14 до +14 дБ, шаг 2 дБ
  • Предварительный усилитель входа от 0 до 11,25 дБ, 4 шага, шаг 3,75 дБ
  • Аттенюаторы выходов от -38,75 до 0 дБ, шаг 1,25 дБ

На базе TDA7303 используя платформу Arduino можно собрать простой регулятор тембра и громкости.

Регулятор громкости содержит следующие компоненты:

  • Arduino Nano
  • Индикатор TM1637
  • Энкодер KY-040
  • Три тактовые кнопки
  • IR датчик (необязательная опция)
  • TDA7303

Вся информация об уровни громкости, тембра и другие параметры отображаются на 4-х разрядном семисегментном дисплей на базе драйвера TM1637. Основное управление аудипороцессором осуществляется при помощи энкодера, нажатие кнопки энкодера позволяет переключать основные режимы: громкость, тембр НЧ, тембр ВЧ. Кнопка SET переключает редко используемые параметры, кнопка IN переключает входы. ИК пульт дублирует основное меню (громкость, тембры, переключение входов, mute).

Меню регулятора громкости:

  • Громкость

  • Тембр НЧ

  • Тембра ВЧ

  • Переключение входов

  • MUTE

Дополнительные настройки:

  • Аттенюаторы выходов
  • Тонкомпенсация (on/off)

  • Предусилитель входа (отдельная для каждого входа)

  • Яркость индикатора

Все параметры сохраняются в энергонезависимой памяти.

Вашего пульта необходимо прописать коды кнопок в скетч:

/// BUTTON IR ///
#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B858A7 // Кнопка IN
#define IR_6 0x33B850AF // Кнопка MUTE

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

/// ENCODER ///
#define SW_E   6
#define DT_E   5
#define CLK_E  4
/// TM1637 ///
#define CLK_T  2
#define DIO_T  3
/// BUTTON ////
#define SET    A0
#define IN     A1
#define MUTE   A2
/// IR ///////
#define INPUT_IR 12
/// BUTTON IR ///
#define IR_1 0x33B8A05F // Кнопка вверх
#define IR_2 0x33B8609F // Кнопка вниз
#define IR_3 0x33B810EF // Кнопка >
#define IR_4 0x33B8E01F // Кнопка <
#define IR_5 0x33B858A7 // Кнопка IN
#define IR_6 0x33B850AF // Кнопка MUTE
 
#include <Wire.h>               // Входит в состав Arduino IDE
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <EEPROM.h>             // Входит в состав Arduino IDE
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <boarddefs.h>          // Входит в состав IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
#include <TDA7303.h>            // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=1225&download=1
#include <STM32_TM1637.h>       // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=403&download=1
  TDA7303 tda;
  STM32_TM1637 tm(CLK_T,DIO_T);
  Encoder myEnc(DT_E, CLK_E);
  IRrecv irrecv(INPUT_IR); 
  decode_results ir; 
 
  unsigned long times,oldPosition  = -999,newPosition; 
  bool w,gr1,gr2;
  int vol,menu,bas,trb,menu0=100,att_lr,att_rr,att_lf,att_rf,loud,in,gain,gain0,gain1,gain2,brig,vol_old,mute;
 
void setup(){
   Serial.begin(9600);
   irrecv.enableIRIn();
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
   pinMode(SW_E,INPUT);
   pinMode(SET,INPUT_PULLUP);
   pinMode(IN,INPUT_PULLUP);
   pinMode(MUTE,INPUT_PULLUP);
   vol = EEPROM.read(0);bas = EEPROM.read(1)-7;trb = EEPROM.read(2)-7;att_lr = EEPROM.read(3);att_rr = EEPROM.read(4);
   att_lf = EEPROM.read(5);att_rf = EEPROM.read(6);in = EEPROM.read(7);
   gain0 = EEPROM.read(8);gain1 = EEPROM.read(9);gain2 = EEPROM.read(10);brig = EEPROM.read(11);
   switch(in){
    case 0: gain=gain0;break;
    case 1: gain=gain1;break;
    case 2: gain=gain2;break;
    }
   audio();tm.brig(brig+1);
  }
 
void loop(){
////// IR /////////////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println(ir.value,HEX);irrecv.resume();delay(200);times=millis();w=1;}
 
   if(ir.value==IR_2 && mute==0){menu++;gr1=0;gr2=0;ir.value=0;delay(200);menu0=100;if(menu>2){menu=0;};times=millis();w=1;}//  кнопка вверх 
   if(ir.value==IR_1 && mute==0){menu--;gr1=0;gr2=0;ir.value=0;delay(200);menu0=100;if(menu<0){menu=2;};times=millis();w=1;}//  кнопка вниз
 
////// BUTTON /////////////////////////////////////////////
   if(digitalRead(SW_E)==LOW && mute==0){menu++;menu0=100;if(menu>2){menu=0;};times=millis();w=1;delay(200);}
   if(digitalRead(SET)==LOW && mute==0){menu0++;menu=100;;if(menu0>6){menu0=0;};times=millis();w=1;delay(200);}
   if((digitalRead(IN)==LOW || ir.value==IR_5) && mute==0){in++;gr1=0;gr2=0;ir.value=0;if(in>2){in=0;};tm.print_float(in+1,0, 0b00010000,0b01010100,0,0);times=millis();w=1;
   switch(in){
    case 0: gain=gain0;break;
    case 1: gain=gain1;break;
    case 2: gain=gain2;break;
    }audio();
   delay(1000);}
   if((digitalRead(MUTE)==LOW || ir.value==IR_6) && mute==0){mute=1;gr1=0;gr2=0;ir.value=0;vol_old=vol;vol=63;audio();tm.print_float(0,0,  0b01000000,0b01000000,0b01000000,0b01000000);delay(200);}
   if((digitalRead(MUTE)==LOW || ir.value==IR_6) && mute==1){mute=0;gr1=0;gr2=0;ir.value=0;vol=vol_old;menu=0;menu0=100;audio();delay(200);}
   if(mute==1){myEnc.write(0);newPosition=0;}
 
   if(mute==0){  
////// VOLUME /////////////////////////////////////////////
   if(menu==0){
   if(ir.value==IR_4){vol++;gr1=1;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;};audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}// кнопка >>>>>>
   if(ir.value==IR_3){vol--;gr1=0;gr2=1;ir.value=0;delay(200);times=millis();;w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;ir.value=0;delay(200);times=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}// кнопка <<<<<< 
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}
     tm.print_float((vol-63)*10,0,  0b01000000,0,0,0b01000000);
     } 
////// BASS ///////////////////////////////////////////////
   if(menu==1){
   if(ir.value==IR_3){bas++;gr1=1;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(bas>7){bas=7;}if(bas<-7){bas=-7;}audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){bas++;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(bas>7){bas=7;}if(bas<-7){bas=-7;}audio();}// кнопка >>>>>>
   if(ir.value==IR_4){bas--;gr1=0;gr2=1;ir.value=0;delay(200);times=millis();;w=1;if(bas>7){bas=7;}if(bas<-7){bas=-7;}audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){bas--;gr1=0;ir.value=0;delay(200);times=millis();w=1;if(bas>7){bas=7;}if(bas<-7){bas=-7;}audio();}// кнопка <<<<<<  
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     bas=bas-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(bas>7){bas=7;}if(bas<-7){bas=-7;}audio();}
     tm.print_float(bas,0,  0b01111100,0,0,0);
     } 
////// TREBLE /////////////////////////////////////////////
   if(menu==2){
   if(ir.value==IR_3){trb++;gr1=1;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(trb>7){trb=7;}if(trb<-7){trb=-7;}audio();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){trb++;gr2=0;ir.value=0;delay(200);times=millis();w=1;if(trb>7){trb=7;}if(trb<-7){trb=-7;}audio();}// кнопка >>>>>>
   if(ir.value==IR_4){trb--;gr1=0;gr2=1;ir.value=0;delay(200);times=millis();;w=1;if(trb>7){trb=7;}if(trb<-7){trb=-7;}audio();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){trb--;gr1=0;ir.value=0;delay(200);times=millis();w=1;if(trb>7){trb=7;}if(trb<-7){trb=-7;}audio();}// кнопка <<<<<< 
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     trb=trb-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(trb>7){trb=7;}if(trb<-7){trb=-7;}audio();}
     tm.print_float(trb,0,  0b01111000,0,0,0);
     } 
 
/// MENU0 /////////////////////////////////////////////////
////// ATT_LR /////////////////////////////////////////////
   if(menu0==0){
   if (newPosition != oldPosition){oldPosition = newPosition;
     att_lr=att_lr-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(att_lr>31){att_lr=31;}if(att_lr<0){att_lr=0;}audio();}
     tm.print_float(att_lr,0,  0b00111000,0b01010000,0,0);
     }  
////// ATT_RR /////////////////////////////////////////////
   if(menu0==1){
   if (newPosition != oldPosition){oldPosition = newPosition;
     att_rr=att_rr-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(att_rr>31){att_rr=31;}if(att_rr<0){att_rr=0;}audio();}
     tm.print_float(att_rr,0,  0b01010000,0b01010000,0,0);
     } 
////// ATT_LF /////////////////////////////////////////////
   if(menu0==2){
   if (newPosition != oldPosition){oldPosition = newPosition;
     att_lf=att_lf-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(att_lf>31){att_lf=31;}if(att_lf<0){att_lf=0;}audio();}
     tm.print_float(att_lf,0,  0b00111000,0b01110001,0,0);
     }
////// ATT_RF /////////////////////////////////////////////       
   if(menu0==3){
   if (newPosition != oldPosition){oldPosition = newPosition;
     att_rf=att_rf-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(att_rf>31){att_rf=31;}if(att_rf<0){att_rf=0;}audio();}
     tm.print_float(att_rf,0,  0b01010000,0b01110001,0,0);
     }  
////// LOUDNESS /////////////////////////////////////////////       
   if(menu0==4){
   if (newPosition != oldPosition){oldPosition = newPosition;
     loud=loud-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();}
     tm.print_float(loud,0,  0b00111000,0b01011110,0,0);
     }  
////// GAIN /////////////////////////////////////////////       
   if(menu0==5){
   switch(in){
    case 0: gain=gain0;break;
    case 1: gain=gain1;break;
    case 2: gain=gain2;break;
    }
   if (newPosition != oldPosition){oldPosition = newPosition;
   gain=gain-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();
   switch(in){
    case 0: gain0=gain;break;
    case 1: gain1=gain;break;
    case 2: gain2=gain;break;
    }}
     tm.print_float(gain,0,  0b00111101,0,0,0);
    }      
////// BRIGHTNESS /////////////////////////////////////////////       
   if(menu0==6){
   if (newPosition != oldPosition){oldPosition = newPosition;
     brig=brig-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;if(brig>6){brig=6;}if(brig<0){brig=0;}tm.brig(brig+1);}
     tm.print_float(brig,0,  0b01111100,0b01010000,0,0);
     } 
   } // mute        
 
////// EEPROM /////////////////////////////////////////////
   if(millis()-times>10000 && w==1){
     EEPROM.update(0,vol);EEPROM.update(1,bas+7);EEPROM.update(2,trb+7);EEPROM.update(3,att_lr);EEPROM.update(4,att_rr);
     EEPROM.update(5,att_lf);EEPROM.update(6,att_rf);EEPROM.update(7,in);
     EEPROM.update(8,gain0);EEPROM.update(9,gain1);EEPROM.update(10,gain2);EEPROM.update(11,brig);
     menu=0;menu0=100;w=0;}     
}//loop
 
 
void audio(){
    tda.volume(vol);  // byte 0...63 === 0...-78.75 dB (step 1.25 dB) 
    tda.att_lr(att_lr);  // byte 0...30 === 0...-37.5 dB (step 1.25 dB), byte 31 === mute
    tda.att_rr(att_rr);  // byte 0...30 === 0...-37.5 dB (step 1.25 dB), byte 31 === mute
    tda.att_lf(att_lf);  // byte 0...30 === 0...-37.5 dB (step 1.25 dB), byte 31 === mute
    tda.att_rf(att_rf);  // byte 0...30 === 0...-37.5 dB (step 1.25 dB), byte 31 === mute
    tda.audio_sw(in, loud, 3-gain);
      // byte 0...2 === input 0...2, byte 3 === Not allowed
      // bool 0...1 === loudness_on...loudness_off
      // byte 0...3 === gain 11.25...0 dB
    tda.set_bass(bas); // char -7...7 === bass -14...+14 dB
    tda.set_treb(trb); // char -7...7 === treble -14...+14 dB
}
 
void to_Timer(){newPosition = myEnc.read()/4;}

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=296

Comments

  1. Есть микросхема аудиопроцессора NJW1136L. Интересно было бы её запустить от ардуино. Если верить даташиту, то же, что и 7303, только с выделенным каналом для сабвуфера.

Добавить комментарий

Войти с помощью: