Аудиопроцессор TEA6320 (Arduino)

TEA6320 представляет собой четырехканальный аудиопроцессор с цифровым управлением. TEA6320 преобразует стерео сигнал в четырех канальный (квадро). Аудиопроцессор позволяет производить регулировку уровня звука в каждом канале отдельно и во всех каналах одновременно, а также имеется возможность регулировать тембр по низким и высоким частотам.

Основные характеристики:

  • Напряжение питания  от 7,5 до 9,5 В (8,5 В — рекомендуемое)
  • Ток потребления 26 мА
  • Разделение каналов 96 дБ
  • КНИ не более 0,05 %
  • Отношение сигнал/шум 105 дБ
  • Регулировка громкости от -31 до 20 дБ (шаг 1 дБ)
  • Регулировка тембра НЧ от -15 до +15 дБ (шаг 1,5 дБ)
  • Регулировка тембра ВЧ от -12 до +12 дБ (шаг 1,5 дБ)
  • Отдельная регулировка выхода для каждого канала от -55 до 0 дБ (шаг 1 дБ)
  • Режим MUTE (внешняя и программная активация)
  • Режим тонкомпенсации
  • 4-х канальный селектор входов

*библиотека не поддерживает вход MONO

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

#include <Wire.h>
#include <TEA6320.h>
  TEA6320 tea;
 
void setup(){ 
  Serial.begin(9600);Wire.begin();
  audio();
}
 
void loop(){}
 
void audio(){
  tea.setVol_Loud(0,0); // vol = -31...+20 дБ = int -31...20 | loud = 0 off, 1 on 
  tea.setBallance(0,0);   // 0...3  FR FL RR RL  ||  -55...0 дБ = int -55...0
  tea.setBallance(1,0);   
  tea.setBallance(2,0);
  tea.setBallance(3,0); 
  tea.setBass(0);         //-15...+15 дБ = int -10...10
  tea.setTreb(0);         //-12...+12 дБ = int -8...8
  tea.setInput(0,0);        //int 0...3 | mute
}

 

Далее показан пример скетча в котором в качестве регулировки всех основных параметров  используется энкодер KY-040 и две кнопки. При помощи энкодера осуществляется регулировка громкости, тембра, и уровень громкости каждого выхода. Две отдельные кнопки отвечают за переключение входов и активацию функции MUTE.

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

Плата Arduino Nano аудиопроцессор TEA6320 обмениваются данными на шине 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 <TEA6320.h>
  TEA6320 tea;
  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 menu,w,vol,vol_d,z,bass,bass_d,treb,treb_d,vol_fr,vol_fr_d,vol_fl,vol_fl_d,vol_rr,vol_rr_d,vol_rl,vol_rl_d,in,mute,m;
 
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
   pinMode(11,INPUT);// MUTE
   MsTimer2::set(1, to_Timer);MsTimer2::start();
   vol = EEPROM.read(0)-31;bass = EEPROM.read(1)-10;treb = EEPROM.read(2)-8;in = EEPROM.read(7);
   vol_fr = EEPROM.read(3)-55;vol_fl = EEPROM.read(4)-55;vol_rr = EEPROM.read(5)-55;vol_rl = EEPROM.read(6)-55;
  audio();
}
 
void to_Timer(){newPosition = myEnc.read()/4;}
 
