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

Темброблок на 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);
 }

Видео

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

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

  • УМЗЧ 40Вт/8Ом

    УМЗЧ 40Вт/8Ом

    Характеристики: Номинальная выходная мощность на нагрузке 8 Ом 40Вт Коэффициент гармоник 0,008% Полоса рабочих частот 20…70000Гц Отношение сигнал шум( не взвешенное) 100дБ Напряжение питания +/-30В Ток покоя 20 мА VT1 и VT6 образуют дифференциальный усилитель с источником постоянного тока на VT4. Нагрузка входного каскада — VT3 VT2 и VT5 образующие …Подробнее...
  • Универсальный адаптер для питания плеера

    Данный адаптер обеспечивает на выходе напряжение 3В при изменении питающего напряжения в пределах 110-220В и при питании от постоянного напряжения от 6 до 15В. При этом ток на нагрузке достигает 0,25А, температурный коэффициент не более 2 мВ на 1 градус Цельсия. Стабилизатор имеет защиту от КЗ на нагрузке, при этом …Подробнее...
  • Параметры, типовой режим и цоколевки электровакуумных приборов широкого применения (кенотороны и диоды)

    Литература РА1998_08Подробнее...
  • Устройство включения ламп накаливания

    Сопротивление холодной нити лампы накаливания в 8…10 раз меньше по сравнению с сопротивлением при номинальном режиме работы, что приводит к ускоренному разрушению нити накала. Для увеличения срока службы лампы накаливания можно применить не сложное уст-во, оно ограничивает ток на несколько секунд во время включения лампы, после чего нить лампы нагревается …Подробнее...
  • Простейший усилитель 3Вт

    Простейший усилитель 3Вт

    Усилитель основан на микросхеме TDA7056. Данная микросхема может работать при низком напряжении питания от 3В до 18В. Микросхема имеет защиту от КЗ выхода. Частотный диапазон от 20 до 20000Гц, КНИ не более 0,25% при выходной мощности 0,5Вт. На рисунке показана схема подключения микросхемы, при нагрузке 16 Ом выходная мощность будет …Подробнее...