NTP3000(А) — цифровой усилитель 2х30 Вт (Arduino)

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

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

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

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

Усилитель выдает 2 x 30 Вт, оснащен цифровым регулятором громкости, баланса, имеет 7-и полосный эквалайзер, так же доступны функции MUTE и STANDBY.

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

Параметры ресивера CS8416:

  • Напряжение питания:
    • +3.3 V Analog Supply (VA)
    • +3.3 V Digital Supply (VD)
    • +3.3 V or +5.0 V Digital Interface Supply (VL)
  • Входной формат данных: S/PDIF
  • Выходной формат данных:
    • Left-Justified
    • Right-Justified
    • I2S (аппаратно настроен)
  • Разрядность 16 — 24 бит (аппаратно настроен на 24 бит)
  • Частота дискредитации 32 — 192 кГц (аппаратно настроен на 192 кГц)
  • Фильтр De-emphasis:
    • No De-emphasis (аппаратно настроен)
    • 32 kHz
    • 48 kHz
    • 44.1 kHz
  • Кол-во входов: 8 (аппаратно поддерживает 4)

Основные параметры усилителя NTP3000(A):

  • Напряжение питания основной логики 1,8 В
  • Напряжение питания аналоговое 1,8 В
  • Напряжение питания цифровое 1,8 В
  • Напряжение питания для каскадов ввода/вывода 3,3 В
  • Напряжение питания для силового каскада 7… 30 В (6 А)
  • Выходная мощность для выхода 2.0 2х30 Вт
  • Выходная мощность для выхода 2.1 1х30 Вт + 2х15 Вт
  • Входной сигнал I2S 24 бит 192 кГц
  • 7 полосный эквалайзер
  • Динамический диапазон 100 дБ
  • Частота дискретизации от 8 до 192 кГц
  • Коэффициент гармоник (THD+N / 1W, 1kHz) 0,01%
  • Управление цифровое I2C

Ресивер CS8416 имеет цифровой интерфейс управления, но может быть сконфигурирован аппаратно. В данном примере ресивер сконфигурирован аппаратно и имеет выходной формат I2S 24 бит с частотой дискредитации 192 кГц. При аппаратной настройке в ресивере доступно 4 входа S/PDIF (8 входов при программном управлении).

Коммутация входами осуществляется при помощи пинов RSEL1 и RSEL0 микросхемы ресивера , при этом лог. 1 подается с питания VL (+5 В), а логический ноль с DGND.

INPUT RSEL0 RSEL1
RXP0 0 0
RXP1 1 0
RXP2 0 1
RXP3 1 1

Ресивер работает независимо от Arduino, в схеме присутствует индикатор режима работы светодиод D1, при подключении коаксиального кабеля с источником цифрового сигнала светодиод гаснет, при отключении кабеля загорается.

Усилитель NTP3000(А) имеет цифровое управление I2C, может определятся по двум I2C адресам. Для выбора адреса необходимо на вход AD микросхемы подать лог 0 или 1.

AD I2C адрес (8 бит, для Arduino младший бит игнорируется)
0 0x54
1 0x56

Интерфейс последовательной шины I2S в данной схеме состоит из трех сигналов —  BCK, WCK, SDATA.

WCK — выбор ПК / ЛК

BCK — синхроимпульсы

SDATA — данные

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

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

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

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

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

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

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

  • Меню индикаторов громкости (от 0 до 92) и коммутатора входов

Регулировка громкости осуществляется при помощи энкодера.

  • Меню эквалайзера, регулировка уровня усиления или ослабления выбранной полосы осуществляется при помощи энкодера, выбор полосы происходит при нажатии на кнопку INPUT/EQ_F. Меню эквалайзера содержит графический индикатор регулировки полос.

  • Меню регулировки баланса

  • Режим MUTE

  • Режим STANDBY

Так как предусмотрена управляемая яркость подсветки дисплея, то можно установить яркость подсветки в основном  режиме и в режиме STANDBY (как правило с пониженной яркостью подсветки), регулировка яркости подсветки осуществляется через скетч:

