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

На аудиопроцессорах TDA7313 и TDA7317 под управление Arduino, можно собрать многофункциональный предварительный усилитель.

Микросхема TDA7313 имеет три стерео входа, регуляторы тембра НЧ и ВЧ, тонкомпенсация и четыре выхода (псевдоквадро). TDA7317 представляет собой стереофонический 5-полосный эквалайзер с цифровым управлением, позволяющий осуществлять регулировку тембра в пяти полосах 60 Гц, 260 Гц, 1 кГц, 3 кГц, 10 кГц. При совместной работе этих двух аудиопроцессоров получается предварительный усилитель со следующими характеристиками:

  • Напряжение питания 6…10 В (9 В рекомендуемое)
  • Диапазон воспроизводимых частот от 20 до 20000 Гц
  • Регулировка громкости от -78.75 до 0 дБ (0…63 уровня)
  • Регулировка предусилителя независимое для каждого входа от 0 до 11.25 дБ (шаг 3,75 дБ)
  • Регулировка аттенюаторов независимое для каждого выхода от -38.75 до 0 дБ (шаг 1,25 дБ)
  • Регулировка тембра по пяти полосам: 60 Гц, 260 Гц, 1 кГц, 3 кГц, 10 кГц
  • Шаг регулировки тембра 2 дБ (14 шагов от -7 до +7)
  • Коммутатор входов (3 стерео входа)

 

Управление предварительным усилителем осуществляется при помощи энкодера KY-040 и одной кнопки (коммутация входов).

Информация о состоянии основных параметров выводится на LCD дисплея LCD1602 на базе контроллера HD44780.

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

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

Все параметры заносятся в энергонезависимую память.

Регулировка предварительного усилителя разделено на два меню, основное — регулировка громкости и тембра и дополнительное — регулировка предусиления, аттенюаторы выходов, включение тонкомпенсации. Для перехода в дополнительное меню необходимо нажать и удерживать кнопку энкодера.

Для нормальной загрузки скетча Вам понадобятся следующие библиотеки:

#include <Wire.h>
#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <EEPROM.h>
#include <TDA7313.h>
#include <TDA7317.h>
  TDA7313 tda;TDA7317 tda1;
  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,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000};
   byte a2[8]={0b00000,0b11000,0b11000,0b11000,0b11000,0b11000,0b11000,0b00000};
   unsigned long newPosition,time,oldPosition  = -999;
   int vol,vol_d,menu,w,z,i,menu1,in,gain,gain1,gain2,gain3,loud,lr,rr,lf,rf;
   int band1,band1_d,band2,band2_d,band3,band3_d,band4,band4_d,band5,band5_d;
 
void setup(){ 
  Serial.begin(9600);Wire.begin();
  lcd.begin(16, 2);lcd.createChar(0,a1); lcd.createChar(1,a2);
   pinMode(A0,INPUT);// КНОПКА ЭНКОДЕРA
   pinMode(12,INPUT);// КНОПКА IN
     MsTimer2::set(1, to_Timer);MsTimer2::start();
     vol = EEPROM.read(0);in = EEPROM.read(3);
     gain1 = EEPROM.read(4);gain2 = EEPROM.read(5);gain3 = EEPROM.read(6);loud = EEPROM.read(7);
     lr = EEPROM.read(8);rr = EEPROM.read(9);lf = EEPROM.read(10);rf = EEPROM.read(11);
     band1 = EEPROM.read(100)-7;band2 = EEPROM.read(101)-7;band3 = EEPROM.read(102)-7;band4 = EEPROM.read(103)-7;band5 = EEPROM.read(104)-7;
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
      delay(500);audio();delay(100);
}
 
void to_Timer(){ //функция таймера
 newPosition = myEnc.read()/4;}
 
