STA333BW + 0.96′ OLED — цифровой усилитель 2х20 Вт (Arduino)

S/PDIF (Sony/Philips Digital Interface) – распространенный и стандартизированный интерфейс, предназначенный для передачи цифрового звука между доступными компонентами, звуковыми картами, ресиверами и аудиоаппаратурой.

I2S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств. Применяется для передачи PCM-аудиоданных между интегральными схемами в электронном устройстве. Шина I2S передает по разным линиям сигналы синхронизации и сигналы данных, что приводит к снижению фазового дрожания, типичного для систем связи, восстанавливающих сигналы синхронизации из целого потока.

STA333BW — полнофункциональный цифровой аудио усилитель (класса D), включающий силовой каскад для
системы стерео усилителей. В STA333BW интегрирована система цифровой обработки аудиосигнала (ЦАП), высокоточный цифровой ШИМ-модулятор и два мощных полномостовых каскада питания МОП-транзисторов.

STA333BW поддерживает формат передачи цифровых данных I2S (I²S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств) с частотой дискретизации от 8 кГц до 192 кГц, с разрешением до 24 бит.

Усилитель может работать в нескольких режимах подключения нагрузки:

В статье будет рассмотрен только первый вариант подключения нагрузки к усилителю (выход 2.0 — 2х20 Вт при напряжении питания 18 В).

Усилитель выдает 2 x 20 Вт, оснащен цифровым регулятором громкости, баланса, регуляторы тембра ВЧ и НЧ, регулятор полосы НЧ, de-emphasis, так же доступны функции MUTE и STANDBY.

Структурная схема усилителя

Ресивер S/PDIF собран на ИМС DIR9001, так как вход DIR9001 имеет вход уровня TTL, сигнал S/PDIF подается через преобразователь интерфейса MAX485. DIR9001 поддерживает формат I2S, 24 бит, частота дискредитации 96 кГц.

Для вывода информации о настройках используется дисплей 0.96′ I2C 128X64 OLED. Управление OLED дисплеем в данном примере осуществляется при помощи шины I2C.

Параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Основные параметры усилителя STA333BW

  • Напряжение питания цифровое и аналоговое 3,3 В
  • Напряжение питания для выходного каскада усилителя от 4.5 В to 21.5 В
  • Режим работы 2.0 и 2.1 (в данном примере рассматривается режим работы 2.0)
  • Выходная мощность в режиме 2.0 … 2 x 20 Вт (8 Ом 18 В)
  • Выходная мощность в режиме 2.1 … 2 x 9 Вт + 1 х 20 Вт (8 Ом 18 В)
  • Динамический диапазон 100 дБ
  • Частота дискредитации от 32 до 192 кГц
  • Управление цифровое I2C
  • Регулировка громкости от -80 до 48 дБ с шагом 0,5 дБ
  • Регулировка тембра ВЧ НЧ ±12 дБ с шагом 2 дБ
  • Регулировка полосы НЧ от 80 до 340 Гц (14 шагов)
  • Коэффициент гармоник не более 0,2 % (Po = 1 W f = 1 kHz)
  • КПД 90% в режиме 2.0
  • Зашита от перегрева и токовая защита

Схема ресивера

Схема усилителя

Схема управления

Схема источника питания

Для управления работой усилителя используется плата Arduino Nano, две кнопки и энкодер (модуль KY-040), так же управление полностью продублировано ИК пультом, информация о текущих настройка отображается на дисплее 0.96′ OLED.

На дисплей выводится пять меню, переключение меню осуществляется при помощи кнопки энкодера.

Меню громкости

Bass

Treble

Частота Bass

Баланс

Дополнительные функции

STANDBY (ток потребления усилителя в режиме STANDBY 0.3 мкА)

MUTE

De-emphasis

ИК пульт дублирует работу энкодера и кнопок. Для управления усилителем подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:

