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

ИМС PT2258 — шести канальный регулятор громкости с микроконтроллерным управлением. Управление PT2258 осуществляется при помощи шины I2C. Регулятор громкости обладает низким уровнем шума и малым коэффициентом нелинейных искажений. Регулировка громкости может быть как независимая для каждого канала, так и общая для всех каналов.

Основные характеристики PT2258:

  • Напряжение питания от 5 до 10 В, 9 В — рекомендуемое
  • Ток потребления 8 мА
  • Входное сопротивление 30 кОм
  • Максимальное входное напряжение 2,8 Vrms
  • Разделение каналов 100 дБ
  • Коэффициент нелинейных искажений 0,005%
  • Диапазон регулировки громкости от -79 до 0 дБ
  • Шаг регулировки громкости 1 дБ
  • Режим MUTE
  • Отношение сигнал/шум 105 дБ

Схема регулятора громкости достаточно проста, выводы 4 и 17 (CODE2 и CODE1) в зависимости от подключения к GND или VCC позволяют изменять адрес микросхемы при работе с I2C шиной, что дает возможность подключения других утс-в на шину I2С, у которых нет возможности изменить адрес:

  • CODE1 = GND, CODE2 = GND 80H
  • CODE1 = GND, CODE2 = VCC 84H
  • CODE1 = VCC, CODE2 = GND 88H
  • CODE1 = VCC, CODE2 = VCC 8CH

Для управления работой аудиопроцессора используется несколько регистров:

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

Производитель рекомендует перед отправкой информации об уровне громкости производить очистку регистров:

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

При использовании платформы Arduino можно сделать простой регулятор громкости, управление громкостью осуществляется при помощи энкодера, а информация от текущем уровне громкости выводится на дисплей TM1637 (часовой с двумя точками).

энкодер ky-040

Регулировка громкости общая для всех каналов, но имеется возможность изменять усиление для каждого канала, для этого необходимо нажать кнопку энкодера для выбора канала и поворотом ручки энкодера установить необходимое усиление. Диапазон общей регулировки громкости от 0 до 64 единиц (-79… -15 дБ), поканальная регулировка от 0 до 15 дБ.

TM1637 Режим MUTE
#include <Wire.h> // Входит в состав Arduino IDE
#include <Encoder.h> // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <EEPROM.h> // Входит в состав Arduino IDE
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <PT2258.h> // https://github.com/liman324/PT2258.git
#include <STM32_TM1637.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=452&download=1
    STM32_TM1637 tm(2,3);// CLK, DIO
    PT2258 pt;
    Encoder myEnc(9, 8);// DT, CLK
 
    int vol,w,w1,mute,menu;
    unsigned long time,oldPosition  = -999,newPosition; 
    int ch[6],ch_vol[7]; 
 
void setup() {
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  pinMode(11,INPUT_PULLUP);  // КНОПКА MUTE
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении 
  tm.brig(7); // ЯРКОСТЬ 0...7
  tm.print_float(0,0,  0b01000000,0b01110011,0b01111000,0b01000000);
  delay(2000);
  tm.print_float(2258,0,  0,0,0,0);
  delay(2000);
  vol = EEPROM.read(0);
  ch_vol[1] = EEPROM.read(1);ch_vol[2] = EEPROM.read(2);ch_vol[3] = EEPROM.read(3);ch_vol[4] = EEPROM.read(4);ch_vol[5] = EEPROM.read(5);ch_vol[6] = EEPROM.read(6);
  audio();
}
 
void loop() {
  if(digitalRead(10)==LOW){menu++;w=1;delay(200);if(menu>6){menu=0;}}
 
 if(menu == 0){ 
  ////////// VOLUME //////////////
 if(newPosition != oldPosition&&mute==0){oldPosition = newPosition;vol=vol+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;vol_func();} 
 if(w==1){w=0;audio();tm.print_float(vol-15,1,  0b00001000,0,0,0b00001000);}
 }
 
  if(menu>0){ 
  ////////// VOLUME //////////////
 if(newPosition != oldPosition&&mute==0){oldPosition = newPosition;ch_vol[menu]=ch_vol[menu]+newPosition;myEnc.write(0);newPosition=0;time=millis();w=1;w1=1;ch_vol_func();} 
 if(w==1){w=0;audio();tm.print_float(menu*1000+ch_vol[menu],1,  0,0b00001000,0,0);}
 }
 
 ///////// MUTE //////////// 
  if(digitalRead(11)==LOW&&mute==0){mute=1; audio();tm.print_float(0,0,  0b01000000,0b01000000,0b01000000,0b01000000);delay(500);}
  if(digitalRead(11)==LOW&&mute==1){mute=0; audio();w=1;delay(500);}
 
  ///////// EEPROM /////////////
 if(millis()-time>5000 && w1==1){w1=0;EEPROM.update(0,vol);
 EEPROM.update(1,ch_vol[1]);EEPROM.update(2,ch_vol[2]);EEPROM.update(3,ch_vol[3]);
 EEPROM.update(4,ch_vol[4]);EEPROM.update(5,ch_vol[5]);EEPROM.update(6,ch_vol[6]);
 }
 delay(10);
}
 
void audio(){
        pt.clear(); 
      //  pt.setVolume(75); //  int 0...79     
        pt.setVol1(vol-15+ch_vol[1]); //  int 0...79       
        pt.setVol2(vol-15+ch_vol[2]); //  int 0...79 
        pt.setVol3(vol-15+ch_vol[3]); //  int 0...79 
        pt.setVol4(vol-15+ch_vol[4]); //  int 0...79 
        pt.setVol5(vol-15+ch_vol[5]); //  int 0...79 
        pt.setVol6(vol-15+ch_vol[6]); //  int 0...79 
        pt.setMute(mute); // mute 0 - off / 1 - on
  }
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void vol_func(){if(vol<15){vol=15;}if(vol>79){vol=79;}}
void ch_vol_func(){if(ch_vol[menu]<0){ch_vol[menu]=0;}if(ch_vol[menu]>15){ch_vol[menu]=15;}}

pt2258.pdf

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=110

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

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