Рейтинг@Mail.ru

Как подключить регулятор громкости M62429 к Arduino

Print Friendly, PDF & Email

Микросхема M62429 предназначена для снижения громкости звука в электрических схемах. Микросхема позволяет управлять одновременно и независимо двумя звуковыми каналами. Диапазон регулировки звука – от 0 до -83 дБ, т.е. микросхема способна ослаблять уровень громкости примерно в 100000 раз.

1Описание регулятора громкостиM62429

Микросхема M62429 выполняется в двух типах корпусов – DIP-8 (8P4) и SOP-8 (8P2S-A). Назначение выводов для обоих типов корпусов приведена на рисунке. Как видно, тут имеется два входа (VIN1, VIN2) и два выхода (VOUT1, VOUT2) для звуковых каналов, питание и земля (VCC и GND), а также две управляющие ножки (DATA и CLOCK).

Питание микросхемы осуществляется напряжением от 4,5 до 5,5 В (абсолютный максимум – 6 вольт).

Расположение выводов на микросхеме M62429
Расположение выводов на микросхеме M62429

Вот так выглядит микросхема в выводном корпусе:

Микросхеме M62429 в DIP-корпусе
Микросхеме M62429 в DIP-корпусе

У меня микросхема в корпусе для поверхностного монтажа. К такой микросхеме сложно подключиться без пайки, поэтому для тестирования я буду использовать вот такой переходник с корпуса SOP-8 на соединители типа PLS:

Микросхема M62429 на плате-переходнике
Микросхема M62429 на плате-переходнике

2Схема подключения микросхемы M62429 к Arduino

Подключим микросхему к Arduino и к микрофону вот по такой схеме:

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

Производитель рекомендует стабилизировать вход питания VCC с помощью развязывающего конденсатора (соединить вход питания с землёй через ёмкость 0,1…0,33 мкФ).

Также производитель рекомендует поставить на вход электролитический конденсатор ёмкостью 2,2 мкФ (схему см. на последней странице технического описания).

Микрофон и динамик на схеме изображены условно просто чтобы показать, что на вход VIN1 микросхемы M62429 подаётся выход с микрофона или иного источника аудиосигнала, а выход – далее в электрическую цепь и на устройство воспроизведения звука.

3Описание последовательного сигнала управления регулятором громкости M62429

Для управления микросхемой M62429 используется последовательный интерфейс с пакетной передачей данных. Длина одного пакета данных – 11 бит. Структура пакета приведена на рисунке.

Структура пакета управления микросхемой M62429
Структура пакета управления микросхемой M62429

Первым битом передаётся номер канала, вторым – использовать ли независимое управление каналами или одновременное, далее 7 бит отведены под код громкости, и завершают пакет два бита, равные "1".

Важно знать параметры импульсов частоты и данных. Микросхема управляется меандром (скважность равна 2), минимальная длительность импульса tWHC (как и tWLC) – 1,6 мкс, а период tcr – 4 мкс. Остальные характеристики импульсов приводятся в техническом описании (datasheet), которое можно скачать по ссылкам ниже.

Временная диаграмма сигнала информационного обмена с микросхемой M62429
Временная диаграмма сигнала информационного обмена с микросхемой M62429

4Скетч для управления микросхемой M62429 с помощью Arduino

Зная всё это, напишем скетч, который будет изменять громкость регулятора от максимума до минимума со скоростью 1 децибел в секунду. Сердце программы – процедура setVolume() и два массива кодов громкости, которые составлены из двух таблиц кодов громкости в техническом описании (таблицы "Volume Code").

Скетч управления регулятором громкости M62429 (разворачивается)
const int CLK = 4;
const int DATA = 2;
const int twhc  = 2;
const int twlc  = 2;

// Коды громкости аттенюатора 1.
// Значения кодов - из таблицы кодов громкости из технического описания.
int att1[21][5] = {
  {1, 0, 1, 0, 1}, //-0db
  {0, 0, 1, 0, 1}, //-4db
  {1, 1, 0, 0, 1}, //-8db
  {0, 1, 0, 0, 1}, //-12db
  {1, 0, 0, 0, 1}, //-16db
  {0, 0, 0, 0, 1}, //-20db
  {1, 1, 1, 1, 0}, //-24db
  {0, 1, 1, 1, 0}, //-28db
  {1, 0, 1, 1, 0}, //-32db
  {0, 0, 1, 1, 0}, //-36db
  {1, 1, 0, 1, 0}, //-40db
  {0, 1, 0, 1, 0}, //-44db
  {1, 0, 0, 1, 0}, //-48db
  {0, 0, 0, 1, 0}, //-52db
  {1, 1, 1, 0, 0}, //-56db
  {0, 1, 1, 0, 0}, //-60db
  {1, 0, 1, 0, 0}, //-64db
  {0, 0, 1, 0, 0}, //-68db
  {1, 1, 0, 0, 0}, //-72db
  {0, 1, 0, 0, 0}, //-76db
  {1, 0, 0, 0, 0}  //-80db
};