void loop(){
  if((analogRead(A0)<900)&&menu1==0){menu++;cl();myEnc.write(0);i++;time=millis();w=1;if(menu>5){menu=0;}}// меню
  if((analogRead(A0)>900)){i=0;}if(i>3){cl();lcd.print("     MENU 2     ");delay(500);cl();menu1=1;menu=100;}
  if((analogRead(A0)<900)&&menu1>0){menu1++;cl();myEnc.write(0);time=millis();w=1;if(menu1>6){cl();menu1=0;menu=0;}}// меню 1
  //////////////////////////////////////// Volume 0...63 дБ //////////////////////////////////////
 if(menu==0){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol>63){vol=63;}if(vol<0){vol=0;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Volume   ");
  lcd.print(-63+vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=(vol/2)-8;
   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);}
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
/////////////////////////////// 60 Hz /////////////////////////////////////////////////////////
    if(menu==1){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    band1=band1+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band1>7){band1=7;}if(band1<-7){band1=-7;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("60 Hz     ");
  lcd.print(band1*2);lcd.setCursor(13,0);lcd.print("dB");band1_d=band1+7;
   if(band1_d>=0){for(z=0;z<=band1_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}}
 
////////////////////////////// 260 Hz //////////////////////////////////////////////////////////
    if(menu==2){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    band2=band2+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band2>7){band2=7;}if(band2<-7){band2=-7;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("260 Hz     ");
  lcd.print(band2*2);lcd.setCursor(13,0);lcd.print("dB");band2_d=band2+7;
   if(band2_d>=0){for(z=0;z<=band2_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}}
 
////////////////////////////// 1000 Hz //////////////////////////////////////////////////////////
    if(menu==3){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    band3=band3+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band3>7){band3=7;}if(band3<-7){band3=-7;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("1000 Hz    ");
  lcd.print(band3*2);lcd.setCursor(13,0);lcd.print("dB");band3_d=band3+7;
   if(band3_d>=0){for(z=0;z<=band3_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}}
 
////////////////////////////// 3000 Hz //////////////////////////////////////////////////////////
    if(menu==4){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    band4=band4+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band4>7){band4=7;}if(band4<-7){band4=-7;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("3000 Hz    ");
  lcd.print(band4*2);lcd.setCursor(13,0);lcd.print("dB");band4_d=band4+7;
   if(band4_d>=0){for(z=0;z<=band4_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}}  
 
////////////////////////////// 1000 Hz //////////////////////////////////////////////////////////
    if(menu==5){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    band5=band5+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(band5>7){band5=7;}if(band5<-7){band5=-7;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("10000 Hz   ");
  lcd.print(band5*2);lcd.setCursor(13,0);lcd.print("dB");band5_d=band5+7;
   if(band5_d>=0){for(z=0;z<=band5_d;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}}}
//////////////////////////////////////////////////////////////////////////////////////////////////
 
  if(digitalRead(12)==HIGH){in++;lcd.clear();time=millis();w=1;if(in>2){in=0;}if(in<0){in=2;}audio();lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);delay(1000);}
 
///////////////////////////////////// GAIN //////////////////////////////////////////
 
 if(menu1==1){
      if(in==0){gain=gain1;}
      if(in==1){gain=gain2;}
      if(in==2){gain=gain3;}
 
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    gain=gain+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(gain>3){gain=3;}if(gain<0){gain=0;}audio();} 
 
      if(in==0){gain1=gain;}
      if(in==1){gain2=gain;}
      if(in==2){gain3=gain;}
 
  lcd.setCursor(0,0);lcd.print("IN ");lcd.print(in+1);lcd.print(" Gain ");lcd.print(gain);
 }
 /////////////////////////////// LOUDNESS //////////////////////////////////////////
 
  if(menu1==2){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    loud=loud+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(loud>1){loud=0;}if(loud<0){loud=1;}audio();}
    lcd.setCursor(0,0);lcd.print("LOUDNESS ");if(loud==1){lcd.print("ON ");}else{lcd.print("OFF");}
} 
////////////////////////////////// att  LR //////////////////////////////////////////////
 
   if(menu1==3){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lr=lr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lr>31){lr=31;}if(lr<0){lr=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker LR ");lcd.print(lr);
 }
 ////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////// att  LF //////////////////////////////////////////////
 
   if(menu1==4){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    lf=lf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(lf>31){lf=31;}if(lf<0){lf=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker LF ");lcd.print(lf);
 }
 ////////////////////////////////////////////////////////////////////////////////////////
  ////////////////////////////////// att  RF //////////////////////////////////////////////
 
   if(menu1==5){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rf=rf+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rf>31){rf=31;}if(rf<0){rf=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker RF ");lcd.print(rf);
 }
 ////////////////////////////////////////////////////////////////////////////////////////
   ////////////////////////////////// att  RR //////////////////////////////////////////////
 
   if(menu1==6){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    rr=rr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(rr>31){rr=31;}if(rr<0){rr=0;}audio();} 
    lcd.setCursor(0,0);lcd.print("Speaker RR ");lcd.print(rr);
 }
 ////////////////////////////////////////////////////////////////////////////////////////
 
 
 if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol);
     EEPROM.update(3,in);
     EEPROM.update(4,gain1);EEPROM.update(5,gain2);EEPROM.update(6,gain3);
     EEPROM.update(7,loud);
     EEPROM.update(8,lr);EEPROM.update(9,rr);EEPROM.update(10,lf);EEPROM.update(11,rf);
     EEPROM.update(100,band1+7);EEPROM.update(101,band2+7);EEPROM.update(102,band3+7);EEPROM.update(103,band4+7);EEPROM.update(104,band5+7);
     cl();menu=0;menu1=0;w=0;}
}//loop
 
void cl(){delay(300);lcd.clear();}
void audio(){
  tda.setVolume(vol); // громкость 0...63
  tda.setAttLR(lr);   // аттенюатор LR 0...31
  tda.setAttRR(rr);   // аттенюатор RR 0...31
  tda.setAttLF(lf);   // аттенюатор LF 0...31
  tda.setAttRF(rf);   // аттенюатор RF 0...31
  tda.setSwitch(in,loud,gain); // вход 0...2, тонкомпенсация 1 вкл 0 выкл, усиление 0...3
  tda.setBass(0);    // тембр НЧ -7...+7
  tda.setTreble(0);  // тембр ВЧ -7...+7
  tda1.setVolume(47); // громкость 0...47
  /////////// номер полосы, дБ (-7...+7) //////////
  tda1.setBand(0,band5);  // 10000 Hz
  tda1.setBand(1,band2);  // 260   Hz
  tda1.setBand(2,band3);  // 1000  Hz
  tda1.setBand(3,band4);  // 3000  Hz
  tda1.setBand(4,band1);  // 60    Hz
}

Comments

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

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