#define IR_1 0x2FDD02F // Кнопка menu up
#define IR_2 0x2FD32CD // Кнопка menu dw
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FDF00F // Кнопка MUTE
#define IR_6 0x2FD00FF // Кнопка STANDBY (POWER)
#define IR_7 0x2FD6A95 // DEMP

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

#define I2C_STA333 0x1C // Address chip | PIN_SA = GND 
 
#define IR_1 0x2FDD02F // Кнопка menu up
#define IR_2 0x2FD32CD // Кнопка menu dw
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FDF00F // Кнопка MUTE
#define IR_6 0x2FD00FF // Кнопка STANDBY (POWER)
#define IR_7 0x2FD6A95 // DEMP
 
#include <Wire.h>
#include <OLED_I2C.h>           // http://rcl-radio.ru/wp-content/uploads/2022/01/OLED_I2C.zip
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip    
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip       
#include <boarddefs.h>          // входит в состав библиотеки IRremote
#include <IRremote.h>           // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 
 OLED  myOLED(SDA, SCL, 8);
 IRrecv irrecv(12); // указываем вывод модуля IR приемника
 Encoder myEnc(9, 8);// DT, CLK
 decode_results ir; 
 
 int bass_q=3,bass,treb,vol,menu,ball;
 extern uint8_t SmallFont[],BigNumbers[];
 unsigned long times,oldPosition  = -999,newPosition;
 bool www,w,w2,gr1,gr2,mute,power,demp;
 
 
void setup() {
  Wire.begin();Serial.begin(9600);irrecv.enableIRIn();
  myOLED.begin();
  myOLED.setBrightness(100);
  pinMode(4,OUTPUT);               // RESET
  pinMode(5,OUTPUT);               // PWRDN
  digitalWrite(4,LOW);delay(10);   // RESET 
  digitalWrite(4,HIGH);delay(10);  // RESET 
  digitalWrite(5,HIGH);delay(10);  // PWRDN
  pinMode(10,INPUT);               // КНОПКА SW энкодера
  pinMode(A0,INPUT_PULLUP);        // КНОПКА MUTE
  pinMode(A1,INPUT_PULLUP);        // КНОПКА POWER
  pinMode(13,OUTPUT);              // ВЫХОД УПРАВЛЕНИЯ STANDBY
  MsTimer2::set(3, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении  
  wireWrite(I2C_STA333,0x05,0b01011100);delay(10);
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(F("Digital audio system"), CENTER, 10);
  myOLED.print(F("STA333BW"), CENTER, 30);
  myOLED.print(F("2.0 channel 40W"), CENTER, 50);
  myOLED.update();
  delay(2000);
  vol = EEPROM.read(0);treb = EEPROM.read(1);bass = EEPROM.read(2);
  bass_q = EEPROM.read(3)-100;ball = EEPROM.read(4)-100;demp = EEPROM.read(5);
  init_sta();
  Serial.println(wireRead(I2C_STA333,0x2D),BIN); 
}
 
void loop() {
/// IR ////////////////////////////////////////
  if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
  if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта  
 
/////// BUTTON ////////////////////////////////////////////////////////////////////////////////////////////////////////
if(power==0){
/// menu
   if(digitalRead(10)==LOW||ir.value==IR_1){menu++;gr1=0;gr2=0;cl();delay(200);times=millis();w=1;w2=1;if(menu>4){menu=0;}}
   if(ir.value==IR_2){menu--;gr1=0;gr2=0;cl();delay(200);times=millis();w=1;w2=1;if(menu<0){menu=4;}}
/// mute
   if((digitalRead(A0)==LOW||ir.value==IR_5)&&mute==0){mute=1;w=1;menu=100;cl();wireWrite(I2C_STA333,0x06,0b00010110);
       myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("MUTE"), CENTER, 25);myOLED.update();}
   if((digitalRead(A0)==LOW||ir.value==IR_5)&&mute==1){mute=0;w=1;menu=0;cl();wireWrite(I2C_STA333,0x06,0b00010000);} 
//// DEMP
   if(ir.value==IR_7&&demp==0){demp=1;w=1;cl();wireWrite(I2C_STA333,0x03,0b01000000|demp<<1);
       myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("De-emphasis ON"), CENTER, 25);myOLED.update();delay(2000);menu=0;}
   if(ir.value==IR_7&&demp==1){demp=0;w=1;cl();wireWrite(I2C_STA333,0x03,0b01000000|demp<<1);
       myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("De-emphasis OFF"), CENTER, 25);myOLED.update();delay(2000);menu=0;}       
 
 
}
 /// POWER ////////////////////////////////////
   if((digitalRead(A1)==LOW||ir.value==IR_6)&&power==0){power=1;menu=100;myOLED.setBrightness(1);cl();myEnc.write(0);
    myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("POWER OFF"), CENTER, 10);myOLED.update();
    wireWrite(I2C_STA333,0x05,0b01011100);delay(2000);cl();}
 
   if((digitalRead(A1)==LOW||ir.value==IR_6)&&power==1&&digitalRead(10)==HIGH){power=0;menu=0;myOLED.setBrightness(100);cl();myEnc.write(0);w=1;
    myOLED.clrScr();myOLED.setFont(SmallFont);myOLED.print(F("POWER ON"), CENTER, 10);myOLED.update();
    wireWrite(I2C_STA333,0x05,0b11011100);delay(2000);cl();}  
    /// standby output 
   if(power==1){digitalWrite(13,LOW);}else{digitalWrite(13,HIGH);}  
 
 
