TDA7449 — регулятор тембра и громкости (Arduino)

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

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

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

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

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

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

Плата Пин SDA Пин SCL
Arduino Uno, Nano, Pro и Pro Mini A4 A5

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

Библиотека https://github.com/liman324/TDA7449/archive/master.zip или TDA7449.zip

#include <Wire.h>
#include <TDA7449.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>//#include <EEPROMex.h> для старых версий Arduino IDE
  TDA7449 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;
  int att=4; // аттенюатор - если звук очень громкий увеличьте значение (-72 mute), меньше 4 не делать.
  byte menu,w,w1,in_d;
  unsigned long time;
 
void setup(){ 
  Serial.begin(9600);Wire.begin(); lcd.begin(16, 2);
   pinMode(12,INPUT);// меню
  pinMode(11,INPUT);// плюс
  pinMode(10,INPUT);// минус
  pinMode(A1,INPUT);// in 1-2
  lcd.createChar(0,a1); lcd.createChar(1,a2);
  vol = EEPROM.read(0);// vol eeprom 
  bass = EEPROM.read(1)-7;// bass 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
  g1();audio();
}
 
void loop() {
  if(digitalRead(12)==HIGH){menu++;cl();in_d=0;if(menu>3){menu=0;}}// меню
  if(analogRead(A1)>900){in++;menu=5;w=1;in_d=1;cl();if(in>2||in<1){in=1;}}// in
  // индикация громкости + управление кнопками //////////////
   if(menu==0){
   if(digitalRead(11)==HIGH){vol++;w=1;if(vol>47){vol=47;}}// 47 максимальная громкость  
   if(digitalRead(10)==HIGH){vol--;w=1;if(vol<0){vol=0;}}// 0 минимум громкости 
   if(vol==0){att=72;}else{att=4;}
   if(w==1){audio();cl();time=millis();w=0;w1=1;}
  lcd.setCursor(0,0);lcd.print("Volume   ");
  lcd.print(-47+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);}
 }
 ///////////////////////////////////////////////////////////
 
  // индикация тембр BЧ + управление кнопками //////////////
   if(menu==2){
   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==3){
   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*2));lcd.print(" dB ");
  lcd.print(" <>  ");
   if(balans>=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;}
 }
 /////////////////////////////////////////////////////////////
 
 /////////// 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(3,treb+7);
     EEPROM.update(5,in);
     EEPROM.update(6,gain1);EEPROM.update(7,gain2);
  menu=0;w1=0;cl();in_d=0;
 }
 }
 
 void g1(){if(in==1){gain=gain1;}if(in==2){gain=gain2;}}
 void g2(){if(in==1){gain1=gain;}if(in==2){gain2=gain;}}
 void cl(){delay(200);lcd.clear();}
 
void audio(){
  tda.setInput(in); //         int 1...2 //// номер входа
  tda.inputGain(gain); //        int 0...15 (шаг 2дБ)    0...30 дБ  //// усиление
  tda.setVolume(vol); //       int 0...47 (шаг 1 дБ)  -47...0 дБ  //// громкость
  tda.setBass(bass); //          int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр НЧ
  tda.setTreble(treb); //        int -7...+7 (шаг 2 дБ) -14...14 дБ //// тембр ВЧ
  tda.setAttL(att-balans); //          int 0...79 (шаг 1дБ)    
  tda.setAttR(att+balans); //          int 0...79 (шаг 1дБ)    
}


Тестирование скетча tda7449 + энкодер + ИК пульт — http://forum.rcl-radio.ru/viewtopic.php?id=30

Тестирование скетча tda7449 + энкодер + ИК пульт + анализатор спектра — http://forum.rcl-radio.ru/viewtopic.php?pid=43#p43

Comments

  1. Hi Liman,
    I assembled this project. It didn’t work. The Arduino sketch worked well seperately without connecting to the TDA 7449 preamp.But when I connect the SDA,SCL pins to Arduino,the LCD display freezes and buttons don’t respond.I tried connecting pull up resistor of 2.2k from SDA and SCL to 5 voLT.with this,the LCD and buttons work even with SDA and SCL input, but there’s no sound. I checked all connections.The chip is new one.Any help?

  2. Superb!!.You correctly said..I missed the Arduino and tda ground.Now it works great!!.Very Happy with the performance! My first arduino project is successful because of this great website. Many Thanks. I did same grounding mistake with My pt2322 also. I will check my pt2322 project also… I will soon be making 7439 project also. Only problem is I don’t have a PCB design for toner transfer. Doing a perfboard layout is difficult since it is SDIP. Anyway, many Thanks. One request.How to add a frequency spectrum to this sketch? I found one for encoder version. But not for button controlled version..

  3. Спасибо, собрал всё заработало.Память специально не чистил — прошёл последовательно по пунктам меню и кнопкой минус уменьшил значения имеющихся там чисел до нормы.
    Возник небольшой вопрос- как увеличить задержку кнопки «меню»?
    А то чуть нажмёшь на эту кнопку и сразу проскакиваешь несколько пунктов меню.

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

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