#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50 // Яркость 0…255 POWER OFF

Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).

 

Максимальный выходной ток одного выхода Arduino Nano не должен превышать 40 мА (рекомендуется не более 20 мА).

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

#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD6A95 // Кнопка IN
#define IR_6 0x2FDEA15 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка STANDBY (POWER)

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

Усилитель в настройке не нуждается, помимо занесения в скетч кодов кнопок пульта и параметров подсветки дисплея можно подкорректировать в скетче общее усиление усилителя:

#define GAIN 80 // 10 — 126 КОЭФФИЦИЕНТ УСИЛЕНИЯ УСИЛИТЕЛЯ

#define I2C_NTP3000 0x2A // Address chip | MONITOR_0 = GND 
#define GAIN    0x4D  // 10 - 126 КОЭФФИЦИЕНТ УСИЛЕНИЯ УСИЛИТЕЛЯ
 
#define CLK     9   //  ENCODER 
#define DT      8   //  ENCODER 
#define SW     10   //  ENCODER 
 
#define BRIG_H 200      // Яркость 0...255 POWER ON
#define BRIG_L 50       // Яркость 0...255 POWER OFF
 
#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD6A95 // Кнопка IN
#define IR_6 0x2FDEA15 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка STANDBY (POWER)
 
#include <Wire.h>
#include <EEPROM.h>
#include <MsTimer2.h>                    // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Encoder.h>                     // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <LiquidCrystal_I2C.h>           // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 
#include <boarddefs.h>                   // входит в состав библиотеки IRremote
#include <IRremote.h>                    // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip 
 Encoder myEnc(CLK, DT);
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
 IRrecv irrecv(12); // указываем вывод модуля IR приемника
 decode_results ir; 
 
 unsigned long times,times1,oldPosition  = -999,newPosition;
 byte i,d1,d2,d3,d4,d5,d6,e1,e2,e3;
 int menu,vol,a[3],in,qi,qq;
 byte w,w2,mute,m0=1,m1;
 int q[7],qqq[7],ball,chl,chr,i1;  
 bool gr1,gr2,www,power;
 
void setup() {
  delay(500);Wire.begin();Serial.begin(9600);irrecv.enableIRIn();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  pinMode(2,OUTPUT); // RSEL0 PIN  CS8416
  pinMode(3,OUTPUT); // RSEL1 PIN  CS8416
  pinMode(4,OUTPUT); // RESET PIN  NTP3000
  pinMode(5,OUTPUT); // FAULT PIN  NTP3000
  digitalWrite(4,HIGH);delay(100);  // RESET NTP
  digitalWrite(4,LOW);delay(100);   // RESET NTP
  digitalWrite(4,HIGH);delay(100);  // RESET NTP
  pinMode(A0,INPUT_PULLUP); // MUTE
  pinMode(A1,INPUT_PULLUP); // INPUT
  pinMode(A2,INPUT_PULLUP); // POWER
  pinMode(6,OUTPUT);  // ВЫХОД УПРАВЛЕНИЯ ПОДСВЕТКОЙ
  analogWrite(6, BRIG_H);// больше 200 не делать
  vol = EEPROM.read(0);in = EEPROM.read(1);
  q[0] = EEPROM.read(2)-100;q[1] = EEPROM.read(3)-100;q[2] = EEPROM.read(4)-100;q[3] = EEPROM.read(5)-100;q[4] = EEPROM.read(6)-100;
  q[5] = EEPROM.read(7)-100;q[6] = EEPROM.read(8)-100;ball = EEPROM.read(9)-100;
  in_sw();
  init_ntp(); 
  Serial.println(wireRead(I2C_NTP3000,0x75),BIN); 
  digitalWrite(5,HIGH);delay(200);  // FAULT NTP
  lcd.init();lcd.backlight();
  lcd.setCursor(5,0);lcd.print("CS 8416");
  lcd.setCursor(5,1);lcd.print("NTP3000");
  delay(1000);lcd.clear(); 
}
 
