1

Тема: Регулятор громкости M62429

Микросхема M62429 при совместном использовании с Arduino Nano (Uno) позволяет регулировать громкость (стерео) в диапазоне от -83 до 0 дБ, регулировка громкости осуществляется одновременно по двум каналам, так и раздельно. Для управления микросхемой M62429 используется последовательный интерфейс с пакетной передачей данных.

Основные характеристики M62429 (m62429.pdf):

Напряжение питания 4.5 … 5.5 В
THD = 0.01 % Typ. (V0 = 0.5 Vrms)
Разделение каналов 80 дБ
Диапазон регулировки громкости от -83 до дБ с шагом 1 дБ
Ток потребления 8 мА
Максимальное входное напряжение 1.7 Vrms

http://rcl-radio.ru/wp-content/uploads/2019/07/Screenshot-22.07.2019-115153.png

денсатор 2.2 мкФ.

Функция библиотеки setVolume содержит несколько переменных, значения которых необходимо указать:

setVolume (1,2,3,4,5);

I/O вывод Arduino для CLK
I/O выводы Arduino для DATA
Регулировка громкости раздельная 0, одновременно оба канала 1
Номер канала 1,2 ПК ЛК (1 в 3 пункте, эта функция не активна)
Уровень громкости от 83 (можно указывать -83) до 0 (макс.)

M62429.h

#include <Arduino.h>

void setVolume (int clk, int data, int canal, int k, int att);

M62429.cpp

#include <Arduino.h>

void setVolume (int clk, int data, int canal, int k, int att){
  pinMode(data, OUTPUT);
  pinMode(clk, OUTPUT);
  digitalWrite(data, HIGH);
  digitalWrite(clk, LOW);
  
  
   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
};   
int att1index = floor(abs(att) / 4);
  int att2index = abs(att) % 4;
  
  // Задаём в пакете канал:
  digitalWrite(data, (bool)canal);
  digitalWrite(clk, HIGH);
  digitalWrite(data, LOW);
  digitalWrite(clk, LOW);

  // Задаём одновременное или независимое управление каналами:
  digitalWrite(data, k);
  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(2);
  digitalWrite(data, LOW);
  digitalWrite(clk, LOW);
  delayMicroseconds(2);

  digitalWrite(data, HIGH);
  digitalWrite(clk, HIGH);
  delayMicroseconds(2);
  digitalWrite(clk, LOW);
  digitalWrite(data, LOW);
  delayMicroseconds(2);

}