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