void loop() {
   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;}// запрет нажатий не активных кнопок пульта  
 
   if(m0==1){m0=0;
    byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
    byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};      
    byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
    byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
    byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
    byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
    byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
    byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};
    lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);}
   if(m1==1){m1=0;
    byte v1[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110};
    byte v2[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110};
    byte v3[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110};
    byte v4[8] = {0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110};
    byte v5[8] = {0b00000, 0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
    byte v6[8] = {0b00000, 0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
    byte v7[8] = {0b00000, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
    byte v8[8] = {0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110, 0b01110};
    lcd.createChar(0, v1);lcd.createChar(1, v2);lcd.createChar(2, v3);lcd.createChar(3, v4);lcd.createChar(4, v5);lcd.createChar(5, v6);lcd.createChar(6, v7);lcd.createChar(7, v8);}
 
 if(power==0){
  /// MENU //////////////////////////////
  if(digitalRead(SW)==LOW){menu++;if(menu>2){menu=0;};switch(menu){case 0: m0=1;break;case 1: m1=1;break;case 2: m0=1;break;}delay(200);lcd.clear();w=1;w2=1;times=millis();w2=1;}
  if(ir.value==IR_1){menu++;gr1=0;gr2=0;cl1();times=millis();w=1;w2=1;if(menu>2){menu=0;};switch(menu){case 0: m0=1;break;case 1: m1=1;break;case 2: m0=1;break;}delay(200);lcd.clear();w=1;w2=1;times=millis();w2=1;}
  if(ir.value==IR_2){menu--;gr1=0;gr2=0;cl1();times=millis();w=1;w2=1;if(menu<0){menu=2;};switch(menu){case 0: m0=1;break;case 1: m1=1;break;case 2: m0=1;break;}delay(200);lcd.clear();w=1;w2=1;times=millis();w2=1;}
 
  /// INPUT ////////////////////////////
  if((digitalRead(A1)==LOW||ir.value==IR_5)&&menu!=1){in++;gr1=0;gr2=0;if(in>3){in=0;}menu=100;w=1;w2=1;times=millis();cl();lcd.setCursor(4,0);lcd.print("INPUT ");lcd.print(in+1);
  in_sw();
  delay(500);cl();menu=0;}
 
 /// MUTE //////////////////////////////
 if((digitalRead(A0)==LOW||ir.value==IR_6)&&mute==0){mute=1;gr1=0;gr2=0;menu=100;cl();wireWrite(I2C_NTP3000,0x20,0b00000111);lcd.setCursor(6,0);lcd.print("MUTE");}
 if((digitalRead(A0)==LOW||ir.value==IR_6)&&mute==1){mute=0;gr1=0;gr2=0;menu=0;m0=1;cl();wireWrite(I2C_NTP3000,0x20,0b00000000);w2=1;}  
  }
 /// POWER ///////////////////////////// 
  if((ir.value==IR_7||digitalRead(A2)==LOW)&&power==0){power=1;cl();lcd.setCursor(3,0);lcd.print("POWER  OFF");menu=100;m0=1;
    wireWrite(I2C_NTP3000,0x1F,0b00000111); // standby 
    delay(3000);analogWrite(6,BRIG_L);}// power off
  if((ir.value==IR_7||digitalRead(A2)==LOW)&&power==1){power=0;analogWrite(6, BRIG_H);cl();lcd.setCursor(3,0);lcd.print("POWER   ON ");
    w2=1;w=1;menu=0;m0=1;myEnc.write(0);
    wireWrite(I2C_NTP3000,0x1F,0b00000000);
    delay(3000);cl();}// power on
 
 
 /// VOLUME ///////////////////////////////////////////////////
 if(menu==0){
   if(ir.value==IR_3){vol++;gr1=1;gr2=0;cl1();times=millis();www=1;w=1;w2=1;if(vol>120){vol=120;}if(vol<28){vol=28;}}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){vol++;gr2=0;cl1();times=millis();www=1;w=1;w2=1;if(vol>120){vol=120;}if(vol<28){vol=28;}}// кнопка >>>>>>
   if(ir.value==IR_4){vol--;gr1=0;gr2=1;cl1();times=millis();www=1;w=1;w2=1;if(vol>120){vol=120;}if(vol<28){vol=28;}}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){vol--;gr1=0;cl1();times=millis();www=1;w=1;w2=1;if(vol>120){vol=120;}if(vol<28){vol=28;}}// кнопка <<<<<<  
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     vol=vol+newPosition;myEnc.write(0);newPosition=0;w=1;times=millis();w2=1;
     if(vol>120){vol=120;}if(vol<28){vol=28;}
     www=1;
     }
   if(www==1){www=0;
     wireWrite(I2C_NTP3000,0x2E,vol*2);// MASTER VOLUME 
     wireWrite(I2C_NTP3000,0x2F,vol*2+ball);// MASTER VOLUME CH1
     wireWrite(I2C_NTP3000,0x30,vol*2-ball);// MASTER VOLUME CH2
   }  
      lcd.setCursor(0,0);lcd.print("VOLUME ");
      lcd.setCursor(0,1);lcd.print("INPUT ");lcd.print(in+1);
 
  if(w2==1){w2=0;
     a[0]=(vol-28)/10;a[1]=(vol-28)%10;
       for(i=0;i<2;i++){
      switch(i){
        case 0: e1=9,e2=10,e3=11;break;
        case 1: e1=12,e2=13,e3=14;break;
        }
      switch(a[i]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
 }} 
 }
 
// Equalizer /////////////////////////////////////
 if(menu==1){ 
   if(digitalRead(A1)==LOW||ir.value==IR_5){qi++;gr1=0;gr2=0;ir.value=0;if(qi>6){qi=0;}w=1;w2=1;delay(300);}
   switch(qi){
    case 0: qq=q[0];break;
    case 1: qq=q[1];break;
    case 2: qq=q[2];break;
    case 3: qq=q[3];break;
    case 4: qq=q[4];break;
    case 5: qq=q[5];break;
    case 6: qq=q[6];break;
    }
 
   if(ir.value==IR_3){qq++;gr1=1;gr2=0;cl1();times=millis();www=1;w=1;w2=1;if(qq>12){qq=12;}if(qq<-12){qq=-12;}}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){qq++;gr2=0;cl1();times=millis();www=1;w=1;w2=1;if(qq>12){qq=12;}if(qq<-12){qq=-12;}}// кнопка >>>>>>
   if(ir.value==IR_4){qq--;gr1=0;gr2=1;cl1();times=millis();www=1;w=1;w2=1;if(qq>12){qq=12;}if(qq<-12){qq=-12;}}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){qq--;gr1=0;cl1();times=millis();www=1;w=1;w2=1;if(qq>12){qq=12;}if(qq<-12){qq=-12;}}// кнопка <<<<<<   
 
   if (newPosition != oldPosition){oldPosition = newPosition;
     qq=qq+newPosition;myEnc.write(0);newPosition=0;w=1;times=millis();w2=1;
     if(qq>12){qq=12;}if(qq<-12){qq=-12;}
     www=1;
     }
     if(www==1){www=0;
     q[qi]=qq;
     if(qq>=0){
    wireWrite(I2C_NTP3000,0x69,q[0]);// EQ 80 HZ
    wireWrite(I2C_NTP3000,0x32,q[1]);// EQ 220 HZ
    wireWrite(I2C_NTP3000,0x33,q[2]);// EQ 470 HZ
    wireWrite(I2C_NTP3000,0x36,q[3]);// EQ 1 KHZ
    wireWrite(I2C_NTP3000,0x34,q[4]);// EQ 2.2 KHZ
    wireWrite(I2C_NTP3000,0x35,q[5]);// EQ 4.7 KHZ
    wireWrite(I2C_NTP3000,0x6A,q[6]);// EQ 12.0 KHZ
     }
     if(qq<0){
    wireWrite(I2C_NTP3000,0x69,q[0]+32);// EQ 80 HZ
    wireWrite(I2C_NTP3000,0x32,q[1]+32);// EQ 220 HZ
    wireWrite(I2C_NTP3000,0x33,q[2]+32);// EQ 470 HZ
    wireWrite(I2C_NTP3000,0x36,q[3]+32);// EQ 1 KHZ
    wireWrite(I2C_NTP3000,0x34,q[4]+32);// EQ 2.2 KHZ
    wireWrite(I2C_NTP3000,0x35,q[5]+32);// EQ 4.7 KHZ
    wireWrite(I2C_NTP3000,0x6A,q[6]+32);// EQ 12.0 KHZ
     }}
 
  for (int pos = 0; pos < 7; pos++) {lcd.setCursor(pos, 0);
    qqq[pos] = map(q[pos],-12,12,0,15);
    if (qqq[pos] > 7){lcd.write((uint8_t)qqq[pos] - 8);lcd.setCursor(pos, 1);lcd.write((uint8_t)7);} 
    else {lcd.print(" ");lcd.setCursor(pos, 1);lcd.write((uint8_t)qqq[pos]);}}
    lcd.setCursor(8,0);lcd.print("F ");
    switch(qi){
      case 0: lcd.print("80  Hz");break;
      case 1: lcd.print("220 Hz");break;
      case 2: lcd.print("470 Hz");break;
      case 3: lcd.print("1.0kHz");break;
      case 4: lcd.print("2.2kHz");break;
      case 5: lcd.print("4.7kHz");break;
      case 6: lcd.print("12 kHz");break;
      }
    lcd.setCursor(8,1);lcd.print("G ");lcd.print(q[qi]);lcd.print(" dB  ");
 } 
 
