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

Аудиопроцессор LC75421M позволяет регулировать громкость, тембр, баланс, содержит аттенюаторы выхода, 5-и канальный коммутатор входов с предварительным предусилителем.

Основные возможности аудиопроцессора LC75421M:

  • Регулировка громкости от 0 дБ до -79 дБ с шагом 1 дБ и –∞ (81 уровень)
  • Раздельный регулятор громкости L/R
  • Аттенюаторы фронт/тыл в 16 уровней (с шагом 2 дБ от 0 дБ до -20 дБ, с шагом 5 дБ от -20 дБ до -25 дБ, с шагом 10-дБ от -25 дБ до -45 дБ и -60 дБ, –∞)
  • Регулятор тембра ВЧ и НЧ 15 уровней с регулировкой от 0 дБ до ±11,9 дБ с шагом 1,7 дБ
  • Входной усилитель от 0 дБ до +18,75 дБ (с шагом 1,25 дБ)
  • Выходной усилитель с фиксированными значениями 0 дБ, +6,5 дБ и +8,5 дБ
  • 5-и канальный селектор входов
  • Функция SUPER BASS ступенчатое управление с 11 уровнями
  • Электрические параметры:
    • Напряжение питания от 7,5 до 10 В
    • Управление 3-Wire с частотой до 500 кГц (CL, DI, CE)
    • THD (VIN = 1 Vrms, f = 1 kHz) не более 0.003 %
    • Рассеиваемая мощность 550 мВт
    • Input resistance 50 кОм

Управление аудиопроцессором осуществляется при помощи трех проводной шины CL, DI, CE

Команда управления содержит 52 бита, 8 бит адрес и 44 бита данные.

При изменении одного или нескольких параметров аудиопроцессора всегда необходимо передавать 52 бита данных, а так как управление аттенюаторами front/rear раздельное, то необходимо передавать пакет данных дважды (для rear и front отдельно по 52 бита).

Схема подключения

Тестовый скетч:

#define CE 3
#define DI 2
#define CL 4
 
 
void setup(){
  pinMode(CE,OUTPUT);
  pinMode(DI,OUTPUT);
  pinMode(CL,OUTPUT);
  digitalWrite(CL,LOW);
  digitalWrite(CE,LOW);
  digitalWrite(DI,LOW);
  delay(200);
     //fader  s_bass bass treb vol in_g in rf  out_g ch mute
  audio(15,   1 ,    7,   8,   0,  0,   1, 1,  0,    1, 0 );// Lch (ch=1) | front(rf=1,fader=15)
  audio(15,   1 ,    7,   8,   0,  0,   1, 0,  0,    2, 0 );// Rch (ch=2) | rear (rf=0,fader=15)
  }
 
void loop(){
 
 
  }
 
