ИМС TDA7442 представляет собой регулятор тембра и громкости с микроконтроллерным управлением.
Основные характеристики аудиопроцессора TDA7442:
- Напряжение питания от 7 до 10.2 В (9 В — рекомендуемое)
- Максимальная амплитуда входного сигнала 2 Vrms
- Коэффициент гармоник на частоте 1 кГц и входном сигнале 1 Vrms не более 0,01%
- Отношение сигнал/шум 106 дБ
- Разделение каналов 90 дБ
- Диапазон регулировки тембра ВЧ и НЧ ± 14 дБ
- Диапазон регулировки громкости от -79 до 0 дБ
- Электронный коммутатор входов (4 стерео входа)
TDA7442 SDIP-32
TDA7442D SO-28
Тестовый скетч
Библиотека — https://github.com/liman324/TDA7442.git
Библиотека поддерживает все функции заявленные в datasheet
datasheet — tda7442.pdf
Плата Arduino Nano аудиопроцессор TDA7442 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
#include <Wire.h> #include <TDA7442.h> TDA7442 tda; void setup(){ Serial.begin(9600);Wire.begin(); audio(); } void loop(){} void audio(){ tda.setInput_att(0); // int -63...0 = -31.5...0 dB step 0.5 dB tda.setSurr_sel(2, 1, 0);/* int 0...2, int 0...1, int 0...15: SIMULATED STEREO | MUSIC | OFF VAR | FIX EFFECT CONTROL -6...-21 dB */ tda.setRez(3); // int 0...3 = 12, 14, 18, 37 kOm tda.setBass(4); // int -7...7 = -14...+14 dB step 2 dB tda.setTreble(5); // int -7...7 = -14...+14 dB step 2 dB tda.setVol_L(-20); // int -79...0 = -79...0 dB tda.setVol_R(-20); // int -79...0 = -79...0 dB tda.setInput(1); // int 1...4 }
Далее показан пример скетча в котором в качестве регулировки всех основных параметров используется энкодер KY-040 и две кнопки. При помощи энкодера осуществляется регулировка громкости, тембра и баланса. Две отдельные кнопки отвечают за переключение входов и настройку дополнительных параметров (MENU2).
Дополнительное меню (MENU2) содержит следующие параметры:
- Аттенюатор входа (независимый для каждого входа)
- SIMULATED STEREO | MUSIC | OFF (имитация стерео | расширенное стерео | выключено)
- VAR | FIX ( регулировка тембра вкл. | регулировка тембра выкл.)
- EFFECT CONTROL -6…-21 dB (MUSIC)
Информация о состоянии основных параметров выводится на LCD дисплея LCD1602 на базе контроллера HD44780.
Дополнительные библиотеки:
#include <Wire.h> #include <MsTimer2.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> #include <TDA7442.h> TDA7442 tda; 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 menu,w,vol,vol_d,z,bass,bass_d,treb,treb_d,balans,in,menu2,gain1,gain2,gain3,gain4,gain0,stereo,eff; 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);// КНОПКА INPUT pinMode(11,INPUT);// КНОПКА MENU 2 MsTimer2::set(1, to_Timer);MsTimer2::start(); vol = EEPROM.read(0)-79;bass = EEPROM.read(1)-7;treb = EEPROM.read(2)-7;balans = EEPROM.read(3)-8;in = EEPROM.read(4); gain1 = EEPROM.read(5);gain2 = EEPROM.read(6);gain3 = EEPROM.read(7);gain4 = EEPROM.read(8); stereo = EEPROM.read(9);eff = EEPROM.read(10); if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;}if(in==4){gain0=gain4;} delay(500);audio(); } void to_Timer(){newPosition = myEnc.read()/4;} void loop(){ if((analogRead(A0)<900)){menu++;cl();myEnc.write(0);menu2=0;time=millis();w=1;if(menu>3){menu=0;}}// меню if((digitalRead(11)==HIGH)){menu2++;cl();myEnc.write(0);if(menu2>0&&menu2<3){menu=100;}if(menu2>3){menu2=0;cl();menu=0;}}// меню 2 //////////////////////////////////////// Volume -79...0 дБ ////////////////////////////////////// if(menu==0){ if (newPosition != oldPosition) { oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol>0){vol=0;}if(vol<-79){vol=-79;}audio();} lcd.setCursor(0,0);lcd.print("Volume "); lcd.print(vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=(vol+79)/3; 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);}} ////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр НЧ -14...14 дБ /////////////////// if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; bass=bass+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(bass>7){bass=7;}if(bass<-7){bass=-7;}audio();} lcd.setCursor(0,0);lcd.print("Bass "); lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB");bass_d=bass+7; if(bass_d>=0){for(z=0;z<=bass_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} } ///////////////////////////////////////////////////////////////////////////////////// /////////////////////// индикация тембр ВЧ -14...14 дБ /////////////////// if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; treb=treb+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(treb>7){treb=7;}if(treb<-7){treb=-7;}audio();} lcd.setCursor(0,0);lcd.print("Treble "); lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB");treb_d=treb+7; if(treb_d>=0){for(z=0;z<=treb_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} } ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // индикация баланс + управление кнопками +\- 4 дБ /////// if(menu==3){ if (newPosition != oldPosition) { oldPosition = newPosition; balans=balans+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(balans>8){balans=8;}if(balans<-8){balans=-8;}audio();} lcd.setCursor(0,0); if(balans>=0){lcd.print("-");}else{lcd.print("+");} lcd.print(abs(balans));lcd.print(" dB "); lcd.print(" <> "); if(balans>=0){lcd.print("+");}else{lcd.print("-");} lcd.print(abs(balans));lcd.print(" dB "); lcd.setCursor(0,1);lcd.print("L"); lcd.setCursor(15,1);lcd.print("R"); if(balans<0){lcd.setCursor(balans/2+7,1);lcd.write((uint8_t)0);} if(balans>0){lcd.setCursor(balans/2+8,1);lcd.write((uint8_t)0);} if(balans==0){lcd.setCursor(7,1);lcd.write((uint8_t)0);lcd.setCursor(8,1);lcd.write((uint8_t)0);} } //////////////////////// input /////////////////////////////////// if(digitalRead(12)==HIGH){in++;if(in>4){in=1;}audio();cl();lcd.setCursor(0,0);lcd.print(" INPUT ");lcd.print(in);delay(2000);cl();time=millis();w=1;}// in ///////////////////////////////////////////////////////////////// //////////////////////////////////// att input //////////////////////////////////////////// if(menu2==1){ w=0; if(in==1){gain0=gain1;}if(in==2){gain0=gain2;}if(in==3){gain0=gain3;}if(in==4){gain0=gain4;} if (newPosition != oldPosition) { oldPosition = newPosition; gain0=gain0+newPosition;myEnc.write(0);newPosition=0;lcd.clear();if(gain0>63){gain0=63;}if(gain0<0){gain0=0;}audio();} if(in==1){gain1=gain0;}if(in==2){gain2=gain0;}if(in==3){gain3=gain0;}if(in==4){gain4=gain0;} lcd.setCursor(0,0);lcd.print("INPUT: ");lcd.print(in); lcd.setCursor(0,1);lcd.print("ATT: -");lcd.print((float)gain0*0.5,1);lcd.print(" dB"); } /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// SURROUND MODE ///////////////////////////////////////////////// if(menu2==2){w=0; if (newPosition != oldPosition) { oldPosition = newPosition; stereo=stereo+newPosition;myEnc.write(0);newPosition=0;lcd.clear();if(stereo>2){stereo=0;}if(stereo<0){stereo=2;}audio();} lcd.setCursor(0,0);lcd.print("SURROUND MODE"); if(stereo==0){lcd.setCursor(0,1);lcd.print("SIMULATED STEREO");} if(stereo==1){lcd.setCursor(0,1);lcd.print("MUSIC");} if(stereo==2){lcd.setCursor(0,1);lcd.print("OFF");} } ////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////// EFFECT CONTROL ////////////////////////////////////////////// if(menu2==3){w=0; if (newPosition != oldPosition) { oldPosition = newPosition; eff=eff+newPosition;myEnc.write(0);newPosition=0;lcd.clear();if(eff>15){eff=15;}if(eff<0){eff=0;}audio();} lcd.setCursor(0,0);lcd.print("EFFECT CONTROL"); lcd.setCursor(3,1);lcd.print("-");lcd.print(eff+6);lcd.print(" dB");} //////////////////////////////eeprom//////////////////// if(millis()-time>10000 && w==1){ EEPROM.update(0,vol+79);EEPROM.update(1,bass+7);EEPROM.update(2,treb+7);EEPROM.update(3,balans+8);EEPROM.update(4,in); EEPROM.update(5,gain1);EEPROM.update(6,gain2);EEPROM.update(7,gain3);EEPROM.update(8,gain4); EEPROM.update(9,stereo); EEPROM.update(10,eff); cl();menu=0;w=0;menu2=0;} } void cl(){delay(300);lcd.clear();} void audio(){ tda.setInput_att(gain0); // int -63...0 = -31.5...0 dB step 0.5 dB tda.setSurr_sel(stereo, 0, eff);/* int 0...2, int 0...1, int 0...15: SIMULATED STEREO | MUSIC | OFF VAR | FIX = тембр вкл/выкл EFFECT CONTROL -6...-21 dB */ tda.setRez(3); // int 0...3 = 12, 14, 18, 37 kOm tda.setBass(bass); // int -7...7 = -14...+14 dB step 2 dB tda.setTreble(treb); // int -7...7 = -14...+14 dB step 2 dB tda.setVol_L(vol-8-balans); // int -79...0 = -79...0 dB tda.setVol_R(vol-8+balans); // int -79...0 = -79...0 dB tda.setInput(in); // int 1...4 }