//////// VOLUME //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==0){
   if(newPosition != oldPosition){oldPosition = newPosition;vol=vol-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;vol_func();www=1;}
 
   if(ir.value==IR_4){vol++;gr1=1;gr2=0;cl_vol();times=millis();w=1;w2=1;vol_func();www=1;}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl_vol();times=millis();w=1;w2=1;vol_func();www=1;}// кнопка >>>>>>
   if(ir.value==IR_3){vol--;gr1=0;gr2=1;cl_vol();times=millis();w=1;w2=1;vol_func();www=1;}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl_vol();times=millis();w=1;w2=1;vol_func();www=1;}// кнопка <<<<<<
 
  if(www==1){www=0;  
    wireWrite(I2C_STA333,0x08,vol+ball*2);
    wireWrite(I2C_STA333,0x09,vol-ball*2);}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI(255-vol, 75, 0);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 35);myOLED.printNumI((treb-7)*2, 75, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 45);myOLED.printNumI((bass-7)*2, 75, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("F_BASS"), LEFT, 55);bass_q_f(55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
//////// TREBLE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==1){
   if(newPosition != oldPosition){oldPosition = newPosition;treb=treb+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;treb_func();www=1;}
 
   if(ir.value==IR_3){treb++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;treb_func();www=1;}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){treb++;gr2=0;cl();times=millis();w=1;w2=1;treb_func();www=1;}// кнопка >>>>>>
   if(ir.value==IR_4){treb--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;treb_func();www=1;}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){treb--;gr1=0;cl();times=millis();w=1;w2=1;treb_func();www=1;}// кнопка <<<<<<
 
  if(www==1){www=0;wireWrite(I2C_STA333,0x11,0|bass|treb<<4);}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI((treb-7)*2, 75, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 20);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 35);myOLED.printNumI((bass-7)*2, 75, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("F_BASS"), LEFT, 45);myOLED.printNumI(bass_q, 75, 45);bass_q_f(45);
  myOLED.setFont(SmallFont);myOLED.print(F("BALANCE"), LEFT, 55);myOLED.printNumI(ball, 75, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
//////// BASS //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==2){
   if(newPosition != oldPosition){oldPosition = newPosition;bass=bass+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_func();www=1;}
 
   if(ir.value==IR_3){bass++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_func();www=1;}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){bass++;gr2=0;cl();times=millis();w=1;w2=1;bass_func();www=1;}// кнопка >>>>>>
   if(ir.value==IR_4){bass--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_func();www=1;}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){bass--;gr1=0;cl();times=millis();w=1;w2=1;bass_func();www=1;}// кнопка <<<<<<
 
  if(www==1){www=0;wireWrite(I2C_STA333,0x11,0|bass|treb<<4);}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI((bass-7)*2, 75, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 20);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("F_BASS"), LEFT, 35);myOLED.printNumI(bass_q, 75, 35);bass_q_f(35);
  myOLED.setFont(SmallFont);myOLED.print(F("BALANCE"), LEFT, 45);myOLED.printNumI(ball, 75, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 55);myOLED.printNumI(255-vol, 75, 55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
//////// BASS_F //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==3){
   if(newPosition != oldPosition){oldPosition = newPosition;bass_q=bass_q+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;bass_q_func();www=1;}
 
   if(ir.value==IR_3){bass_q++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;bass_q_func();www=1;}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){bass_q++;gr2=0;cl();times=millis();w=1;w2=1;bass_q_func();www=1;}// кнопка >>>>>>
   if(ir.value==IR_4){bass_q--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;bass_q_func();www=1;}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){bass_q--;gr1=0;cl();times=millis();w=1;w2=1;bass_q_func();www=1;}// кнопка <<<<<<
 
  if(www==1){www=0;wireWrite(I2C_STA333,0x0C,0b00001000|bass_q<<4);}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("F_BASS"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI(60+bass_q*20, 65, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("Hz"), RIGHT, 20);
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("BALANCE"), LEFT, 35);myOLED.printNumI(ball, 75, 35);myOLED.print(F("dB"), RIGHT, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 45);myOLED.printNumI(255-vol, 75, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 55);myOLED.printNumI((treb-7)*2, 75, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
 
//////// BALANCE //////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  if(menu==4){
  if (newPosition != oldPosition){oldPosition = newPosition;ball=ball+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;ball_fun();www=1;}
 
  if(ir.value==IR_3){ball++;gr1=1;gr2=0;cl();times=millis();w=1;w2=1;ball_fun();www=1;}// кнопка > 
  if(ir.value==IR_4){ball--;gr1=0;gr2=1;cl();times=millis();w=1;w2=1;ball_fun();www=1;}// кнопка <
 
  if(www==1){www=0;  
    wireWrite(I2C_STA333,0x08,vol+ball*2);
    wireWrite(I2C_STA333,0x09,vol-ball*2);}
 
  if(w==1){w=0;
  myOLED.clrScr();
  myOLED.setFont(SmallFont);myOLED.print(F("BALANCE"), LEFT, 0);myOLED.setFont(BigNumbers);myOLED.printNumI(abs(ball), 75, 0);
  myOLED.setFont(SmallFont);myOLED.print(F("dB"), RIGHT, 0);
  if(ball<=0){myOLED.print(F("LCH"), 35, 20);}
  if(ball>=0){myOLED.print(F("RCH"), RIGHT, 20);}
  myOLED.drawLine(0, 30, 128, 30);
  myOLED.setFont(SmallFont);myOLED.print(F("VOLUME"), LEFT, 35);myOLED.printNumI(255-vol, 75, 35);
  myOLED.setFont(SmallFont);myOLED.print(F("TREBLE"), LEFT, 45);myOLED.printNumI((treb-7)*2, 75, 45);myOLED.print(F("dB"), RIGHT, 45);
  myOLED.setFont(SmallFont);myOLED.print(F("BASS"), LEFT, 55);myOLED.printNumI((bass-7)*2, 75, 55);myOLED.print(F("dB"), RIGHT, 55);
  myOLED.update();
  }}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
