| Ваш IP: 35.175.121.230 | Online(30) - гости: 9, боты: 21 | Загрузка сервера: 0.53 ::::::::::::


Регулятор громкости и тембра на 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
}

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

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

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

  • Схема мигания лампы

    Схема мигания лампы

    Схема работает от постоянного напряжения 12В. Основу схемы составляют два транзистора BC557 и MOSFET IRF530. Максимальная мощность подключенной лампы (ламп) 42Вт. Все конденсаторы на напряжение не менее 25В. Время мигания лампы определяется емкостью С2.   На втором рисунке показана аналогичная схема, максимальная мощность подключенной лампы (ламп) не более 10Вт. Оригинал статьи — http://www.circuitstoday.com/12v-lamp-flasher-circuitПодробнее...
  • ТРИ НАПРЯЖЕНИЯ от одной «кроны»

    Применение в переносной аппаратуре операционных усилителей (ОУ) сразу же ставит задачу — каким обра­зом запитать их двуполярным напряжением +15 В. По­добный вопрос возникает потому, что в справочных ма­териалах параметры большинства ОУ приведены именно для этих питающих напряжений, и у многих радиолюби­телей создается впечатление, что ОУ могут хорошо рабо­тать лишь в …Подробнее...
  • Математические операторы (Arduino)

    Математические операторы (Arduino)

    +, -, *, / — сложить, вычесть, умножить, разделить pow(x, a); — возвести «х» в степень «а» ( x a ), pow может возводить в дробную степень sq(x); — возвести число «х» в квадрат ( x 2 ) sqrt(x); — взять квадратный корень числа «х» abs(x); — найти модуль числа, …Подробнее...
  • Улучшенный приемник прямого усиления на одной микросхеме

    Приемник состоит из магнитной антенны, двухкаскадного усилителя радиочастоты на логических элементах D1.1 D1.2, диодного детектора ЗЧ и усилителя ЗЧ на логических элементах D1.3-D1.6. В схеме использован детектор с удвоением напряжения, это позволяет получить лучшее подавление несущей частоты и подать декретированный сигнал прямо на вход усилителя ЗЧ. R3 — регулятор громкости, …Подробнее...
  • Мелодичный квартирный звонок

    В основе схемы звонка лежит мультивибратор на лог. элементах, частота генерации которого скачкообразно изменяется. Основной мультивибратор D1.1 D1.2. Его частота зависит от С1 и сопротивления резистора включенного между входом и выходом первого элемента. Параллельно этому резистору (R1) подключен R2. Роль переключателя выполняет один из каналов мультиплексора D2. Таким образом, когда …Подробнее...