Регулятор тембра на микросхеме TDA7439 (Arduino)

ИМС TDA7439 – регулятор громкости и трехполосный регулятор тембра, разработан для использования в HI-FI аппаратуре и качественных автомобильных аудиосистемах, обладает низким уровнем шумов и искажений.

Основные технические характеристики ИМС TDA7439:

  • Громкость 48 уровней от -48 до 0 дБ
  • Регулировка тембра НЧ, СЧ, ВЧ  ±14 дБ (±7 уровней)
  • Коммутация входов — 4 стерео канала
  • Усиление от 0 до 30 дБ независимое для каждого канала
  • Регулировка баланса ±4 дБ (ограниченно программно)
  • Напряжение питания от 6 до 10,2 В (типовое значение 9 В)
  • КНИ на частоте 1 кГц не более 0,01%

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

 

Управление регулятором тембра состоит из 4-х кнопок:

  1. Кнопка «МЕНЮ» — пять основных регулировок: громкость, тембр НЧ, тембр СЧ, тембр ВЧ, баланс.
  2. Кнопка «+» — увеличение громкости, тембра, рег. баланса, рег. усиления.
  3. Кнопка «-» — уменьшение громкости, тембра, рег. баланса, рег. усиления.
  4. Кнопка «INPUT» (режим INPUT) — выбор стерео канала и регулировка усиления для каждого канала.
Плата Пин SDA Пин SCL
Arduino Uno, Nano, Pro и Pro Mini A4 A5

Все настройки в МЕНЮ сохраняются в энергонезависимой памяти. Сохранение настроек происходит через 10 секунд неактивности кнопок управления. Для сохранения настроек в режиме INPUT, так же необходимо подождать 10 секунд, после чего номер текущего канала и настройки усиления всех каналов будут сохранены в энергонезависимой памяти.

TDA7439.zip — скачайте и установите измененную библиотеку для данного скетча

#include <Wire.h>
#include <TDA7439.h>
#include <LiquidCrystal.h>
#include <EEPROMex.h>
  TDA7439 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 vol,vol_d,z,bass,mids,treb,balans,in,gain,gain1,gain2,gain3,gain4;
  byte menu,w,w1,in_d;
  unsigned long time;
 
 void setup() { Serial.begin(9600); Serial.print("TDA7439");
  lcd.begin(16, 2);
  lcd.setCursor(0,0);lcd.print("    TDA7439    ");delay(1000);
  pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
  pinMode(A1,INPUT);// in 1-4
  lcd.createChar(0,a1); lcd.createChar(1,a2);
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass eeprom
  mids = EEPROM.read(2)-7;// mids eeprom
  treb = EEPROM.read(3)-7;// treb eeprom
  balans = EEPROM.read(4)-4;// balans eeprom
  in = EEPROM.read(5);// in eeprom
  gain1 = EEPROM.read(6);// gain1 eeprom
  gain2 = EEPROM.read(7);// gain2 eeprom
  gain3 = EEPROM.read(8);// gain3 eeprom
  gain4 = EEPROM.read(9);// gain4 eeprom
  g1();audio();
 }
 
 void loop() {
  if(digitalRead(12)==HIGH){menu++;cl();in_d=0;if(menu>4){menu=0;}}// меню
  if(analogRead(A1)>900){in++;menu=5;w=1;in_d=1;cl();if(in>4||in<1){in=1;}}// in
  // индикация громкости + управление кнопками //////////////
   if(menu==0){
   if(digitalRead(11)==HIGH){vol++;w=1;if(vol>48){vol=48;}}// 48 максимальная громкость  
   if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости 
   if(w==1){audio();cl();time=millis();w=0;w1=1;}
  lcd.setCursor(0,0);lcd.print("Volume   ");
  lcd.print(-48+vol);lcd.setCursor(13,0);lcd.print("dB");
  vol_d=vol/2;
   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);
 }
 
  // индикация тембр НЧ + управление кнопками //////////////
   if(menu==1){
   if(digitalRead(11)==HIGH){bass++;w=1;if(bass>7){bass=7;}} 
   if(digitalRead(10)==HIGH){bass--;w=1;if(bass<-7){bass=-7;}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
  lcd.setCursor(0,0);lcd.print("Bass      ");
  lcd.print(bass*2);lcd.setCursor(13,0);lcd.print("dB");
   for(z=-7;z<=bass;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);}
 }
 ///////////////////////////////////////////////////////////
 
   // индикация тембр CЧ + управление кнопками //////////////
   if(menu==2){
   if(digitalRead(11)==HIGH){mids++;w=1;if(mids>7){mids=7;}} 
   if(digitalRead(10)==HIGH){mids--;w=1;if(mids<-7){mids=-7;}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
  lcd.setCursor(0,0);lcd.print("Mids      ");
  lcd.print(mids*2);lcd.setCursor(13,0);lcd.print("dB");
   for(z=-7;z<=mids;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);}
 }
 ///////////////////////////////////////////////////////////
 
  // индикация тембр BЧ + управление кнопками //////////////
   if(menu==3){
   if(digitalRead(11)==HIGH){treb++;w=1;if(treb>7){treb=7;}} 
   if(digitalRead(10)==HIGH){treb--;w=1;if(treb<-7){treb=-7;}}
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
  lcd.setCursor(0,0);lcd.print("Trebble   ");
  lcd.print(treb*2);lcd.setCursor(13,0);lcd.print("dB");
   for(z=-7;z<=treb;z++){lcd.setCursor(z+7,1);lcd.write((uint8_t)0);}
 }
 ///////////////////////////////////////////////////////////
 
 // индикация баланс + управление кнопками +\- 4 дБ ///////
   if(menu==4){
   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>=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("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;}
 }
 /////////////////////////////////////////////////////////////
 
 /////////// input + gain /////////////////////////////////////////
   if(in_d==1){ g1(); 
   if(digitalRead(11)==HIGH){gain++;w=1;if(gain>15){gain=15;}}
   if(digitalRead(10)==HIGH){gain--;w=1;if(gain<0){gain=0;}}
   g2();
  lcd.setCursor(0,0);lcd.print("Input: ");lcd.print(in);
  lcd.setCursor(0,1);lcd.print("Input Gain: ");lcd.print(gain);
   if(w==1){audio();cl();time=millis();w1=1;w=0;}
 }
////////////////////////////////////////////////////////////
 
 // запись всех настроек в EEPROM если кнопки + и - не нажимались в течении 10 сек
 // если настройки тембра, баланса и номер входа не менялись в течении 10 сек, переход в рег. Громкости
   if(millis()-time>10000 && w1==1){
     EEPROM.update(0,vol);
     EEPROM.update(4,balans+4);
     EEPROM.update(1,bass+7);
     EEPROM.update(2,mids+7);
     EEPROM.update(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);EEPROM.update(8,gain3);EEPROM.update(9,gain4);
  menu=0;w1=0;cl();in_d=0;
 }
 }
 
 void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}if(in==3){gain=gain3;}if(in==4){gain=gain4;}}
 void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}if(in==3){gain3=gain;}if(in==4){gain4=gain;}}
 void cl(){delay(200);lcd.clear();}
 void audio(){
  tda.setInput(in); // 1 to 4 // номер канала
  tda.inputGain(gain); // 0 to 15 // усиление 
  tda.setVolume(vol); // 0 to 48 ( 0 is mute) // громкость
  tda.setSnd(bass, 1); //-7 to +7 , 1 - Bass | 2 - Mids | 3 - Trebble
  tda.setSnd(mids, 2);
  tda.setSnd(treb, 3); 
  tda.spkAtt(4-balans, 4+balans); // баланс R L от 0 to 79 (db) 
 }

