TDA7448 — шести канальный регулятор громкости (Arduino)

ИМС TDA7448 представляет собой шести канальный регулятор громкости, регулировка громкости независимая для каждого канала.

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

  • Напряжение питания от 4,75 до 10 В (9 рекомендуемое)
  • Ток потребления 7 мА
  • Максимальное входное напряжение (THD = 0.3%) 2.5 Vrms
  • Отношение сигнал / шум 100 дБ
  • Частотный диапазон от 20 до 20000 Гц
  • КНИ при входном напряжении 1Vrms не более 0,01%
  • Диапазон регулировки громкости от -79 до 0 дБ

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

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

Библиотека — TDA7448.zip

Тестовый скетч

#include <Wire.h>
#include <TDA7448.h>
 TDA7448 tda;
 
 void setup(){Wire.begin();}
 
 void loop(){
  audio_tda();
  delay(1000);
  }
 void audio_tda(){
  tda.setAtt(1,0);// 0 макс громк, -79(79) мин громк
  tda.setAtt(2,0);
  tda.setAtt(3,0);
  tda.setAtt(4,0);
  tda.setAtt(5,0);
  tda.setAtt(6,0);
  }

tda.setAtt(1,0) : первый параметр номер канала, второй параметр уровень ослабления сигнала от 0 до -79 дБ

TDA7448.pdf

Пример использования библиотеки

Дополнительные библиотеки

MsTimer2.ZIP

Encoder.zip

#include <Wire.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <TDA7448.h>
 TDA7448 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,0b10101,0b10101,0b10101,0b10101,0b10101,0b10101,0b00000};
   byte a2[8]={0b00000,0b10100,0b10100,0b10100,0b10100,0b10100,0b10100,0b00000};
   byte a3[8]={0b00000,0b10000,0b10000,0b10000,0b10000,0b10000,0b10000,0b00000};
   unsigned long newPosition,time,oldPosition  = -999;
   int vol1,vol2,vol3,vol4,vol5,vol6,vol1_d,vol2_d,vol3_d,vol4_d,vol5_d,vol6_d;
   int w,w2,menu,z,z0,z1;
 
 void setup(){
 Wire.begin();
 lcd.begin(16, 2);
 lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3);
   vol1 = -EEPROM.read(0);
   vol2 = -EEPROM.read(1);
   vol3 = -EEPROM.read(2);
   vol4 = -EEPROM.read(3);
   vol5 = -EEPROM.read(4);
   vol6 = -EEPROM.read(5);
 pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA
   MsTimer2::set(3, to_Timer);MsTimer2::start();
   lcd.setCursor(0,0);lcd.print("    TDA7448    ");delay(1000);lcd.clear();audio_tda();
 }
 
 void loop(){
   if(analogRead(A0)<900){menu++;cl();myEnc.write(0);time=millis();w=1;w2=1;if(menu>5){menu=0;}}// меню
 
    if(menu==0){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol1=vol1+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol1>0){vol1=0;}if(vol1<-79){vol1=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 1    ");
  lcd.print(" ");lcd.print(vol1);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol1_d=vol1+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol1_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
   if(menu==1){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol2=vol2+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol2>0){vol2=0;}if(vol2<-79){vol2=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 2    ");
  lcd.print(" ");lcd.print(vol2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol2_d=vol2+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol2_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
   if(menu==2){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol3=vol3+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol3>0){vol3=0;}if(vol3<-79){vol3=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 3    ");
  lcd.print(" ");lcd.print(vol3);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol3_d=vol3+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol3_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
   if(menu==3){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol4=vol4+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol4>0){vol4=0;}if(vol4<-79){vol4=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 4    ");
  lcd.print(" ");lcd.print(vol4);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol4_d=vol4+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol4_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
   if(menu==4){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol5=vol5+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol5>0){vol5=0;}if(vol5<-79){vol5=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 5    ");
  lcd.print(" ");lcd.print(vol5);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol5_d=vol5+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol5_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
   if(menu==5){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol6=vol6+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;if(vol6>0){vol6=0;}if(vol6<-79){vol6=-79;}audio_tda();}
  lcd.setCursor(0,0);lcd.print("Vol 6    ");
  lcd.print(" ");lcd.print(vol6);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol6_d=vol6+48;
    if(w2==1){
   for(z=0,z0=0,z1=0;z<=vol6_d;z++,z1++){if(z1>2){z1=0;z0++;}
   if(z1==1){lcd.setCursor(z0,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1,1);lcd.print(" ");}}
   if(z1==3){lcd.setCursor(z0,1);lcd.write((uint8_t)1);}
   if(z1==2){lcd.setCursor(z0,1);lcd.write((uint8_t)2);}w2=0;}}
 
 
   if(millis()-time>10000 && w==1){
     EEPROM.update(0,abs(vol1));
     EEPROM.update(1,abs(vol2));
     EEPROM.update(2,abs(vol3));
     EEPROM.update(3,abs(vol4));
     EEPROM.update(4,abs(vol5));
     EEPROM.update(5,abs(vol6));
     w=0;}
  }
 void audio_tda(){
  tda.setAtt(1,vol1); // 0 макс громк, -79(79) мин громк
  tda.setAtt(2,vol2);
  tda.setAtt(3,vol3);
  tda.setAtt(4,vol4);
  tda.setAtt(5,vol5);
  tda.setAtt(6,vol6);
  }
 void cl(){delay(300);lcd.clear();}
 void to_Timer(){newPosition = myEnc.read()/4;}

Доработка — общий регулятор громкости + 6-и канальный аттенюатор от -20 до 0 дБ. — http://forum.rcl-radio.ru/viewtopic.php?pid=3051#p3051

Comments

    1. Скетч что касаемо энкодера, отправка команд на TDA7448 и экрана протестировано, видео опубликовано. Не протестировано мной реагирование на команды TDA7448, но протестировано другим пользователем.
      В вашем случае, необходимо полностью проверить правильность подключения экрана и энкодера. В скетче все указано:
      7, 6, 2, 3, 4, 5 // RS,E,D4,D5,D6,D7 для экрана
      9, 8 // CLK, DT для энкодера + А0 кнопка энкодера

      http://rcl-radio.ru/?p=42773

      Перед заливкой скетча с экраном, как правило тестируют первый тестовый скетч, проверяют работоспособность TDA, в ручную меняют громкость всех каналов:
      tda.setAtt(1,0);// 0 макс громк, -79(79) мин громк
      tda.setAtt(2,0);
      tda.setAtt(3,0);
      tda.setAtt(4,0);
      tda.setAtt(5,0);
      tda.setAtt(6,0);

      Только потом, если тест прошел удачно, подключают экран и энкодер.

    1. Как Вы видит реализацию этой функции, переключение входов кнопкой? Или как то по другому, а индикация входа, светодиоды, вывод на экран?

            1. Можно, но только если поканальная регулировка будет иметь ограничение, например от 0 до -20 дБ. Тогда регулировка громкости будет от -59 до 0 дБ, вместо -79 до 0.

                    1. Я создам тему на форуме и оставлю ссылку в этой статье.

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

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