Arduino и регулятор громкости pt2258

vingor
Offline
Зарегистрирован: 25.05.2014

Ребята кто нибудь сталкивался с регулятором pt2258

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

еще одного  в гугле забанили

http://forum.arduino.cc/index.php?topic=145881.0

vingor
Offline
Зарегистрирован: 25.05.2014

Я это уже смотрел но немного не понял. Может у кого есть рабочий пример?

vingor
Offline
Зарегистрирован: 25.05.2014

Мужики помогите!

Написал код контроллер PT2258 подключен правильно земли развязанны

/* Пины, к которым подключен энкодер */
#include <Wire.h> //подключаем библиотеку I2S
#define pt_addr 0x80 
enum { ENC_PIN1 = 11, ENC_PIN2 = 12 };
int volume_db=0;
int fadeAmount = 5;

void setup()
{
 pinMode(ENC_PIN1, INPUT);
 pinMode(ENC_PIN2, INPUT);
 Wire.begin();
 Serial.begin(9600);
}

/* Функция декодирования кода Грея, взятая с Википедии.
* Принимает число в коде Грея, возвращает обычное его представление.
*/
unsigned graydecode(unsigned gray)
{
 unsigned bin;

 for (bin = 0; gray; gray >>= 1)
    bin ^= gray;

 return bin;
}

void loop()
{
 static uint8_t previous_code = 0; // предыдущий считанный код
 
 /* gray_code - считанное с энкодера значение
  * code - декодированное значение
  */
 uint8_t gray_code = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1),
         code = graydecode(gray_code);
 
 /* Если считался нуль, значит был произведён щелчок ручкой энкодера */
 if (code == 0)
 {
   /* Если переход к нулю был из состояния 3 - ручка вращалась
    * по часовой стрелке, если из 1 - против.
    */
   if (previous_code == 3)
     {
     if(volume_db + fadeAmount <= 30) volume_db += fadeAmount;
     vl_wr();
     Serial.println ("<==");
     } 
   else if (previous_code == 1)
   {
     if(volume_db - fadeAmount >= 0) volume_db -= fadeAmount;
     vl_wr();
     Serial.println ("==>");
     }
}
 /* Сохраняем код и ждём 1 мс - вполне достаточно опрашивать энкодер
  * не более 1000 раз в секунду.
  */
 previous_code = code;
 delay(10);
}
void vl_wr()
{
  switch(volume_db){
  case 0:

   Wire.beginTransmission( pt_addr); // transmit to device #4
 
   Wire.write(0xD7);
   Wire.write(0xE9);  // sends one byte  
   Wire.endTransmission();    // stop transmitting
break;

case 5:
  Wire.beginTransmission( pt_addr); // transmit to device #4
  Wire.write(0XD7);
  Wire.write(0XE5);  
  Wire.endTransmission();    // stop transmitting
break;

case 10:
 Wire.beginTransmission( pt_addr); // transmit to device #4

 Wire.write(0XD6);    
 Wire.write(0XE9);  
 Wire.endTransmission();    // stop transmitting
break;

case 15:
 Wire.beginTransmission( pt_addr); // transmit to device #
 Wire.write(0XD6);
 Wire.write(0XE5);    
 Wire.endTransmission();    // stop transmitting
break;

case 20:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD5);
 Wire.write(0XE9);
 Wire.endTransmission();    // stop transmitting
break;

case 25:
 Wire.beginTransmission( pt_addr); // transmit to device #4 
 Wire.write(0XD5); 
 Wire.write(0XE5);  
 Wire.endTransmission();    // stop transmitting
break;

case 30:
 Wire.beginTransmission( pt_addr); // transmit to device #4  
 Wire.write(0XD4); 
 Wire.write(0XE9);  
 Wire.endTransmission();    // stop transmitting
break;

case 35:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD4); 
 Wire.write(0XE5); 
 Wire.endTransmission();    // stop transmitting
break;

case 40:
  Wire.beginTransmission( pt_addr); // transmit to device #4
  Wire.write(0XD4);
  Wire.write(0XE9); 
  Wire.endTransmission();    // stop transmitting
break;

case 45:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD3);
 Wire.write(0XE5); 
 Wire.endTransmission();    // stop transmitting
break;

case 50:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD2); 
 Wire.write(0XE9); 
 Wire.endTransmission();    // stop transmitting
break;

case 55:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD2);              // sends one byte
 Wire.write(0XE5);  
 Wire.endTransmission();    // stop transmitting
break;

case 60:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD1);              // sends one byte 
 Wire.write(0XE9);
 Wire.endTransmission();    // stop transmitting
break;


case 65:

 Wire.beginTransmission( pt_addr); // transmit to device #
 Wire.write(0XD1);              // sends one byte
 Wire.write(0XE5);   
 Wire.endTransmission();    // stop transmitting
break;

case 70:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD1);              // sends one byte
 Wire.write(0XE1);   
 Wire.endTransmission();    // stop transmitting
break;

case 75:
 Wire.beginTransmission( pt_addr); // transmit to device #4
 Wire.write(0XD0);              // sends one byte 
 Wire.write(0XE5);
 Wire.endTransmission();    // stop transmitting
 break;  
    
  }
}

Но регулировки громкости не происходит посмотрите в чем проблемма.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Написал код контроллер PT2258 подключен правильно земли развязанны

....тревожит развязывание земель :( 
их надо ОБЪЕДИНЯТЬ !

Пролетарии всех стран - объединяйтесь !
GND всех стран - объединяйтесь ! :)-

vingor
Offline
Зарегистрирован: 25.05.2014

Земли раздельные как в даташите.

Сегодня попробую объеденить земли и проверить еще раз.

Мне еще кажется микросхема шумит сильно после нее появляется сильный фон.

В частности прошу помощи в отпровляемых битах на микросхему. Этот кусок кода бал взят из за бугорного форума и в самих битах есть сомнение.

vingor
Offline
Зарегистрирован: 25.05.2014

Ребят помогите не отправляются у меня команды на микруху и как правильно указать команду?

в даташите есть таблица.

по таблице установить 0db 10010000, установить -70db 10010111

Шаг регулировки where: Ax=-1dB/step, Bx=-10dB/step

пробую так Wire.write(Bx10010000) arduino выдает ошибку, а на забугорном форуме отправляют Wire.write(0b10010000); но ни чего не прокатывает.

vingor
Offline
Зарегистрирован: 25.05.2014

Ауууу тут знающие люди есть ? Или только школьники отправляющие в GOOGL!

vingor
Offline
Зарегистрирован: 25.05.2014

UP!

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

vingor пишет:

Ауууу тут знающие люди есть ? Или только школьники отправляющие в GOOGL!

только школьники. на другое не надейся)))

vingor
Offline
Зарегистрирован: 25.05.2014

Спасибо вам гугло-посылатили. Разобрался с помощъю китайского форума.

/* Пины, к которым подключен энкодер */
#include <Wire.h> //подключаем библиотеку I2S
#define pt_addr 0x44 
enum { ENC_PIN1 = 11, ENC_PIN2 = 12 };
int volume_db=0;
int fadeAmount = 1;

void setup()
{
 pinMode(ENC_PIN1, INPUT);
 pinMode(ENC_PIN2, INPUT);
  Wire.begin();
  Wire.beginTransmission(pt_addr);
  Wire.write(0xC0);
  Wire.endTransmission();
 Serial.begin(9600);
}

/* Функция декодирования кода Грея, взятая с Википедии.
* Принимает число в коде Грея, возвращает обычное его представление.
*/
unsigned graydecode(unsigned gray)
{
 unsigned bin;

 for (bin = 0; gray; gray >>= 1)
    bin ^= gray;

 return bin;
}

void loop()
{
 static uint8_t previous_code = 0; // предыдущий считанный код
 
 /* gray_code - считанное с энкодера значение
  * code - декодированное значение
  */
 uint8_t gray_code = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1),
         code = graydecode(gray_code);
 
 /* Если считался нуль, значит был произведён щелчок ручкой энкодера */
 if (code == 0)
 {
   /* Если переход к нулю был из состояния 3 - ручка вращалась
    * по часовой стрелке, если из 1 - против.
    */
   if (previous_code == 3)
     {
     if(volume_db + fadeAmount <= 70) volume_db += fadeAmount;
     set_volume(volume_db);
     Serial.println ("<==");
     } 
   else if (previous_code == 1)
   {
     if(volume_db - fadeAmount >= 0) volume_db -= fadeAmount;
     set_volume(volume_db);
     Serial.println ("==>");
     }
}
 /* Сохраняем код и ждём 1 мс - вполне достаточно опрашивать энкодер
  * не более 1000 раз в секунду.
  */
 previous_code = code;
 delay(10);
}
void set_volume(uint8_t value) {
  uint8_t tens = value / 10;
  uint8_t ones = value % 10;
  Wire.beginTransmission(pt_addr);
  Wire.write(0x80 | tens);
  Wire.write(0x90 | ones);
  Wire.endTransmission();
}

Ловите школьники исправный код.

Регулировка производится энкодером.

Переменной fadeAmount настраивается шаг регулировки.

Адрес i2c нихрена не соответствует даташиту, советую просканить микруху и узнать ее фактический адрес у меня он 0x44

И самое главное микросхема регулирует громкость от -70 дицибел до нуля. Но у этой заразы уровень шума -100 дицибел и чтобы нормально раскачать усилок после микросхемы нужен предусилитель с КУ 2-5.

Юзайте на здоровье/

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот. сам разобрался))

Duke
Offline
Зарегистрирован: 15.02.2017

В куске кода для void set_volume используемые адреса для записи десятков и единиц децибел 0x80Н (десятки) и 0х90Н (единицы) регулируют только первый канал на РТ2258, это вход пин 1 и выход пин 20 на чипе. Все остальные каналы при этом не регулируются! Для того, чтобы регулировать все 6 каналов одновременно, нужно использовать адреса  0хD0Н (десятки) и 0хЕ0Н (единицы). Можно также регулировать громкости каждого канала или групп каналов в любых сочетаниях, для этого нужно использовать таблицу их адресов в даташите, там они все даны в двоичном коде (старшие четыре бита - адрес, младшие - значение как по коду выше). Кроме того, запись по адресу 0хF9Н (11111001) глушит звук полностью (Mute), по адресу 0хF8Н (11111000) - возобновляет (Unmute).

Касательно адреса самого чипа - согласно даташиту его можно выбирать из 4-х вариантов в зависимости от подачи логических сигналов 0 или 1 на пины CODE1 (17) и CODE2 (4). Видимо, это информация недостоверна, так как по даташиту комбинация CODE1=0, CODE2=1 должна давать адрес чипа 0х84Н, в реальности он действительно 0х44Н как его определяет сканнер шины I2C. Другие комбинации не пробовал, возможно, они тоже не совпадают.

fastoma
fastoma аватар
Offline
Зарегистрирован: 27.07.2017

Собрал регулятор громкости pt2258. Сильный шум перепаивал неоднократно конденсаторы впаивал резисторы, всё бестолку. Это не может быть в коде?

Когда добавляешь громкость шум уменьшается.

Когда уменьшаешь громкость шум увеличивается.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

pt2258 китайская, наерна.  Перемаркированый генератор белого шума.