ИМС 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;}
Есть микросхема аудиопроцессора NJW1136L. Интересно было бы её запустить от ардуино. Если верить даташиту, то же, что и 7303, только с выделенным каналом для сабвуфера.
NJW1136L и 7303 совсем разные.
Внимательно сравнил, да Вы правы, они разные. Просто есть одна такая микросхема. Хотелось бы применить её.