// Коды громкости аттенюатора 2
int att2[4][2] = {
  {1, 1}, //-0db
  {0, 1}, //-1db
  {1, 0}, //-2db
  {0 ,0}  //-3db
};

void setup() {
  pinMode(DATA, OUTPUT);
  pinMode(CLK, OUTPUT);
  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, LOW);
  delay(1000);
}

void loop() {
  // Ежесекундно уменьшаем громкость на 1 дБ,
  // по достижении -83 дБ начинаем с начала:
  for (int db=0; db>=-83; db-=1){
    setVolume(0, true, db);
    delay(1000);
  }
  delay(2000);
}

// Задаёт уровень громкости в заданном канале.
// channel – канал, 0 или 1;
// independent – управление одним каналом (true) или обоими сразу (false);
// decibels – ослабление громкости в децибелах, от 0 до -83.
void setVolume(int channel, bool independent, int decibels) {

  // Определяем значения аттенюаторов:
  int att1index = floor(abs(decibels) / 4);
  int att2index = abs(decibels) % 4;
  
  // Задаём в пакете канал:
  digitalWrite(DATA, (bool)channel);
  digitalWrite(CLK, HIGH);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);

  // Задаём одновременное или независимое управление каналами:
  digitalWrite(DATA, independent);
  digitalWrite(CLK, HIGH);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);

  // Задаём значение 1-го аттенюатора D2..D6:
  for (int i=0; i<5; i++) {
    digitalWrite(DATA, (bool)att1[att1index][i]);
    digitalWrite(CLK, HIGH);
    digitalWrite(DATA, LOW);
    digitalWrite(CLK, LOW);
  }
  
  // Задаём значение 2-го аттенюатора D7..D8:
  for (int i=0; i<2; i++) {
    digitalWrite(DATA, (bool)att2[att2index][i]);
    digitalWrite(CLK, HIGH);
    digitalWrite(DATA, LOW);
    digitalWrite(CLK, LOW);
  }

  // Два последних бита пакета – две единицы:
  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, HIGH);
  delayMicroseconds(twhc);
  digitalWrite(DATA, LOW);
  digitalWrite(CLK, LOW);
  delayMicroseconds(twlc);

  digitalWrite(DATA, HIGH);
  digitalWrite(CLK, HIGH);
  delayMicroseconds(twhc);
  digitalWrite(CLK, LOW);
  digitalWrite(DATA, LOW);
  delayMicroseconds(twlc);
}

Замечу, что в децибелах задавать ослабление громкости не всегда удобно. Можно сделать процедуру, принимающую, допустим, уровень громкости. Типа такого: setVolumeInPercent(0, true, 35), где 0 – второй канал, true говорит о независимом управлении каналами, а 35 – уровень громкости в процентах от максимального (или же наоборот – уровень ослабления аттенюатора).

Загрузим скетч в память Arduino и посмотрим на результат. Я подключил осциллограф к каналам CLOCK и DATA для демонстрации.

Осциллограмма информационного обмена Arduino с микросхемой M62429
Осциллограмма информационного обмена Arduino с микросхемой M62429

Фиолетовый сигнал – CLOCK, зелёный – DATA.

Осциллограмма информационного обмена Arduino с микросхемой M62429
Осциллограмма информационного обмена Arduino с микросхемой M62429

А вот как выглядит осциллограмма напряжения на выходе VOUT1 микросхемы M62429.

Изменение напряжения на выходе микросхемы M62429
Изменение напряжения на выходе микросхемы M62429

Скачать техническое описание на микросхему M62429

Управление регулятором громкости M62429
Последнее изменениеСуббота, 19 Май 2018 19:57 Прочитано 965 раз

Поделиться

Print Friendly, PDF & Email

Оставить комментарий

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены