| Ваш IP: 34.236.145.124 | Online(17) - гости: 9, боты: 8 | Загрузка сервера: 1.85 ::::::::::::

Темброблок на TDA8425 (Arduino)

ИМС TDA8425 представляет собой двухканальный (стереофонический) регулятор громкости и тембра с микропроцессорным управлением.

Технические характеристики:

  • Производитель: Philips
  • Напряжение питания минимальное 7 В
  • Напряжение питания максимальное 13,2 В
  • Частотный диапазон 35…20000 Гц
  • Коэффициент гармоник 0,05%
  • Выходное напряжение максимальное 1 В
  • Регулировка громкости 48 уровней от -88 дБ до +6 дБ с шагом 2 дБ
  • Регулировка тембра НЧ  от -12 дБ до +15 дБ с шагом 3 дБ
  • Регулировка тембра ВЧ  от -12 дБ до +12 дБ с шагом 3 дБ
  • Регулировка баланса 8 дБ с шагом 2 дБ

 

Плата Arduino Nano аудиопроцессор TDA8425 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).

Темброблок имеет пять кнопок управления:

  • МЕНЮ — перебор параметров (громкость, баланс, тембр НЧ, тембр ВЧ, выбор канала)
  • ПЛЮС — прибавление громкости, тембра и др.
  • МИНУС  — уменьшение громкости, тембра и др.
  • MUTE — включение/выключение режима MUTE
  • — 20 дБ — при нажатии на кнопку громкость уменьшается на 20 дБ

Если кнопки регулировок «ПЛЮС» и «МИНУС» и кнопка «МЕНЮ» не были активны в течении 10 секунд, то происходит запись всех настроек в энергонезависимую память (функция EEPROM.update не перезаписывает ячейку памяти если значение переменной не менялось), так же происходит переход из режима регулировок тембра, баланса, выбора входа в режим регулировки громкости.

Если в режиме MUTE нет необходимости, то выход D9 необходимо подключить к GND.

  #include <Wire.h>
  #include <TDA8425.h>
  #include <LiquidCrystal.h>
  #include <EEPROM.h>//#include <EEPROMex.h>
  TDA8425 tda;
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
  byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
  byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
  int menu,vol_d,z,w,w1,bass_d,treb,treb_d,balans;
  byte vol,bass,in,mute=0;
  unsigned long time;
 
void setup(){
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
  pinMode(9,INPUT);// mute
  pinMode(8,INPUT);// -20дБ
  lcd.createChar(0,a1); lcd.createChar(1,a2); 
  vol = EEPROM.read(0);// vol eeprom
  bass = EEPROM.read(1);// bass eeprom
  treb = EEPROM.read(2);// treb eeprom
  in = EEPROM.read(3);// in eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
   audio();
  lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
 }
 