void audio(int fader, int super_bass, int bass, int treb, int vol, int in_gain, int in, int rf, int out_gain, int ch, int mute){
  byte tembr[15]{0b1111,0b0111,0b1011,0b0011,0b1101,0b0101,0b1001,0b0000,0b1000,0b0100,0b1100,0b0011,0b1010,0b0110,0b1110}; 
  byte volume_m[81]{0b000100101,0b11000101,0b01000101,0b10000101,0b00111001,0b11011001,0b01011001,0b10011001,0b00101001,0b11001001,0b01001001,0b10001001,0b00110001,
0b11010001,0b01010001,0b10010001,0b00100001,0b11000001,0b01000001,0b10000001,0b00111110,0b11011110,0b01011110,0b10011110,0b00101110,0b11001110,0b01001110,0b10001110,
0b00110110,0b11010110,0b01010110,0b10010110,0b00100110,0b11000110,0b01000110,0b10000110,0b00111010,0b11011010,0b01011010,0b10011010,0b00101010,0b11001010,0b01001010,
0b10001010,0b00110010,0b11010010,0b01010010,0b10010010,0b00100010,0b11000010,0b01000010,0b10000010,0b00111100,0b11011100,0b01011100,0b10011100,0b00101100,0b11001100,
0b01001100,0b10001100,0b00110100,0b11010100,0b01010100,0b10010100,0b00100100,0b11000100,0b01000100,0b10000100,0b00111000,0b11011000,0b01011000,0b10011000,0b00101000,
0b11001000,0b01001000,0b10001000,0b00110000,0b11010000,0b01010000,0b10010000,0b00000000};
 
  digitalWrite(CL,LOW);
  digitalWrite(CE,LOW);
    byte addr = 0b10000001;                                         
 for(int i = 7; i >= 0; i--){
   digitalWrite(CL,LOW);
   digitalWrite(DI, (addr >> i) & 0x01);
   digitalWrite(CL,HIGH);
   }
   digitalWrite(CL,LOW);
   delayMicroseconds(1);
   digitalWrite(CE,HIGH);
 
///////////// Fader step control /////////////////////////
/// int 0...15 === - ... 0 dB
// 0...3 bit
for(int i = 0; i <= 3; i++){
   digitalWrite(CL,LOW);
  switch(i){
   case 0: digitalWrite(DI, (fader & 0b0001)>>0);break;
   case 1: digitalWrite(DI, (fader & 0b0010)>>1);break;
   case 2: digitalWrite(DI, (fader & 0b0100)>>2);break;
   case 3: digitalWrite(DI, (fader & 0b1000)>>3);break;
   }
   digitalWrite(CL,HIGH);
   }
/////////////// Super bass control ////////////////////////
/// int 0...10 === flat ... boos max
// 4...7 bit
for(int i = 0; i <= 3; i++){
   digitalWrite(CL,LOW);
  switch(i){
   case 0: digitalWrite(DI, (super_bass & 0b0001)>>0);break;
   case 1: digitalWrite(DI, (super_bass & 0b0010)>>1);break;
   case 2: digitalWrite(DI, (super_bass & 0b0100)>>2);break;
   case 3: digitalWrite(DI, (super_bass & 0b1000)>>3);break;
   }
   digitalWrite(CL,HIGH);
   }
//////////// bass //////////////////////////////////
/// int 1...15 === step1...step15
// 8...11 bit
  for(int i = 3; i >= 0; i--){
        digitalWrite(CL,LOW);
        digitalWrite(DI, (tembr[bass] >> i) & 0x01);
        digitalWrite(CL,HIGH);
        }  
//////////// treb //////////////////////////////////
/// int 1...15 === step1...step15
// 12...15 bit
  for(int i = 3; i >= 0; i--){
        digitalWrite(CL,LOW);
        digitalWrite(DI, (tembr[treb] >> i) & 0x01);
        digitalWrite(CL,HIGH);
        }  
//////////// volume /////////////////////////
// int 0...80 === -79...0 dB
// 16...23 bit
  for(int i = 7; i >= 0; i--){
        digitalWrite(CL,LOW);
        digitalWrite(DI, (volume_m[vol] >> i) & 0x01);
        digitalWrite(CL,HIGH);
        }  
///////////// input gain control /////////////////////////
/// int 0...15 === 0 ... 18.75 dB
// 24...27 bit
for(int i = 0; i <= 3; i++){
   digitalWrite(CL,LOW);
  switch(i){
   case 0: digitalWrite(DI, (in_gain & 0b0001)>>0);break;
   case 1: digitalWrite(DI, (in_gain & 0b0010)>>1);break;
   case 2: digitalWrite(DI, (in_gain & 0b0100)>>2);break;
   case 3: digitalWrite(DI, (in_gain & 0b1000)>>3);break;
   }
   digitalWrite(CL,HIGH);
   } 
/////////// input_1 //////////////////////////////////
/// int 1...5 === in1...in5
// 28...29 bit
    int in1;
  switch(in){
    case 1:  in1 = 0b00;break;                       
    case 2:  in1 = 0b10;break; 
    case 3:  in1 = 0b01;break;                          
    case 4:  in1 = 0b11;break;  
    case 5:  in1 = 0b00;break;                      
    }
  for(int i = 1; i >= 0; i--){
    digitalWrite(CL,LOW);
    digitalWrite(DI, (in1 >> i) & 0x01);
    digitalWrite(CL,HIGH);
    }  
////////// rear/front ///////////
// int 0...1 === rear...front  
// 30 bit      
    digitalWrite(CL,LOW);
    digitalWrite(DI, rf);
    digitalWrite(CL,HIGH);
////////// out gain ///////////
// int 0...3 === 0 0 +6.5 +8.5 
// 31 bit
   int out_gain1;
   switch(out_gain){
    case 0: out_gain1 = 0;break;
    case 1: out_gain1 = 0;break;
    case 2: out_gain1 = 1;break;
    case 3: out_gain1 = 1;break;
    }      
    digitalWrite(CL,LOW);
    digitalWrite(DI, out_gain1);
    digitalWrite(CL,HIGH);    
/////////// input_2 //////////////////////////////////
/// int 1...5 === in1...in5
// 32 bit
    int in2;
  switch(in){
    case 1:  in2 = 1;break;                       
    case 2:  in2 = 1;break; 
    case 3:  in2 = 1;break;                          
    case 4:  in2 = 1;break;  
    case 5:  in2 = 0;break;                      
    }
    digitalWrite(CL,LOW);
    digitalWrite(DI, in2);
    digitalWrite(CL,HIGH);
/////////// Channel selection //////////////////////////////////
/// int 0...3 === Initial setting, Lch, Rch, LR
// 33...34 bit
  switch(ch){
    case 0:  ch = 0b00;break;                       
    case 1:  ch = 0b01;break; 
    case 2:  ch = 0b10;break;                          
    case 3:  ch = 0b11;break;                        
    }
  for(int i = 1; i >= 0; i--){
    digitalWrite(CL,LOW);
    digitalWrite(DI, (ch >> i) & 0x01);
    digitalWrite(CL,HIGH);
    }
////////// mute ///////////
// int 0...1 === off...on 
// 35 bit      
    digitalWrite(CL,LOW);
    digitalWrite(DI, mute);
    digitalWrite(CL,HIGH);  
///// test ////////////
// 36...38 bit
  for(int i = 2; i >= 0; i--){
    digitalWrite(CL,LOW);
    digitalWrite(DI, 0);
    digitalWrite(CL,HIGH);  
    }          
////////// out gain ///////////
// int 0...3 === 0 0 +6.5 +8.5 
// 39 bit
   int out_gain2;
   switch(out_gain){
    case 0: out_gain2 = 0;break;
    case 1: out_gain2 = 1;break;
    case 2: out_gain2 = 0;break;
    case 3: out_gain2 = 1;break;
    }      
    digitalWrite(CL,LOW);
    digitalWrite(DI, out_gain2);
    digitalWrite(CL,HIGH); 
 ///// test ////////////
 // 40 ... 43 bit
  for(int i = 3; i >= 0; i--){
    digitalWrite(CL,LOW);
    digitalWrite(DI, 0);
    digitalWrite(CL,HIGH);     
    }
//// end byte    
    digitalWrite(CL,LOW);
    delayMicroseconds(1);
    digitalWrite(CE,LOW);
 
  }