Comments

  1. Собрал. Залил скетч. Дисплей работает, кнопки управления то же. В схеме кнопка выбора входов подключена на А1 ардуино, в скетче А0. Но сам аудиопроцессор не запускается. Ощущение, то ардуино не видит микросхему. Библиотека сохранилась в скетче. В чём подвох?

    1. Измените скетч на вход А1 (если собираете на плате) или подключение на А0 (если на макетной плате), скетч поправил, на схеме была ошибка, теперь скетч соответствует схеме.

  2. Спасибо за отклик. Конечно первое, то я проверял это питание.Оно есть. Органиованно на 7809 стабилизаторе. Минуса,однозначно, тоже.Входы А4 и А5 соответствуют схеме аудиопроцессора.

  3. Грешу на сам аудиопроцессор. Единственный на рынке у нас был. Попробую собрать на TDA 8425. Благо у нас их в продаже в изобилие.Просмотрел весь скетч нигде не увидел привязки к входам А4 и А5 ардуино. Точно они используются для SDA и SCL аудио?

  4. Скетч поправил. Ардуино Нано. И местами менял, результат никакой. Жаль, что нет возможности проверить процессор.Кстати, на А4 и А5 не нужны подтягивающие резисторы к питанию, или к нулю?

    1. Кнопка input выход а1. При первом включении значение канала может быть в не диапазона, так как берется из энергонезависимой памяти ардуино.

  5. При первом включении уровень усиления канала был аж 255. Потом до 0 уменьшил и увеличил до +15. Второе включение и последующие усиление на всех каналах до 15 Дб.

  6. Доброго вечера. Библиотека была скачана из этой статьи. По ссылке перед самим скетчем. На всякий случай скачал даташит на этот аудиопроц, сверился со своей платой. Плата собрана без ошибок, даташит совпадает со схемой в статье. Да и ошибиться тут трудно-деталей обвязки минимум. Ладно, утро вечера мудренее.Попробую ещё раз завтра перезалить ардуинку. Спасибо за содействие.

  7. Здравствуйте. Не поверите, собрал схему на tda8425. Скачал библиотеку, залил скетч. Результат тот же, что и в первом случае. Управление и индикация есть, аудиопроцессор не оживает. Попросил друга, который детальнее и глубже разбирается в Ардуино, зарегестрироваться у Вас на сайте, чтобы он более предметно вопросы задавал.Я с Ардуино второй раз сталкиваюсь. Мне ещё не всё понятно. Ставил скетч Ваш посредством копирования и вставки в программу arduino ide. Библиотеку скачал и добавил в раздел библиотеки в программе ide. Может неправильно записываю, хотя скетч компилируется и грузится. Ардуино с дисплеем оживают. С ув. Александр.

    1. Запустить аудиопроцессор это самое простое, сложнее написать управление, даже на простом примере аудипроцессор должен работать:

      #include «Wire.h» // вместо ковычек стрелки
      #include «TDA7439.h»
      TDA7439 tda;

      void setup() {}
      void loop() {
      tda.setInput(1); // 1 to 4 // номер канала
      tda.inputGain(0); // 0 to 15 // усиление
      tda.setVolume(48); // 0 to 48 ( 0 is mute) // громкость
      tda.setSnd(0, 1); //-7 to +7 , 1 — Bass | 2 — Mids | 3 — Trebble
      tda.setSnd(0, 2);
      tda.setSnd(0, 3);
      tda.spkAtt(4, 4); // баланс R L от 0 to 79 (db)
      delay(1000);
      }

      Просто загрузите этот скет и посмотрите результат.

      Так же в раздел void setup() можно добавить:

      Wire.begin();

      Эта команда иницилирует i2s шину, но у меня и без этой команды работает.

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

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