void loop(){
   if(digitalRead(12)==HIGH){menu++;mute=0;audio();cl();time=millis();w1=1;if(menu>4){menu=0;}}// меню
 
 // индикация громкости + управление кнопками //////////////
   if(menu==0){
   if(digitalRead(11)==HIGH){vol++;w=1;if(vol>63){vol=63;}}// 63 максимальная громкость = +6 дБ 
   if(digitalRead(10)==HIGH){vol--;w=1;if(vol<=16){vol=16;}}// 16 минимум громкости = -88 дБ
  lcd.setCursor(0,0);lcd.print("Volume    ");
  vol_d=vol*2-120;
   if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(vol_d>-10){{lcd.print(" ");}}
  lcd.print(abs(vol_d));lcd.print(" dB   ");
 // ползунок громкости начинает работать с -56 дБ
   if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация баланс + управление кнопками +\- 8 дБ ///////
   if(menu==1){
   if(digitalRead(11)==HIGH){balans++;w=1;if(balans>4){balans=4;}}
   if(digitalRead(10)==HIGH){balans--;w=1;if(balans<-4){balans=-4;}}
  lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(15,1);lcd.print("L");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+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);}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 /////////////////////////////////////////////////////////////
 
 // индикация тембр НЧ + управление кнопками //////////////
   if(menu==2){
   if(digitalRead(11)==HIGH){bass++;w=1;if(bass>11){bass=11;}}// 11 максимум тембр = +15 дБ 
   if(digitalRead(10)==HIGH){bass--;w=1;if(bass<2||bass==255){bass=2;}}// 2 минимум тембр = -12 дБ
  lcd.setCursor(0,0);lcd.print("Bass      ");
  bass_d=bass*3-18;
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
   if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация тембр ВЧ + управление кнопками //////////////
   if(menu==3){
   if(digitalRead(11)==HIGH){treb++;w=1;if(treb>10){treb=10;}}// 10 максимум тембр = +12 дБ 
   if(digitalRead(10)==HIGH){treb--;w=1;if(treb<2||treb==255){treb=2;}}// 2 минимум тембр = -12 дБ
  lcd.setCursor(0,0);lcd.print("Treble    ");
  treb_d=treb*3-18;
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
   if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
 ///////////////////////////////////////////////////////////
 
 /////////// input /////////////////////////////////////////
   if(menu==4){
   if(digitalRead(11)==HIGH){in++;w=1;if(in>1&&in<255){in=0;}}
   if(digitalRead(10)==HIGH){in--;w=1;if(in>2){in=1;}}
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
////////////////////////////////////////////////////////////
 
////////////////// mute //////////////////////////////////
   if(digitalRead(9)==HIGH){mute++;if(mute>1){mute=0;}
   if(mute==1){menu=-1;}else{menu=0;}
  audio();cl();
  lcd.setCursor(6,0);lcd.print("MUTE");
 }
///////////////////////////////////////////////////////////
 
///////////////////  -20 dB ///////////////////////////////
   if(digitalRead(8)==HIGH){vol=vol-10;delay(500);audio();cl();}
//////////////////////////////////////////////////////////
 
// запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
// если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w1==1){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass);
     EEPROM.update(2,treb);
     EEPROM.update(3,in);
  menu=0;w1=0;cl();
 }
}
 
void cl(){
  delay(200);
  lcd.clear();
 }
 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }

Библиотека TDA8425.ZIP 


Следующий вариант темброблока аналогичен первому, только вместо кнопок управления «ПЛЮС» и «МИНУС» и  «МЕНЮ» применен энкодер. При нажатии на кнопку энкодера происходит смена регулировок параметров.

Если энкодер не активен в течении 10 секунд происходит переход на регулировку громкости, а если энкодер неактивен в течении 60 секунд происходит запись всех настроек в энергонезависимую память.

  #include <Wire.h>
  #include <TDA8425.h>
  #include <Encoder.h>
  #include <LiquidCrystal.h>
  #include <EEPROM.h>//#include <EEPROMex.h>
   Encoder myEnc(11, 10);//CLK, DT
   TDA8425 tda;
   LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7
   byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
   byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
   int z,vol,vol_d,vol_ram,balans,balans_ram,bass,bass_ram,bass_d,treb,treb_d,treb_ram,in,in_ram,mute;
   byte menu,w1,w;
   long oldPosition  = -999;
   unsigned long time,time1;
 
 
void setup() {
  Serial.begin(9600);
   lcd.begin(16, 2);
   pinMode(12,INPUT);// меню кнопка энкодера SW
   lcd.createChar(0,a1); lcd.createChar(1,a2); 
   vol = EEPROM.read(0);// vol eeprom
   bass = EEPROM.read(1);// bass eeprom
   treb = EEPROM.read(2);// treb eeprom
   in = EEPROM.read(3);// in eeprom
   balans = EEPROM.read(4)-4;// balans eeprom
   audio();ram();
   lcd.setCursor(4,0);lcd.print("TDA8425");delay(500);
}
 
void loop() {
   if(digitalRead(12)==LOW){menu++;ram();myEnc.write(0);oldPosition  = -999;delay(300);time1=millis();w=1;if(menu>4){menu=0;}}// меню
   ///////////////////////// громкость /////////////////////////////
   if(menu==0){
  long newPosition = myEnc.read()/4+vol_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();vol=newPosition;
   if(vol>63){vol=63;};if(vol<=16){vol=16;}
  lcd.setCursor(0,0);lcd.print("Volume    ");
  vol_d=vol*2-120;
   if(vol_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(vol_d>-10){{lcd.print(" ");}}
  lcd.print(abs(vol_d));lcd.print(" dB   ");
 // ползунок громкости начинает работать с -56 дБ
   if(vol-32>0){for(z=0;z<=vol-33;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol-32)%2==0&&vol-32>=0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}
  audio();time=millis();time1=millis();w1=1;w=1;
  }}
   ///////////////////////// баланс /////////////////////////////
  if(menu==1){
  long newPosition = myEnc.read()/4+balans_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();balans=newPosition;
  if(balans>4){balans=4;}if(balans<-4){balans=-4;}
  lcd.setCursor(0,0);
   if(balans*2>=0){lcd.print("-");}else{lcd.print("+");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans*2>=0){lcd.print("+");}else{lcd.print("-");}
  lcd.print(abs(balans*2));lcd.print(" dB ");
  lcd.setCursor(0,1);lcd.print("R");
  lcd.setCursor(15,1);lcd.print("L");
   if(balans<0){lcd.setCursor(balans+7,1);lcd.write((uint8_t)0);}
   if(balans>0){lcd.setCursor(balans+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);}
  audio();time=millis();w1=1;
}}
  ///////////////////////// тембр нч /////////////////////////////
  if(menu==2){
   long newPosition = myEnc.read()/4+bass_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();bass=newPosition;
   if(bass>11){bass=11;}if(bass<2||bass==255){bass=2;}
  lcd.setCursor(0,0);lcd.print("Bass      ");
  bass_d=bass*3-18;
   if(bass_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(bass_d>-10&&bass_d<=0||bass_d<10&&bass_d>0){{lcd.print(" ");}}
  lcd.print(abs(bass_d));lcd.print(" dB   ");
   if(bass>1){for(z=3;z<=bass+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();time=millis();w1=1;
 }}
   ///////////////////////// тембр вч /////////////////////////////
  if(menu==3){
   long newPosition = myEnc.read()/4+treb_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();treb=newPosition;
   if(treb>10){treb=10;}if(treb<2||treb==255){treb=2;}
  lcd.setCursor(0,0);lcd.print("Treble    ");
  treb_d=treb*3-18;
   if(treb_d>=0){lcd.print("+");}else{lcd.print("-");}
   if(treb_d>-10&&treb_d<=0||treb_d<10&&treb_d>0){{lcd.print(" ");}}
  lcd.print(abs(treb_d));lcd.print(" dB   ");
   if(treb>1){for(z=3;z<=treb+1;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}
  audio();time=millis();w1=1;
 }}
  ///////////////////////// input /////////////////////////////
  if(menu==4){
    long newPosition = myEnc.read()/4+in_ram;
   if (newPosition != oldPosition) {
  oldPosition = newPosition;lcd.clear();in=newPosition;
   if(in>1&&in<255){in=0;}if(in>2){in=1;}
  lcd.setCursor(0,0);lcd.print("Source selector");
  lcd.setCursor(0,1);lcd.print("Input: ");lcd.print(in);
  audio();time=millis();w1=1;
 }}
////////////////// mute //////////////////////////////////
   if(digitalRead(9)==HIGH){mute++;if(mute>1){mute=0;}
   if(mute==1){menu=-1;}else{oldPosition  = -999;menu=0;}
  audio(); delay(200);lcd.clear();
  lcd.setCursor(6,0);lcd.print("MUTE");
 }
///////////////////////////////////////////////////////////
 
///////////////////  -20 dB ///////////////////////////////
   if(digitalRead(8)==HIGH){vol=vol-10;delay(500);ram();audio();myEnc.write(0);menu=0;}
//////////////////////////////////////////////////////////
 
   if(millis()-time>10000 && w1==1){// возврат в меню громкости через 10 сек неактивности
     menu=0;w1=0; }
   if(millis()-time1>60000 && w==1){// сохранение всех настроек в eeprom через 60 сек неактивности
     ram();myEnc.write(0);
     EEPROM.update(0,vol_ram);
     EEPROM.update(4,balans_ram+4);
     EEPROM.update(1,bass_ram);
     EEPROM.update(2,treb_ram);
     EEPROM.update(3,in_ram);
     w=0; }
 
 }// loop
 
void ram(){vol_ram=vol;in_ram=in;balans_ram=balans;treb_ram=treb;bass_ram=bass;} 
 
void audio(){
  tda.setVolumeL(vol+balans);
  tda.setVolumeR(vol-balans);
  tda.setBass(bass);
  tda.setTreble(treb);
  tda.setMute(mute);
  tda.setSource(in);
 }

Видео

Комментарии

  • Aleksandr:

    Доброго дня. И этот проект удачно заработал. Теперь у меня два полноценных предварительных усилителя.Хочу отметить, что TDA 7439 «звучит» на порядок лучше. В качестве усилителя мощности используется оконечный усилитель от Одиссея, выдранный из мёртвого усилка и отремонтированный согласно заводской схеме. Всё это благополучно качает колонки Техникс, полочные, 30 Ватт 8 Ом, 91 Дб\Вт. Теперь буду думать корпус.Ещё раз спасибо за статьи и скетчи к ним.

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

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

Случайные статьи

  • Драйвер светодиода белого свечения с напряжением 1,5В

    Для свечения диода белого свечения необходимо напряжение 3…4В, что не позволяет использовать одну батарею на 1,5В, но если применить схему показанную на рисунке то можно использовать светодиод белого свечения от напряжения 1,2…1,5В. На микросхеме МАХ1722 собран повышающий преобразователь, на микросхеме МАХ4073Т собран регулятор с обратной связью который позволяет регулировать выходной …Подробнее...
  • НЕКОТОРЫЕ ВОПРОСЫ ЭКСПЛУАТАЦИИ АККУМУЛЯТОРНЫХ БАТАРЕЙ

    При эксплуатации аккумуляторных батарей следует всегда четко помнить следующее: • после покупки батареи находятся в разряженном состоянии и перед началом эксплуатации их необходимо зарядить; • напряжение на заряженном элементе аккумуляторной батареи составляет 1,2 В; • напряжение конца разряда (напряжение, ниже которого элемент разряжать не следует) составляет 1,0…1,05 В; • емкость …Подробнее...
  • Фазоинвертор (ламповый усилитель)

    В двухтактный ламповый усилитель входит каскад фазоинвертор, его назначение — разделение входного сигнала на две противофазные полуволны . Так как любой каскад с нагрузкой анодной цепи инвертирует сигнал, часто применяется простая схема фазоинвертора на двух усилительных каскадах. Фазоинвертор — это два усилительных каскада с общим катодом, сигнал с выхода первого …Подробнее...
  • ЭЛЕКТРОННЫЕ ИГРОВЫЕ КОСТИ

    ЭЛЕКТРОННЫЕ ИГРОВЫЕ КОСТИ

    На рисунке показана простая схема «Электронные игровые кости», состоящая из простых недорогих элементах. Схема «Игровые кости» состоит из таймера, счетчика и нескольких светодиодов. При нажатии переключателя S1, таймер 555 вырабатывает импульсы, которые поступают на счетчик. Из-за быстроты переключений счетчика человек не может отследить момент зажигания светодиодов, поэтому данную схему можно …Подробнее...
  • Семиполосный эквалайзер с активными фильтрами

    Ниже приведен вариант эквалайзера с 7-ю полосами регулирования и глубиной регулирования ±15дБ на всех частотах. Номинальная величина входного сигнала — 250мВ. ОУ DA1 выполняет роль нормирующего усилителя. В цепи ОС ОУ DA2 включены фильтры F1-F7 с центральными частотами40, 100, 270, 700, 2000, 5000, 12500 Гц. Ширина полосы фильтра определяется параметрами …Подробнее...