//// EEPROM ///////////////////////////////////////
 if(millis()-times>10000 && w==1 && power==0){w=0;EEPROM.update(0,vol);EEPROM.update(1,in);
 EEPROM.update(2,q[0]+100);EEPROM.update(3,q[1]+100);EEPROM.update(4,q[2]+100);EEPROM.update(5,q[3]+100);EEPROM.update(6,q[4]+100);
 EEPROM.update(7,q[3]+100);EEPROM.update(8,q[4]+100);
 EEPROM.update(9,ball+100);
 menu=0;cl();m0=1;w2=1;
}
 
 //////// BALANCE /////////////////////////////////////////////////////////////// 
 if(menu==2){ 
   if(ir.value==IR_3){ball++;gr1=1;gr2=0;cl1();times=millis();www=1;w=1;w2=1;ball_fun();}// кнопка > 
   if(ir.value==0xFFFFFFFF and gr1==1){ball++;gr2=0;cl1();times=millis();www=1;w=1;w2=1;ball_fun();}// кнопка >>>>>>
   if(ir.value==IR_4){ball--;gr1=0;gr2=1;cl1();times=millis();www=1;w=1;w2=1;ball_fun();}// кнопка <
   if(ir.value==0xFFFFFFFF and gr2==1){ball--;gr1=0;cl1();times=millis();www=1;w=1;w2=1;ball_fun();}// кнопка <<<<<<  
 
   if (newPosition != oldPosition){oldPosition = newPosition;
   ball=ball-newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;ball_fun();www=1;
   }
   if(www==1){www=0;
     wireWrite(I2C_NTP3000,0x2E,vol*2);// MASTER VOLUME 
     wireWrite(I2C_NTP3000,0x2F,vol*2+ball);// MASTER VOLUME CH1
     wireWrite(I2C_NTP3000,0x30,vol*2-ball);// MASTER VOLUME CH2
   }
   lcd.setCursor(4,0);lcd.print(F("   <>   "));lcd.setCursor(4,1);lcd.print(F("CHL  CHR"));
   chl=(4+ball)-4;chr=(4-ball)-4;
   if(chl<0){lcd.setCursor(12,0);chl=abs(chl);lcd.write((uint8_t)3);}else{lcd.setCursor(12,0);lcd.print(" ");}
   if(chr<0){lcd.setCursor(0,0);chr=abs(chr);lcd.write((uint8_t)3);}else{lcd.setCursor(0,0);lcd.print(" ");}
   if(w2==1){w2=0;a[0]=chl;a[1]=chr;
   for(i1=0;i1<2;i1++){
      switch(i1){
        case 0: e1=1,e2=2,e3=3;break;
        case 1: e1=13,e2=14,e3=15;break;
        }
      switch(a[i1]){
        case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
        case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
        case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
        case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
        case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
        case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
        case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
        case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
        case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
        case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    }
      lcd.setCursor(e1,0);lcd.write((uint8_t)d1);lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
      lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);
 }}}  
} // end loop
 
 
void init_ntp(){ 
    wireWrite(I2C_NTP3000,0x00,0b00011100);// I2S, slave mode|192kHz
    wireWrite(I2C_NTP3000,0x01,0b00000000);// 24 bit, 64 BCK/WCK
    wireWrite(I2C_NTP3000,0x02,0b00000010);// 18.432 MHz
    wireWrite(I2C_NTP3000,0x03,0b00000000);// AD MODE ASIN
    wireWrite(I2C_NTP3000,0x04,0);// AUTO MUTE OFF 1-2CH
    wireWrite(I2C_NTP3000,0x05,0);// AUTO MUTE OFF 3CH
    wireWrite(I2C_NTP3000,0x06,0b00101110);// EQ USER DEFINED
    wireWrite(I2C_NTP3000,0x07,0);// ACL CONF_1
    wireWrite(I2C_NTP3000,0x08,0);// ACL CONF_2
    wireWrite(I2C_NTP3000,0x09,0);// ACL CONF_3
    wireWrite(I2C_NTP3000,0x0A,0b00000111);// MASTER VOL OVERRIDE
    wireWrite(I2C_NTP3000,0x0B,0b00001000);// PWM 1A&1B
    wireWrite(I2C_NTP3000,0x0C,0b00011010);// PWM 2A&2B
    wireWrite(I2C_NTP3000,0x0D,0b00101100);// PWM 3A&3B
    wireWrite(I2C_NTP3000,0x0E,0);// DRC CONTR CH1-2
    wireWrite(I2C_NTP3000,0x0F,0);// DRC CONTR CH3
    wireWrite(I2C_NTP3000,0x10,0);// DRC CONFIG
    wireWrite(I2C_NTP3000,0x11,0b01110000);// NS-TUPE DEF
    wireWrite(I2C_NTP3000,0x12,100);// PRESCALER CONRT CH1-2 DEF
    wireWrite(I2C_NTP3000,0x13,0);// PRESCALER CONTR CH3
 
    wireWrite(I2C_NTP3000,0x17,0);// AOUT RISING EDGE DELAY DEF
    wireWrite(I2C_NTP3000,0x18,0);// AOUT FALLING EDGE DELAY DEF
    wireWrite(I2C_NTP3000,0x19,0);// BOUT RISING EDGE DELAY
    wireWrite(I2C_NTP3000,0x1A,0);// BOUT FALLING EDGE DELAY
    wireWrite(I2C_NTP3000,0x1B,0b10101000);// PWM OFF & AUTO PROTECT CONTR DEF
    wireWrite(I2C_NTP3000,0x1C,0);// AUTO PROTECT CONF CONTROL MASKING
    wireWrite(I2C_NTP3000,0x1D,0);// PROTECT CONTROL DEF
    wireWrite(I2C_NTP3000,0x1E,0b00000000);// PROTECT CONTROL DEF
    wireWrite(I2C_NTP3000,0x1F,0b00000000);// SWITCHING OFF !!!!!
 
    wireWrite(I2C_NTP3000,0x20,0b00000000);// SOFTMUTE !!!!
    wireWrite(I2C_NTP3000,0x2C,0b00111111);// FBQ_FLAG CH1-2-3 DEF
    wireWrite(I2C_NTP3000,0x2D,0b00000001);// MASTER FINE VOLUME DEF
    wireWrite(I2C_NTP3000,0x2E,vol*2);// MASTER VOLUME 
    wireWrite(I2C_NTP3000,0x2F,vol*2+ball);// MASTER VOLUME CH1
    wireWrite(I2C_NTP3000,0x30,vol*2-ball);// MASTER VOLUME CH2
    wireWrite(I2C_NTP3000,0x31,0);// MASTER VOLUME CH3   
 
    if(q[0]>=0){wireWrite(I2C_NTP3000,0x69,q[0]);}else{wireWrite(I2C_NTP3000,0x69,q[0]+32);} // EQ 80 HZ
    if(q[1]>=0){wireWrite(I2C_NTP3000,0x32,q[2]);}else{wireWrite(I2C_NTP3000,0x32,q[1]+32);} // EQ 220 HZ
    if(q[2]>=0){wireWrite(I2C_NTP3000,0x33,q[3]);}else{wireWrite(I2C_NTP3000,0x33,q[2]+32);} // EQ 470 HZ
    if(q[3]>=0){wireWrite(I2C_NTP3000,0x36,q[4]);}else{wireWrite(I2C_NTP3000,0x36,q[3]+32);} // EQ 1 KHZ
    if(q[4]>=0){wireWrite(I2C_NTP3000,0x34,q[5]);}else{wireWrite(I2C_NTP3000,0x34,q[4]+32);} // EQ 2.2 KHZ
    if(q[5]>=0){wireWrite(I2C_NTP3000,0x35,q[6]);}else{wireWrite(I2C_NTP3000,0x35,q[5]+32);} // EQ 4.7 KHZ
    if(q[6]>=0){wireWrite(I2C_NTP3000,0x6A,q[1]);}else{wireWrite(I2C_NTP3000,0x6A,q[6]+32);} // EQ 12.0 KHZ
 
    wireWrite(I2C_NTP3000,0x37,GAIN);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x38,GAIN);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x39,GAIN);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x3A,GAIN);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x3B,0);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x3C,0);// MIXER GAIN
    wireWrite(I2C_NTP3000,0x3D,0);// Back Biquad Filter Conf Ch1-2 DEF
    wireWrite(I2C_NTP3000,0x3E,0);// Back Biquad Filter Conf Ch1-2 DEF
    wireWrite(I2C_NTP3000,0x3F,0);// Biquad Filter Coefficient DEF 
 
    wireWrite(I2C_NTP3000,0x60,40);// 3D DELAY
    wireWrite(I2C_NTP3000,0x61,0);// 3D EFFECT
    wireWrite(I2C_NTP3000,0x62,0b00000010);// PWM 2.0 CH
    wireWrite(I2C_NTP3000,0x63,0b00000001);// STANDBY  
  }
 
void ball_fun(){if(ball>8){ball=8;}if(ball<-8){ball=-8;}}
void cl(){ir.value=0;delay(300);lcd.clear();}
void cl1(){ir.value=0;delay(200);} 
 
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();
  } 
 
void in_sw(){
  switch(in){
    case 0: digitalWrite(2,LOW);digitalWrite(3,LOW);break;
    case 1: digitalWrite(2,HIGH);digitalWrite(3,LOW);break;
    case 2: digitalWrite(2,LOW);digitalWrite(3,HIGH);break;
    case 3: digitalWrite(2,HIGH);digitalWrite(3,HIGH);break;
    }} 
 
void to_Timer(){newPosition = myEnc.read()/4;}

Доработка №1:

  • Добавлен модуль часов реального времени DS3231
  • Показания часов выводятся в режиме POWER OFF (STANDBY)
  • Коррекция времени часов производится в режиме POWER OFF (STANDBY), для коррекции времени часов нажмите и удерживайте нажатой кнопку энкодера, далее нажать для коррекции кнопку:
    • MUTE — для корректировки часов
    • INPUT — для корректировки минут
    • POWER — для обнуления секунд

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

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

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

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