R2S15902FP — аудиопроцессор специально разработанный для домашних аудиосистем. Микросхема содержит 4 стерео аудиовхода и 6 выходных каналов (формат 5.1). Так же микросхема имеет регулировку тембра по низким и высоким частотам, предусилитель.
Для управления микросхемой R2S15902FP используется последовательный интерфейс с пакетной передачей данных.
Характеристики аудиопроцессора R2S15902FP:
- 6-и канальный независимый электронный регулятор громкости (от 0 до –99 дБ, шаг 1 дБ)
- 6-и канальный независимый регулятор усиления (от 0 до +14 дБ/ 2 дБ шаг)*
- 4-х канальный (стерео) селектор входного сигнала (предусилитель от 0 до +14 дБ, шаг 2дБ)***
- 6-и канальный вход FR, FL, SR, SL, CT, SW **
- Регулировка тембра НЧ от -14 к + 14 дБ, шаг 2 дБ
- Регулировка тембра ВЧ от -14 к + 14 дБ, шаг 2 дБ
- Встроенный выход АЦП (вход: 0/ -6/ -12/ –18dB)
- Встроенный блок L+R/ L-R
- Встроенный цифровой источник питания
- Напряжение питания от 8 до 10 В (9 В — рекомендуемое)
- Ток потребления 35 мА
- Коэффициент нелинейных искажений 0,005 % (BW: 400Hz to 30kHz, f = 1kHz, Vo = 0.5Vrms, RL = 10kΩ)
- Выходной шум 2 µVrms
- Разделение каналов селектора 90 дБ
- Разделение каналов 90 дБ
- * поддерживается библиотекой, но не поддерживается скетчем
- ** не поддерживается библиотекой
- *** вход №4 не поддерживается библиотекой
Библиотека — r2s15902fp.zip
Datasheet — r2s15902fp
Тестовый скетч:
#include <R2S15902FP.h> void setup(){ Serial.begin(9600); pinMode(DATA, OUTPUT); // D2 pinMode(CLK, OUTPUT); // D3 delay(100); } void loop(){ audio(); delay(1000); } void audio(){ Slot1(0,3,0,5,5,0); // input selector 1...3 === int 0...2 //REC-Output Gain Control int 0...6 dB === int 0...3 //ADC Input ATT 0...-6 dB === int 0...3 //bass int 0 === +14dB int 8 === 0dB int 15 === -14dB //treble int 0 === +14dB int 8 === 0dB int 15 === -14dB //Input Gain 0...14 dB === int 0...7 Slot2(3,10,3,10); // gain0, volume0, gain1, volume1 Slot3(3,10,3,10); // gain2, volume2, gain3, volume3 Slot4(3,10,3,10); // gain4, volume4, gain5, volume5 // gain 0...14 dB === int 0...7 // volume 0...-99 dB === int 0...100 }
На рисунке показана схема подключения R2S15902FP, она немного отличается от схемы указанной в Datasheet, в данном случае используется только 3 стерео входа, 6 канальный вход не используется, поэтому разделительные конденсаторы на 6 канальном входе не нужны, так же неактивен и не поддерживается вход IN4.
Далее показан простой пример применения R2S15902FP в качестве регулятора тембра и громкости на базе Arduino, информация выводится на LCD дисплей 1602 (I2C), а управление осуществляется при помощи энкодера. Управление очень простое и содержит всего 4 пункта меню — громкость, тембр ВЧ, тембр НЧ, коммутатор входов.
Для нормальной работы скетча Вам понадобятся дополнительные библиотеки:
- http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
- http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <R2S15902FP.h> #include <Encoder.h> #include <EEPROM.h> #include <MsTimer2.h> LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей Encoder myEnc(9, 8);// DT, CLK 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 time,oldPosition = -999,newPosition; int menu,vol,vol_d,treb,treb_d,bass,bass_d,in; byte w,w2,z,z0,z1; void setup(){ lcd.init();lcd.backlight();// Включаем подсветку дисплея lcd.setCursor(0,0);lcd.print(" R2S15902FP ");delay(2000); Serial.begin(9600); lcd.createChar(0,a1);lcd.createChar(1,a2);lcd.createChar(2,a3); pinMode(DATA, OUTPUT); // D2 pinMode(CLK, OUTPUT); // D3 pinMode(10,INPUT);// МЕНЮ КНОПКА SW энкодера MsTimer2::set(3, to_Timer);MsTimer2::start(); // АКТИВИРУЕМ ПРЕРЫВАНИЯ ДЛЯ ЭНКОДЕРА vol = EEPROM.read(0);treb = EEPROM.read(1);bass = EEPROM.read(2);in = EEPROM.read(3); delay(100);cl(); audio(); } void loop(){ if(digitalRead(10)==LOW){menu++;cl();time=millis();w=1;w2=1;if(menu>3){menu=0;}}// меню if(menu==0){ if (newPosition != oldPosition){oldPosition = newPosition; vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;vol_func();audio();} lcd.setCursor(0,0);lcd.print("VOLUME "); lcd.print(" ");lcd.print(-vol);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");vol_d=48-vol; if(w2==1){ for(z=0,z0=0,z1=0;z<=vol_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;}} ///////////////////////// TREBLE +/-14 dB ///////////////////////////////////////////////////////// if(menu==1){ if (newPosition != oldPosition) { oldPosition = newPosition; treb=treb+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;treb_func();audio();} lcd.setCursor(0,0);lcd.print("TREBLE "); lcd.print(" ");lcd.print(14-treb*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");treb_d=28-treb*2; if(w2==1){ for(z=0,z0=0,z1=0;z<=treb_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} ///////////////////////// BASS +/-14 dB ///////////////////////////////////////////////////////// if(menu==2){ if (newPosition != oldPosition) { oldPosition = newPosition; bass=bass+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w2=1;bass_func();audio();} lcd.setCursor(0,0);lcd.print("BASS "); lcd.print(" ");lcd.print(14-bass*2);lcd.print(" ");lcd.setCursor(13,0);lcd.print("dB");bass_d=28-bass*2; if(w2==1){ for(z=0,z0=0,z1=0;z<=bass_d;z++,z1++){if(z1>2){z1=0;z0++;} if(z1==1){lcd.setCursor(z0+3,1);lcd.write((uint8_t)0);lcd.setCursor(z0+1+3,1);lcd.print(" ");}} if(z1==3){lcd.setCursor(z0+3,1);lcd.write((uint8_t)1);} if(z1==2){lcd.setCursor(z0+3,1);lcd.write((uint8_t)2);}w2=0;}} ///////////////////// IN ///////////////////////////////////////////////////////////////////////// if(menu==3){ if (newPosition != oldPosition) { oldPosition = newPosition; in=in-newPosition;myEnc.write(0);newPosition=0;time=millis();cl();w=1;w2=1;in_func();audio();} lcd.setCursor(0,0);lcd.print("INPUT ");lcd.print(in+1); } if(millis()-time>10000 && w==1){ EEPROM.update(0,vol);EEPROM.update(1,treb);EEPROM.update(2,bass);EEPROM.update(3,in); menu=0;w=0;w2=1;cl();} } void in_func(){if(in>2){in=0;}if(in<0){in=2;}} void bass_func(){if(bass>14){bass=14;}if(bass<0){bass=0;}} void treb_func(){if(treb>14){treb=14;}if(treb<0){treb=0;}} void vol_func(){if(vol<0){vol=0;}if(vol>99){vol=99;}} void cl(){delay(300);lcd.clear();} void to_Timer(){newPosition = myEnc.read()/4;} void audio(){ Slot1(in,0,0,bass,treb,0); // input selector 1...3 === int 0...2 //REC-Output Gain Control int 0...6 dB === int 0...3 //ADC Input ATT 0...-6 dB === int 0...3 //bass int 0 === +14dB int 8 === 0dB int 15 === -14dB //treble int 0 === +14dB int 8 === 0dB int 15 === -14dB //Input Gain 0...14 dB === int 0...7 Slot2(0,vol,0,vol); // gain0, volume0, gain1, volume1 Slot3(0,vol,0,vol); // gain2, volume2, gain3, volume3 Slot4(0,vol,0,vol); // gain4, volume4, gain5, volume5 // gain 0...14 dB === int 0...7 // volume 0...-99 dB === int 0...100 }