На аудиопроцессорах TDA7313 и TDA7317 под управление Arduino, можно собрать многофункциональный предварительный усилитель.
Микросхема TDA7313 имеет три стерео входа, регуляторы тембра НЧ и ВЧ, тонкомпенсация и четыре выхода (псевдоквадро). TDA7317 представляет собой стереофонический 5-полосный эквалайзер с цифровым управлением, позволяющий осуществлять регулировку тембра в пяти полосах 60 Гц, 260 Гц, 1 кГц, 3 кГц, 10 кГц. При совместной работе этих двух аудиопроцессоров получается предварительный усилитель со следующими характеристиками:
- Напряжение питания 6…10 В (9 В рекомендуемое)
- Диапазон воспроизводимых частот от 20 до 20000 Гц
- Регулировка громкости от -78.75 до 0 дБ (0…63 уровня)
- Регулировка предусилителя независимое для каждого входа от 0 до 11.25 дБ (шаг 3,75 дБ)
- Регулировка аттенюаторов независимое для каждого выхода от -38.75 до 0 дБ (шаг 1,25 дБ)
- Регулировка тембра по пяти полосам: 60 Гц, 260 Гц, 1 кГц, 3 кГц, 10 кГц
- Шаг регулировки тембра 2 дБ (14 шагов от -7 до +7)
- Коммутатор входов (3 стерео входа)
Управление предварительным усилителем осуществляется при помощи энкодера KY-040 и одной кнопки (коммутация входов).
Информация о состоянии основных параметров выводится на LCD дисплея LCD1602 на базе контроллера HD44780.
Плата Arduino Nano с аудиопроцессорами TDA7313 и TDA7317 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Все параметры заносятся в энергонезависимую память.
Регулировка предварительного усилителя разделено на два меню, основное — регулировка громкости и тембра и дополнительное — регулировка предусиления, аттенюаторы выходов, включение тонкомпенсации. Для перехода в дополнительное меню необходимо нажать и удерживать кнопку энкодера.
Для нормальной загрузки скетча Вам понадобятся следующие библиотеки:
- MsTimer2.ZIP
- Encoder.zip
- https://github.com/liman324/TDA7317.git — выход 18 (ADDR) ИМС TDA7317 при использовании данной библиотеки не замкнут на землю.
- https://github.com/liman324/TDA7313.git
#include <Wire.h> #include <MsTimer2.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> #include <TDA7313.h> #include <TDA7317.h> TDA7313 tda;TDA7317 tda1; Encoder myEnc(9, 8);//CLK, DT подключение энкодера LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000}; unsigned long newPosition,time,oldPosition = -999; int vol,vol_d,menu,w,z,i,menu1,in,gain,gain1,gain2,gain3,loud,lr,rr,lf,rf; int band1,band1_d,band2,band2_d,band3,band3_d,band4,band4_d,band5,band5_d; void setup(){ Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2); pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA pinMode(12,INPUT);// КНОПКА IN MsTimer2::set(1, to_Timer);MsTimer2::start(); vol = EEPROM.read(0);in = EEPROM.read(3); gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);loud = EEPROM.read(7); lr = EEPROM.read(8);rr = EEPROM.read(9);lf = EEPROM.read(10);rf = EEPROM.read(11); band1 = EEPROM.read(100)-7;band2 = EEPROM.read(101)-7;band3 = EEPROM.read(102)-7;band4 = EEPROM.read(103)-7;band5 = EEPROM.read(104)-7; if(in==0){gain=gain1;} if(in==1){gain=gain2;} if(in==2){gain=gain3;} delay(500);audio();delay(100); } void to_Timer(){ //функция таймера newPosition = myEnc.read()/4;} void loop(){ if((analogRead(A0)<900)&&menu1==0){menu++;cl();myEnc.write(0);i++;time=millis();w=1;if(menu>5){menu=0;}}// меню if((analogRead(A0)>900)){i=0;}if(i>3){cl();lcd.print(" MENU 2 ");delay(500);cl();menu1=1;menu=100;} if((analogRead(A0)<900)&&menu1>0){menu1++;cl();myEnc.write(0);time=millis();w=1;if(menu1>6){cl();menu1=0;menu=0;}}// меню 1 //////////////////////////////////////// Volume 0...63 дБ ////////////////////////////////////// if(menu==0){ if (newPosition != oldPosition) { oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();} lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(-63+vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=(vol/2)-8; if(vol_d>=0){for(z=0;z<=vol_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}} if((vol_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);} lcd.setCursor(13,1);lcd.print(vol);} ////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////// 60 Hz ///////////////////////////////////////////////////////// if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; band1=band1+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band1>7){band1=7;}if(band1<-7){band1=-7;}audio();} lcd.setCursor(0,0);lcd.print("60 Hz "); lcd.print(band1*2);lcd.setCursor(13,0);lcd.print("dB");band1_d=band1+7; if(band1_d>=0){for(z=0;z<=band1_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}} ////////////////////////////// 260 Hz ////////////////////////////////////////////////////////// if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; band2=band2+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band2>7){band2=7;}if(band2<-7){band2=-7;}audio();} lcd.setCursor(0,0);lcd.print("260 Hz "); lcd.print(band2*2);lcd.setCursor(13,0);lcd.print("dB");band2_d=band2+7; if(band2_d>=0){for(z=0;z<=band2_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}} ////////////////////////////// 1000 Hz ////////////////////////////////////////////////////////// if(menu==3){ if (newPosition != oldPosition) { oldPosition = newPosition; band3=band3+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band3>7){band3=7;}if(band3<-7){band3=-7;}audio();} lcd.setCursor(0,0);lcd.print("1000 Hz "); lcd.print(band3*2);lcd.setCursor(13,0);lcd.print("dB");band3_d=band3+7; if(band3_d>=0){for(z=0;z<=band3_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}} ////////////////////////////// 3000 Hz ////////////////////////////////////////////////////////// if(menu==4){ if (newPosition != oldPosition) { oldPosition = newPosition; band4=band4+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band4>7){band4=7;}if(band4<-7){band4=-7;}audio();} lcd.setCursor(0,0);lcd.print("3000 Hz "); lcd.print(band4*2);lcd.setCursor(13,0);lcd.print("dB");band4_d=band4+7; if(band4_d>=0){for(z=0;z<=band4_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}} ////////////////////////////// 1000 Hz ////////////////////////////////////////////////////////// if(menu==5){ if (newPosition != oldPosition) { oldPosition = newPosition; band5=band5+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band5>7){band5=7;}if(band5<-7){band5=-7;}audio();} lcd.setCursor(0,0);lcd.print("10000 Hz "); lcd.print(band5*2);lcd.setCursor(13,0);lcd.print("dB");band5_d=band5+7; if(band5_d>=0){for(z=0;z<=band5_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}} ////////////////////////////////////////////////////////////////////////////////////////////////// if(digitalRead(12)==HIGH){in++;lcd.clear();time=millis();w=1;if(in>2){in=0;}if(in<0){in=2;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);} ///////////////////////////////////// GAIN ////////////////////////////////////////// if(menu1==1){ if(in==0){gain=gain1;} if(in==1){gain=gain2;} if(in==2){gain=gain3;} if (newPosition != oldPosition) { oldPosition = newPosition; gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} if(in==0){gain1=gain;} if(in==1){gain2=gain;} if(in==2){gain3=gain;} lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);lcd.print(" Gain ");lcd.print(gain); } /////////////////////////////// LOUDNESS ////////////////////////////////////////// if(menu1==2){ if (newPosition != oldPosition) { oldPosition = newPosition; loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();} lcd.setCursor(0,0);lcd.print("LOUDNESS ");if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");} } ////////////////////////////////// att LR ////////////////////////////////////////////// if(menu1==3){ if (newPosition != oldPosition) { oldPosition = newPosition; lr=lr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker LR ");lcd.print(lr); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att LF ////////////////////////////////////////////// if(menu1==4){ if (newPosition != oldPosition) { oldPosition = newPosition; lf=lf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker LF ");lcd.print(lf); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att RF ////////////////////////////////////////////// if(menu1==5){ if (newPosition != oldPosition) { oldPosition = newPosition; rf=rf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker RF ");lcd.print(rf); } //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////// att RR ////////////////////////////////////////////// if(menu1==6){ if (newPosition != oldPosition) { oldPosition = newPosition; rr=rr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();} lcd.setCursor(0,0);lcd.print("Speaker RR ");lcd.print(rr); } //////////////////////////////////////////////////////////////////////////////////////// if(millis()-time>10000 && w==1){ EEPROM.update(0,vol); EEPROM.update(3,in); EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3); EEPROM.update(7,loud); EEPROM.update(8,lr);EEPROM.update(9,rr);EEPROM.update(10,lf);EEPROM.update(11,rf); EEPROM.update(100,band1+7);EEPROM.update(101,band2+7);EEPROM.update(102,band3+7);EEPROM.update(103,band4+7);EEPROM.update(104,band5+7); cl();menu=0;menu1=0;w=0;} }//loop void cl(){delay(300);lcd.clear();} void audio(){ tda.setVolume(vol); // громкость 0...63 tda.setAttLR(lr); // аттенюатор LR 0...31 tda.setAttRR(rr); // аттенюатор RR 0...31 tda.setAttLF(lf); // аттенюатор LF 0...31 tda.setAttRF(rf); // аттенюатор RF 0...31 tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3 tda.setBass(0); // тембр НЧ -7...+7 tda.setTreble(0); // тембр ВЧ -7...+7 tda1.setVolume(47); // громкость 0...47 /////////// номер полосы, дБ (-7...+7) ////////// tda1.setBand(0,band5); // 10000 Hz tda1.setBand(1,band2); // 260 Hz tda1.setBand(2,band3); // 1000 Hz tda1.setBand(3,band4); // 3000 Hz tda1.setBand(4,band1); // 60 Hz }
Hi. How can I have access the 3 bands of Tda7439 (apart the 5 bands of 7317)? Thank you.
Sorry, the 2 bands of 7313…