////////////////// EEPROM //////////////////////////////////////////////////////////////
 if(millis()-times>10000 && w2==1 && mute==0){
     EEPROM.update(0,vol);EEPROM.update(1,treb);EEPROM.update(2,bass);
     EEPROM.update(3,bass_q+100);EEPROM.update(4,ball+100);
     EEPROM.update(5,demp);
     cl();menu=0;w2=0;w=1;} 
 
  }
 
void ball_fun(){if(ball>4){ball=4;}if(ball<-4){ball=-4;}}
void bass_q_func(){if(bass_q>15){bass_q=15;}if(bass_q<1){bass_q=1;}}
void bass_func(){if(bass<1){bass=1;}if(bass>13){bass=13;}}  
void treb_func(){if(treb<1){treb=1;}if(treb>13){treb=13;}}
void vol_func(){if(vol<8){vol=8;}if(vol>246){vol=246;}}
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){myOLED.clrScr();ir.value=0;delay(300);}
void cl_vol(){myOLED.clrScr();ir.value=0;delay(100);}
 
void bass_q_f(byte pp){
   switch(bass_q){
    case 1:myOLED.print(F("80     Hz"), RIGHT, pp);break;
    case 2:myOLED.print(F("100    Hz"), RIGHT, pp);break;
    case 3:myOLED.print(F("120    Hz"), RIGHT, pp);break;
    case 4:myOLED.print(F("140    Hz"), RIGHT, pp);break;
    case 5:myOLED.print(F("160    Hz"), RIGHT, pp);break;
    case 6:myOLED.print(F("180    Hz"), RIGHT, pp);break;
    case 7:myOLED.print(F("200    Hz"), RIGHT, pp);break;
    case 8:myOLED.print(F("220    Hz"), RIGHT, pp);break;
    case 9:myOLED.print(F("240    Hz"), RIGHT, pp);break;
    case 10:myOLED.print(F("260    Hz"), RIGHT, pp);break;
    case 11:myOLED.print(F("280    Hz"), RIGHT, pp);break;
    case 12:myOLED.print(F("300    Hz"), RIGHT, pp);break;
    case 13:myOLED.print(F("320    Hz"), RIGHT, pp);break;
    case 14:myOLED.print(F("340    Hz"), RIGHT, pp);break;
    case 15:myOLED.print(F("360    Hz"), RIGHT, pp);break;
    }
  }
 