void loop(){
   if((analogRead(A0)<900)){menu++;cl();myEnc.write(0);time=millis();w=1;if(menu>6){menu=0;}}// меню
 
    //////////////////////////////////////// Volume -31...20 дБ //////////////////////////////////////
 if(menu==0){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol=vol+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol>20){vol=20;}if(vol<-31){vol=-31;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Volume   ");
  lcd.print(vol);lcd.setCursor(13,0);lcd.print("dB");vol_d=(vol+31)/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);}}
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
/////////////////////// индикация тембр НЧ -15...15 дБ ///////////////////
   if(menu==1){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    bass=bass+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(bass>10){bass=10;}if(bass<-10){bass=-10;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("Bass    ");
  lcd.print((float)bass*1.5,1);lcd.setCursor(13,0);lcd.print("dB");bass_d=bass/2+5;
   if(bass_d>=0){for(z=0;z<=bass_d;z++){lcd.setCursor(z+2,1);lcd.write((uint8_t)0);}}
 }
/////////////////////////////////////////////////////////////////////////////////////
 
/////////////////////// индикация тембр ВЧ -12...12 дБ ///////////////////
   if(menu==2){
     if (newPosition != oldPosition) {
    oldPosition = newPosition;
    treb=treb+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(treb>8){treb=8;}if(treb<-8){treb=-8;}audio();} 
 
  lcd.setCursor(0,0);lcd.print("Treble  ");
  lcd.print((float)treb*1.5,1);lcd.setCursor(13,0);lcd.print("dB");treb_d=treb/2+4;
   if(treb_d>=0){for(z=0;z<=treb_d;z++){lcd.setCursor(z+3,1);lcd.write((uint8_t)0);}}
 }
/////////////////////////////////////////////////////////////////////////////////////
 
    //////////////////////////////////////// Vol FR -55...0 дБ //////////////////////////////////////
 if(menu==3){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol_fr=vol_fr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol_fr>0){vol_fr=0;}if(vol_fr<-55){vol_fr=-55;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Vol_FR   ");
  lcd.print(vol_fr);lcd.setCursor(13,0);lcd.print("dB");vol_fr_d=(vol_fr+55)/2;
   if(vol_fr_d>=0){for(z=0;z<=vol_fr_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol_fr_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}}
//////////////////////////////////////////////////////////////////////////////////////////////////////
 
    //////////////////////////////////////// Vol FL -55...0 дБ //////////////////////////////////////
 if(menu==4){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol_fl=vol_fl+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol_fl>0){vol_fl=0;}if(vol_fl<-55){vol_fl=-55;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Vol_FL   ");
  lcd.print(vol_fl);lcd.setCursor(13,0);lcd.print("dB");vol_fl_d=(vol_fl+55)/2;
   if(vol_fl_d>=0){for(z=0;z<=vol_fl_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol_fl_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}}
////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
    //////////////////////////////////////// Vol RR -55...0 дБ //////////////////////////////////////
 if(menu==5){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol_rr=vol_rr+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol_rr>0){vol_rr=0;}if(vol_rr<-55){vol_rr=-55;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Vol_RR   ");
  lcd.print(vol_rr);lcd.setCursor(13,0);lcd.print("dB");vol_rr_d=(vol_rr+55)/2;
   if(vol_rr_d>=0){for(z=0;z<=vol_rr_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol_rr_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}}
////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
    //////////////////////////////////////// Vol RL -55...0 дБ //////////////////////////////////////
 if(menu==6){
    if (newPosition != oldPosition) {
    oldPosition = newPosition;
    vol_rl=vol_rl+newPosition;myEnc.write(0);newPosition=0;lcd.clear();time=millis();w=1;if(vol_rl>0){vol_rl=0;}if(vol_rl<-55){vol_rl=-55;}audio();}
 
  lcd.setCursor(0,0);lcd.print("Vol_RL   ");
  lcd.print(vol_rl);lcd.setCursor(13,0);lcd.print("dB");vol_rl_d=(vol_rl+55)/2;
   if(vol_rl_d>=0){for(z=0;z<=vol_rl_d;z++){lcd.setCursor(z/2,1);lcd.write((uint8_t)0);}}
   if((vol_rl_d)%2==0){lcd.setCursor(z/2,1);lcd.write((uint8_t)1);}}
////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
 
////////////////////////////////////////////////////////////////////////////////
  if(digitalRead(12)==HIGH){in++;if(in>3){in=0;}audio();cl();lcd.setCursor(0,0);lcd.print("    INPUT  ");lcd.print(in+1);delay(2000);cl();time=millis();w=1;}// in
  if(digitalRead(11)==HIGH){mute++;if(mute>1){mute=0;}audio();cl();}// mute
  if(mute==1){m=1;cl();lcd.setCursor(0,0);lcd.print("      MUTE     ");delay(300);menu=100;}// mute
  if(mute==0&&m==1){cl();menu=0;m=0;}
 
   if(millis()-time>10000 && w==1){
     EEPROM.update(0,vol+31);
     EEPROM.update(1,bass+10);
     EEPROM.update(2,bass+8);
     EEPROM.update(3,vol_fr+55);EEPROM.update(4,vol_fl+55);EEPROM.update(5,vol_rr+55);EEPROM.update(6,vol_fl+55);
     EEPROM.update(7,in);
     cl();menu=0;w=0;}
 
}
 
void cl(){delay(300);lcd.clear();}
void audio(){
  tea.setVol_Loud(vol,0); // vol = -31...+20 дБ = int -31...20 | loud = 0 off, 1 on 
  tea.setBallance(0,vol_fr);   // 0...3  FR FL RR RL  ||  -55...0 дБ = int -55...0
  tea.setBallance(1,vol_fl);   
  tea.setBallance(2,vol_rr);
  tea.setBallance(3,vol_rl); 
  tea.setBass(bass);         //-15...+15 дБ = int -10...10
  tea.setTreb(treb);         //-12...+12 дБ = int -8...8
  tea.setInput(in,mute);        //int 0...3 | mute
}

datasheet  — tea6320.pdf


Библиотеки:

TEA6320.zip

MsTimer2.ZIP

Encoder.zip

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

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