Скетч использует 1638 байт (5%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Функция управления аудиопроцессором:

//fader s_bass bass treb vol in_g in rf out_g ch mute

audio(1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11 );

  1. Аттенюаторы (byte 0…15) read / front, значение нужно отсылать 2 раза, отдельно для front и отдельно для rear
  2. Super bass (byte 0…10)
  3. Bass (byte 1…15)
  4. Treble (byte 1…15)
  5. Volume (int 0…81)
  6. Input gain (byte 0…15)
  7. Input (byte 1…5)
  8. Переключатель регулирования rear/front , значение нужно отсылать 2 раза (bool 0…1)
  9. Output gain (byte 0…3)
  10. Channel selection (byte 0…3)
  11. Mute

Пример:

Как видно в первой функции параметр fader = 15, это значить что аттенюатор выхода установлен на уровень 0 дБ, а в параметре rf установлена 1, это значит что значение аттенюатора применимо только к фронтальному выходу. Параметр ch имеет значение 1, это значить что регулировка громкости доступна только по левому каналу.

Во второй функции все аналогично, за исключением того, регулировка аттенюатора доступна только для тылового выхода, а громкость для правого канала. fr = 0 а ch = 2.

параметр ch

параметр rf

Более подробно узнать допустимые значения всех параметров можно в даташите — lc75421

Тестовый скетч настроен на максимальную громкость, активен вход №1, регуляторы тембра в среднем положении, аттенюаторы и предусилители на 0 дБ. Регулировка громкости раздельная для левого и правого канала.

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

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