void init_sta(){
  wireWrite(I2C_STA333,0x00,0b01101011);
  //[2:0][MCS2 MCS1 MCS0]=011
  //[4:3][IR1 IR0]=01(96K)
  //[5][TWRB]=1(TEMP_ERR АВТОВКЛЮЧ.ПОСЛЕ ПЕРЕГРЕВА-АКТИВНА)
  //[6][TWAB]=0(ОГРАНИЧ ВЫХ МОЩНОСТИ ПРИ ПЕРЕГРЕВЕ-АКТИВНА)0X37 - УКАЗАТЬ УРОВ. ОГР. МОЩН.
  //[7][FDRB]=0(ЗАЩИТА.ОТКЛ.ПИТАНИЯ ПРИ НЕИСПРАВНОСТИ-АКТИВНА)
  wireWrite(I2C_STA333,0x01,0b10100000); 
  //[3:0][SAI]=0000(I2S 64*fs 16 to 24 bit) 
  //[4][SAIFB]=0(MSB) MSB/LSB-first
  //[5][DSCKE]=1(АКТИВНА ТАКТОВАЯ ЗАДЕРЖКА)
  //[7:6][C1IM C2IM]=10(СОПАСТОНОВЛЕНИЕ КАНАЛОВ)DEF
  wireWrite(I2C_STA333,0x02,0b10011110);
  //[1:0][OM0 OM1]=10( FFX power output mode)DEF
  //[5:2][CSZ]=0111(FFX compensating pulse size register)DEF
  //[6][RESERVED]
  //[7][OCRB]=1(ЗАЩИТА ПО ТОКУ-АКТИВНА)
  wireWrite(I2C_STA333,0x03,0b01000000|demp<<1);
  //[0][HPB]=0(ФИЛЬТР HPB АКТИВЕН)DEF ОПАСНО ВЫКЛЮЧАТЬ!!! 
  //[1][DEMP]=0(De-emphasis)OFF
  //[2][DSPB]=0(DSP bypass)АКТИВНА-РЕГ.ТЕМБРА АКТИВНЫ
  //[3][PSL]=0(Postscale link)DEF
  //[4][BQL]=0(Biquad coefficient link)DEF
  //[5][DCR]=0(Dynamic range compression)DEF
  //[6][ZDE]=1(Zero-detect mute enable)DEF
  //[7][SME]=0(Submix mode enable)DEF  
  wireWrite(I2C_STA333,0x04,0b11000010);//def
  //[0][MPCV]=0(Max power correction variable)DEF
  //[1][MPC]=1(Max power correction)DEF
  //[2][NSBW]=0(Noise-shaper bandwidth selection)DEF
  //[3][AME]=0(AM mode enable)DEF
  //[4][PWMS]=1(PWM speed mode)DEF
  //[5][DCCV]=0(Distortion compensation variable enable)DEF
  //[6][ZCE]=1(Zero-crossing volume enable)DEF
  //[7][SVE]=1(Soft volume update enable)DEF
  wireWrite(I2C_STA333,0x05,0b11011100);
  //[1:0]RESERVED
  //[2][IDE]=1(Invalid input detect mute enable)DEF
  //[3][BCLE]=1(Binary output mode clock loss detection)DEF
  //[4][LDTE]=1(LRCK double trigger protection)DEF
  //[5][ECLE]=0(Auto EAPD on clock loss)DEF
  //[6][PWDN]=1(IC power down)DEF
  //[7][EAPD]=1(ВНЕШНЕЕ ПИТАНИЕ УСИЛИТЕЛЯ)АКТИВНО
  wireWrite(I2C_STA333,0x06,0b00010000);// DEF
  //Mute/line output configuration register
  wireWrite(I2C_STA333,0x07,0);// 0 dB
  //Master volume register BYTE 0...0xFE = 0 dB...-127,5 | 0xFF = MUTE
   wireWrite(I2C_STA333,0x08,vol+ball*2);
  //Channel 1 volume BYTE 0...0xEC = +48...-80 dB 0xFF = MUTE
  wireWrite(I2C_STA333,0x09,vol-ball*2);
  //Channel 2 volume BYTE 0...0xEC = +48...-80 dB 0xFF = MUTE 
  wireWrite(I2C_STA333,0x0A,255);
  wireWrite(I2C_STA333,0x0B,0b10000000);//DEF
  //[4:5][AMGC](Audio preset register 1)
  //Audio preset gain compression/limiters selection
  wireWrite(I2C_STA333,0x0C,0b00001000|bass_q<<4);
  //[0][amame]
  //[3:1][AMAM]=000(AM interference frequency switching)DEF
  //[7:4][XO]=0000(Кроссовер для управления басами)byte 0000...0001...1111 = DEF...80Hz...360Hz
 
  wireWrite(I2C_STA333,0x0E,0b00000000);
  //[0][TCB]=0(Tone control bypass)DEF
  //[1][EQBP]=0(EQ bypass)DEF
  //[2][VBP]=0(Volume bypass)DEF
  //[3][BO]=0(Binary output enable)DEF
  //[5:4][LS]=00(Channel limiter mapping as a function of CxLS bits)DEF
  //[7:6][OM]=00(Channel output mapping as a function of CxOM bits)DEF
  wireWrite(I2C_STA333,0x0F,0b01000000);
  //[0][TCB]=0(Tone control bypass)DEF
  //[1][EQBP]=0(EQ bypass)DEF
  //[2][VBP]=0(Volume bypass)DEF
  //[3][BO]=0(Binary output enable)DEF
  //[5:4][LS]=00(Channel limiter mapping as a function of CxLS bits)DEF
  //[7:6][OM]=00(Channel output mapping as a function of CxOM bits)DEF
  wireWrite(I2C_STA333,0x10,0b10000000);
  //[1:0]RESERVED
  //[2][VBP]=0(Volume bypass)DEF
  //[3][BO]=0(Binary output enable)DEF
  //[5:4][LS]=00(Channel limiter mapping as a function of CxLS bits)DEF
  //[7:6][OM]=00(Channel output mapping as a function of CxOM bits)DEF
  wireWrite(I2C_STA333,0x11,0|bass|treb<<4);// тембр ВЧ НЧ 
 
  wireWrite(I2C_STA333,0x12,0b01101010);
  //(Limiter 1 attack/release rate)DEF
  wireWrite(I2C_STA333,0x13,0b01101001);
  //(Limiter 1 attack/release threshold )DEF
  wireWrite(I2C_STA333,0x14,0b01101010);
  //(Limiter 2 attack/release rate)DEF
  wireWrite(I2C_STA333,0x15,0b01101001);
  //(Limiter 2 attack/release threshold)DEF
  wireWrite(I2C_STA333,0x16,255);
  //(Coefficient address register)DEF
  wireWrite(I2C_STA333,0x17,255);
  wireWrite(I2C_STA333,0x18,255);
  wireWrite(I2C_STA333,0x19,255);
 
  wireWrite(I2C_STA333,0x1A,255);
  wireWrite(I2C_STA333,0x1B,255);
  wireWrite(I2C_STA333,0x1C,255);
  //(Coefficient b2 data register bits)DEF
  wireWrite(I2C_STA333,0x1D,255);
  wireWrite(I2C_STA333,0x1E,255);
  wireWrite(I2C_STA333,0x1F,255);
  //(Coefficient a1 data register bits)DEF
  wireWrite(I2C_STA333,0x20,255);
  wireWrite(I2C_STA333,0x21,255);
  wireWrite(I2C_STA333,0x22,255);
  //(Coefficient a2 data register bits)DEF
  wireWrite(I2C_STA333,0x23,255);
  wireWrite(I2C_STA333,0x24,255);
  wireWrite(I2C_STA333,0x25,255);
  //(Coefficient b0 data register bits)DEF 
  wireWrite(I2C_STA333,0x26,255);
 
  }  
 
