Найти в Дзене
Радиотехника

M62446 6-и канальный регулятор громкости и тембра (Arduino)

Аудиопроцессор M62446 выпускается в двух вариантах M62446FP и M62446AFP, последний содержит более расширенный диапазон регулировки громкости и тембра. В ИМС M62446 нет коммутатора входов, микросхема имеет 8 входов (Cin SWin SLin SRin BYPASS1 BYPASS2 Lin Rin), два из которых (BYPASS1 BYPASS2) это входы для правого и левого канала (Lin Rin) но в обход регулятора громкости. Регулировка тембра осуществляется только по двум входам / выходам (Lin Rin / Lout Rout). Соответственно микросхема имеет 6 выходов (Cout SWout SLout SRout Lout Rout), регулировка громкости на каждом канале независимая. Характеристики M62446: M62446 содержит всего 4-е 16-и битных регистра управления: Данные передаются начиная со старшего бита регистра и заканчиваются импульсом LATCH (защелка), после чего можно начать передачу данных для следующего регистра. Схема Тестовый скетч : #define LATCH   2
#define DATA    3
#define CLOCK   4
void setup() {
 Serial.begin(9600);
 pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);

Аудиопроцессор M62446 выпускается в двух вариантах M62446FP и M62446AFP, последний содержит более расширенный диапазон регулировки громкости и тембра. В ИМС M62446 нет коммутатора входов, микросхема имеет 8 входов (Cin SWin SLin SRin BYPASS1 BYPASS2 Lin Rin), два из которых (BYPASS1 BYPASS2) это входы для правого и левого канала (Lin Rin) но в обход регулятора громкости. Регулировка тембра осуществляется только по двум входам / выходам (Lin Rin / Lout Rout). Соответственно микросхема имеет 6 выходов (Cout SWout SLout SRout Lout Rout), регулировка громкости на каждом канале независимая.

Характеристики M62446:

  • Регулировка громкости для M62446AFP от 0 до –95 dB (1 dB/шаг) и от 0 до –79 dB (1 dB/шаг) для M62446FP
  • Регулировка тембра для M62446AFP от -14 до +14 dB (2 dB/шаг) и от -10 до +10 dB (1 dB/шаг) для M62446FP
  • 4-е цифровых выхода, для управления различными периферийными уст-вами в максимальным током нагрузки 0,2 мА
  • Напряжение питания +4,5 … 5,5 В (digital) и  ±4.5 … ±7.5 В (analog)
  • КНИ не более 0.002 %
  • Управление цифровое 3-wire

M62446 содержит всего 4-е 16-и битных регистра управления:

-2

Данные передаются начиная со старшего бита регистра и заканчиваются импульсом LATCH (защелка), после чего можно начать передачу данных для следующего регистра.

-3

Схема

-4

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

#define LATCH   2
#define DATA    3
#define CLOCK   4

void setup() {
Serial.begin(9600);
 pinMode(LATCH, OUTPUT);digitalWrite(LATCH, LOW);
 pinMode(DATA, OUTPUT);digitalWrite(DATA, LOW);
 pinMode(CLOCK, OUTPUT);digitalWrite(CLOCK, LOW);
 delay(100);
}

