PT2259 2-х канальный регулятор громкости (Arduino)

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

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

  • Напряжение питания однополярное от 4 до 12 В, 9 В — рекомендуемое
  • Ток потребления 2,5 мА (9В)
  • Диапазон регулировки от -79 до 0 дБ
  • Максимальное выходное напряжение 2.5 Vrms
  • Коэффициент нелинейных искажений 0.003 % (Vout= 200mVrms, f=1kHz, Vol.Att.=0dB, A-weight Rload = 50 KΩ )
  • Отношение сигнал/шум 120 дБ
  • Режим MUTE, уровень -95 дБ
  • Входное сопротивление 33 кОм

За управление работой PT2259 отвечают 8 регистров:

Как видно из таблицы, имеется регулировка звука одновременно по двум каналам, так и раздельная, при этом уровень громкости изменяется при помощи двух регистров, для единиц и десятков дБ.

Два последних регистра это регистр сброса и регистр управления функцией MUTE.

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

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

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

энкодер ky-040

При нажатии на кнопку энкодера активируется режим 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 <PT2259.h> // https://github.com/liman324/PT2259.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
 PT2259 pt;
 Encoder myEnc(9, 8);// DT, CLK
 
 int vol,w,w1,mute;
 unsigned long time,oldPosition  = -999,newPosition;   
 
void setup(){
  pinMode(10,INPUT);  // МЕНЮ КНОПКА SW энкодера
  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(2259,0,  0,0,0,0);
  delay(2000);
  vol = EEPROM.read(0);
  audio();
  }
 
void loop(){
////////// 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,1,  0b00001000,0,0,0b00001000);}
 
///////// MUTE //////////// 
  if(digitalRead(10)==LOW&&mute==0){mute=1; audio();tm.print_float(0,0,  0b01000000,0b01000000,0b01000000,0b01000000);delay(200);}
  if(digitalRead(10)==LOW&&mute==1){mute=0; audio();w=1;delay(200);}
 
///////// EEPROM /////////////
   if(millis()-time>5000 && w1==1){w1=0;EEPROM.update(0,vol);}
   delay(10);
}// loop
 
void audio(){
 pt.setVol_ch2(mute, vol); // mute, vol
// mute on  === 1
// mute off === 0
// vol === -79...0 dB === int 0...79  
// channel-by-channel adjustment
// pt.setVol_left(0, 79);
// pt.setVol_right(0, 79);
  } 
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void vol_func(){if(vol<0){vol=0;}if(vol>79){vol=79;}}

Библиотека — http://forum.rcl-radio.ru/viewtopic.php?id=169

PT2259.pdf


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

Подключение кнопок (цифровые входы D10 — mute, D6 — громкость+, D7 — громкость- )

#include <Wire.h> // Входит в состав Arduino IDE
#include <EEPROM.h> // Входит в состав Arduino IDE
#include <PT2259.h> // https://github.com/liman324/PT2259.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
 PT2259 pt;
 
 
 int vol,w=1,w1,mute;
 unsigned long time;
 
void setup(){
  pinMode(10,INPUT_PULLUP);  // mute
  pinMode(6,INPUT_PULLUP);  // +
  pinMode(7,INPUT_PULLUP);  // -
 
  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(2259,0,  0,0,0,0);
  delay(2000);
  vol = EEPROM.read(0);
  audio();
  }
 
void loop(){
////////// VOLUME //////////////
 if(digitalRead(6)==LOW&&mute==0){vol++;delay(300);time=millis();w=1;w1=1;vol_func();} 
 if(digitalRead(7)==LOW&&mute==0){vol--;delay(300);time=millis();w=1;w1=1;vol_func();} 
 if(w==1){w=0;audio();tm.print_float(vol,1,  0b00001000,0,0,0b00001000);}
 
///////// MUTE //////////// 
  if(digitalRead(10)==LOW&&mute==0){mute=1; audio();tm.print_float(0,0,  0b01000000,0b01000000,0b01000000,0b01000000);delay(500);}
  if(digitalRead(10)==LOW&&mute==1){mute=0; audio();w=1;delay(500);}
 
///////// EEPROM /////////////
   if(millis()-time>5000 && w1==1){w1=0;EEPROM.update(0,vol);}
   delay(10);
}// loop
 
void audio(){
 pt.setVol_ch2(mute, vol); // mute, vol
// mute on  === 1
// mute off === 0
// vol === -79...0 dB === int 0...79  
// channel-by-channel adjustment
// pt.setVol_left(0, 79);
// pt.setVol_right(0, 79);
  } 
 
void vol_func(){if(vol<0){vol=0;}if(vol>79){vol=79;}}

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

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