TDA7317 – стереофонический 5-полосный эквалайзер с цифровым управлением, позволяющий осуществлять регулировку уровня звука и тембра в пяти полосах 60 Гц, 260 Гц, 1 кГц, 3 кГц, 10 кГц. В связке с Arduino TDA7317 можно сделать функциональный предварительный усилитель с регулировкой тембра по пяти полосам, а если добавить аудиопроцессор например TDA7313 или TDA7318, то помимо регулировки тембра добавятся дополнительные функции, например коммутатор входов, регулятор громкости и баланса, предусилитель.
Технические характеристики TDA7317
- Напряжение питания от 6 до 10 В (9 В рекомендуемое)
- Ток потребления от 8 до 20 мА (в зависимости от напряжения питания)
- Диапазон воспроизводимых частот от 20 до 20000 Гц
- Шаг регулировки тембра 2 дБ (14 шагов от -7 до +7)
- Максимальный уровень входного сигнала 2,5 В
- КНИ на частоте 1 кГц не более 0,01 %
- Отношение сигнал/шум 100 дБ
- Разделение каналов на частоте 1 кГц 100 дБ
- Регулировка громкости -17.625 до 0 дБ (шаг 0.375, 47 шагов регулировки)
Рекомендуемая схема подключения
Библиотека https://github.com/liman324/TDA7317.git при помощи Arduino позволяет осуществлять регулировку параметров TDA7317.
Тестовый скетч
#include <Wire.h> #include <TDA7317.h> TDA7317 tda; void setup(){ Serial.begin(9600);Wire.begin(); audio(); } void loop(){} void audio(){ tda.setVolume(47); // громкость 0...47 tda.setBand(0,0); // номер полосы, дБ (-7...+7) tda.setBand(1,0); tda.setBand(2,0); tda.setBand(3,0); tda.setBand(4,0); }
Выход 18 (ADDR) ИМС TDA7317 при использовании данной библиотеки не замкнут на землю.
tda7317.pdf
Следующий пример скетча позволяет управлять 5- полосным эквалайзером при помощи энкодера KY-040, информация о состоянии настроек эквалайзера выводится на LCD дисплея LCD1602 на базе контроллера HD44780.
При нажатии на кнопку и поворачивая ручку энкодера можно менять настройки регулировок эквалайзера по пяти полосам. Все настройки эквалайзера сохраняются в энергонезависимой памяти.
Плата Arduino Nano аудиопроцессор TDA7317 обмениваются данными на шине I2C по линиям SDA (data — данные) и SCL (clock — синхронизация).
Для работы скетча Вам понадобятся дополнительные библиотеки:
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
#include <Wire.h> #include <TDA7317.h> #include <MsTimer2.h> #include <LiquidCrystal.h> #include <Encoder.h> #include <EEPROM.h> TDA7317 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,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,z,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 MsTimer2::set(1, to_Timer);MsTimer2::start(); band1 = EEPROM.read(0)-7;band2 = EEPROM.read(1)-7;band3 = EEPROM.read(2)-7;band4 = EEPROM.read(3)-7;band5 = EEPROM.read(4)-7; delay(500);audio();delay(100); } void to_Timer(){ //функция таймера newPosition = myEnc.read()/4;} void loop(){ if(analogRead(A0)<900){menu++;cl();myEnc.write(0);time=millis();w=1;if(menu>4){menu=0;}}// меню //////////////////////////////// 60 Hz ///////////////////////////////////////////////////////// if(menu==0){ 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==1){ 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==2){ 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==3){ 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==4){ 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(millis()-time>10000 && w==1){ EEPROM.update(0,band1+7); EEPROM.update(1,band2+7); EEPROM.update(2,band3+7); EEPROM.update(3,band4+7); EEPROM.update(4,band5+7); cl();menu=0;w=0;} }// loop void cl(){delay(300);lcd.clear();} void audio(){ tda.setVolume(47); // громкость 0...47 /////////// номер полосы, дБ (-7...+7) ////////// tda.setBand(0,band5); // 10000 Hz tda.setBand(1,band2); // 260 Hz tda.setBand(2,band3); // 1000 Hz tda.setBand(3,band4); // 3000 Hz tda.setBand(4,band1); // 60 Hz }
hello Mr. Alexander Liman,
I plan to use 2 different I2C bus on arduino to connect 2 chip TDA7317, then I have 10 bands equalizer, please help to show me how to configure it in arduino sketch,
Thank you in advance!
The library supports only one i2c address
I mean that, I use two I2C bus, each one connect one tda7317 that don’t change the address, please kindly see the sample in the attachment, thank you
This will not work either, the library does not support 2 i2c channels. The best method is to abandon the library and access audio processors directly via Wire.h on one bus.
oh I see, thanks you!