ИМС 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 (часовой с двумя точками).
При нажатии на кнопку энкодера активируется режим 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
Следующий скетч аналогичен предыдущему, но в нем вместо энкодера используются три кнопки.
Подключение кнопок (цифровые входы 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;}}