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

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 пункта меню — громкость, тембр ВЧ, тембр НЧ, коммутатор входов.

 

Для нормальной работы скетча Вам понадобятся дополнительные библиотеки:

 

#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
}

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=15

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

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