byte wireRead(byte addr, byte reg){ // I2C
  Wire.beginTransmission(addr);
  Wire.write (reg);
  Wire.endTransmission();
  Wire.requestFrom(addr,1);
  while(Wire.available()<1);
  byte value = Wire.read();
  return value;
  }  
 
void wireWrite(byte addr, byte reg, byte data){
  Wire.beginTransmission(addr);
  Wire.write (reg);
  Wire.write (data);
  Wire.endTransmission();
  }

При первом запуске не подключайте колонки (уровень громкости может находится в диапазоне +48 дБ, что может повлечь повреждение акустической системы), установите громкость на уровень 100 единиц, пролистайте все меню и установите 0 в регуляторах тембра и баланса. Подождите 10 секунд, чтобы параметры были записаны в EEPROM.


Доработка №1

Вывод в меню громкости состояние фильтра de-emphasis

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=7412#p7412


Доработка №2

Добавлены часы реального времени DS3231

Время отображается только в режиме STANDBY

Для коррекции времtни в режиме POWER OFF нажать и удерживать кнопку энкодера, для коррекции минут нажать кнопку MUTE, для коррекции часов нажать кнопку POWER. Для сброса секунд нажать и удерживать кнопку энкодера , повернуть ручку энкодера в любую сторону.

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=7413#p7413


Доработка №3

Защита от выгорания пикселей OLED дисплея в режиме POWER OFF.

Время отображается только в течении 30 секунд при переходе в режим POWER OFF. Для просмотра времени в режиме POWER OFF необходимо нажать кнопку MUTE, дисплей будет показывать текущее время в течении 30 секунд, в остальное время дисплей будет отключен.

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=7414#p7414

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

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