void loop() {
 byte_1(0,0b0000,0,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
 byte_2(0,0);// 0...95 = 0...-95 dB mute = 112
 byte_3(0,0);// 0...95 = 0...-95 dB mute = 112
 byte_4(0,0);// 0...95 = 0...-95 dB mute = 112
 delay(1000);

}

void byte_1(int treb, byte port, int bass, bool by_pass){
 // treb int -7...+7 === -14...+14 dB
 // bass int -7...+7 === -14...+14 dB
 // byte port 0b0000....0b1111
 // by_pass  === 0 TONE | 1 BYPASS
 switch(treb){
   case -7: treb = 0b1111;break;
   case -6: treb = 0b1101;break;
   case -5: treb = 0b1110;break;
   case -4: treb = 0b1100;break;
   case -3: treb = 0b1011;break;
   case -2: treb = 0b1010;break;
   case -1: treb = 0b1001;break;
   case  0: treb = 0b0000;break;
   case  1: treb = 0b0001;break;
   case  2: treb = 0b0010;break;
   case  3: treb = 0b0011;break;
   case  4: treb = 0b0100;break;
   case  5: treb = 0b0110;break;
   case  6: treb = 0b0101;break;
   case  7: treb = 0b0111;break;
   }
 switch(bass){
   case -7: bass = 0b1111;break;
   case -6: bass = 0b1101;break;
   case -5: bass = 0b1110;break;
   case -4: bass = 0b1100;break;
   case -3: bass = 0b1011;break;
   case -2: bass = 0b1010;break;
   case -1: bass = 0b1001;break;
   case  0: bass = 0b0000;break;
   case  1: bass = 0b0001;break;
   case  2: bass = 0b0010;break;
   case  3: bass = 0b0011;break;
   case  4: bass = 0b0100;break;
   case  5: bass = 0b0110;break;
   case  6: bass = 0b0101;break;
   case  7: bass = 0b0111;break;
   }  
 unsigned int data_byte = (treb<<12)|(port<<8)|(bass<<4)|(by_pass<<2)|0b00;
 writeByte(data_byte);  
 }

void byte_2(int vol_l, int vol_r){
 // int vol 0...95 === 0...-95 dB mute=112
 if(vol_l>79){vol_l=vol_l+16;}
 if(vol_r>79){vol_r=vol_r+16;}
 unsigned int data_byte = (vol_l<<9)|(vol_r<<2)|0b01;
 writeByte(data_byte);
 }  
void byte_3(int vol_c, int vol_sw){
 // int vol 0...95 === 0...-95 dB mute=112
 if(vol_c>79){vol_c=vol_c+16;}
 if(vol_sw>79){vol_sw=vol_sw+16;}
 unsigned int data_byte = (vol_c<<9)|(vol_sw<<2)|0b10;
 writeByte(data_byte);
 }  
void byte_4(int vol_sl, int vol_sr){
 // int vol 0...95 === 0...-95 dB mute=112
 if(vol_sl>79){vol_sl=vol_sl+16;}
 if(vol_sr>79){vol_sr=vol_sr+16;}
 unsigned int data_byte = (vol_sl<<9)|(vol_sr<<2)|0b11;
 writeByte(data_byte);
 }    

void writeByte(uint16_t data){
   digitalWrite(LATCH, HIGH); delayMicroseconds(1);
   digitalWrite(LATCH, LOW); delayMicroseconds(3);
   for (int i = 15; i >= 0; i--) {
       digitalWrite(DATA, (data >> i) & 1); delayMicroseconds(3);
       digitalWrite(CLOCK, HIGH); delayMicroseconds(3);
       digitalWrite(CLOCK, LOW); delayMicroseconds(3);
   }
   digitalWrite(LATCH, HIGH); delayMicroseconds(1);
   digitalWrite(LATCH, LOW); delayMicroseconds(3);
}

Как видно скетч содержит 4-е функции управления (одна на каждый регистр), первая функция управляет тембром, а остальные громкостью всех каналов (по 2 канала на функцию):

byte_1(5,0b0000,5,0);// treb -7...7, port 0b0000, bass -7...7, bypass = 0
 byte_2(0,0);// 0...95 = 0...-95 dB mute = 112
 byte_3(0,0);// 0...95 = 0...-95 dB mute = 112
 byte_4(0,0);// 0...95 = 0...-95 dB mute = 112

Для M62446FP которая имеет более узкий диапазон регулировки громкости и тембра необходимо использовать следующий пример:

byte_1(5,0b0000,5,0);// treb -5...5, port 0b0000, bass -5...5, bypass = 0
 byte_2(0,0);// 0...79 = 0...-79 dB mute = 80
 byte_3(0,0);// 0...79 = 0...-79 dB mute = 80
 byte_4(0,0);// 0...79 = 0...-79 dB mute = 80

Далее рассмотрим пример создания регулятора громкости и тембра на базе ИМС M62446.

-5

Регулировка всех параметров регулятора громкости и тембра будет осуществляться при помощи энкодера (модуль KY-040) и трех кнопок, дополнительно управление параметрам будет продублировано ИК пультом (ИК-датчик VS1838B). Вся информация будет выводится на LCD2004_I2C.

Дополнительно регулятор громкости и тембра имеет функцию STANDBY и MUTE. Так же в примере используются часы реального времени DS3231 (модуль).

В режиме STANDBY (POWER_OFF) на дисплей будет выводится текущее время, подсветка дисплея будет работать с пониженной яркостью.

-6
-7
-8
-9

В проекте используется два меню, в первом меню выводятся основные параметры аудиопроцессора — громкость, тембр НЧ и ВЧ и часы. Во втором меню осуществляется регулировка аттенюаторов выходов.

Для перехода из одного меню в другое используйте кнопку SET. Регулировка параметров осуществляется путем поворота ручки энкодера, переход от одного параметра к другому осуществляется при помощи кнопки энкодера.

-10

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

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

  • Установки времени через скетч:

Раскомментируйте строку:

clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча

загрузите скетч, далее закомментируйте строку:

// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча

повторно загрузите скетч.

  • Установка времени кнопками:
  • Перейдите в режим STANDBY, нажать и удерживать кнопку энкодера, нажимать кнопки:SET — коррекция часов
    MUTE — коррекция минут

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

// IR
#define IR_OK    0x33B8A05F // Кнопка OK
#define IR_UP    0x33B810EF // Кнопка >
#define IR_DW    0x33B8E01F // Кнопка <
#define IR_SET   0x33B844BB // Кнопка SET
#define IR_MUTE  0x33B8946B // Кнопка MUTE
#define IR_POWER 0x33B800FF // Кнопка STANDBY (POWER)

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

-11

Схема блока контроллера

-12

Скетч - http://rcl-radio.ru/?p=132667