Адрес i2c нихрена не соответствует даташиту, советую просканить микруху и узнать ее фактический адрес у меня он 0x44
И самое главное микросхема регулирует громкость от -70 дицибел до нуля. Но у этой заразы уровень шума -100 дицибел и чтобы нормально раскачать усилок после микросхемы нужен предусилитель с КУ 2-5.
В куске кода для 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. Другие комбинации не пробовал, возможно, они тоже не совпадают.
еще одного в гугле забанили
http://forum.arduino.cc/index.php?topic=145881.0
Я это уже смотрел но немного не понял. Может у кого есть рабочий пример?
Мужики помогите!
Написал код контроллер 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; } }Но регулировки громкости не происходит посмотрите в чем проблемма.
Написал код контроллер PT2258 подключен правильно земли развязанны
....тревожит развязывание земель :(
их надо ОБЪЕДИНЯТЬ !
Пролетарии всех стран - объединяйтесь !
GND всех стран - объединяйтесь ! :)-
Земли раздельные как в даташите.
Сегодня попробую объеденить земли и проверить еще раз.
Мне еще кажется микросхема шумит сильно после нее появляется сильный фон.
В частности прошу помощи в отпровляемых битах на микросхему. Этот кусок кода бал взят из за бугорного форума и в самих битах есть сомнение.
Ребят помогите не отправляются у меня команды на микруху и как правильно указать команду?
в даташите есть таблица.
по таблице установить 0db 10010000, установить -70db 10010111
Шаг регулировки where: Ax=-1dB/step, Bx=-10dB/step
пробую так Wire.write(Bx10010000) arduino выдает ошибку, а на забугорном форуме отправляют Wire.write(0b10010000); но ни чего не прокатывает.
Ауууу тут знающие люди есть ? Или только школьники отправляющие в GOOGL!
UP!
Ауууу тут знающие люди есть ? Или только школьники отправляющие в GOOGL!
только школьники. на другое не надейся)))
Спасибо вам гугло-посылатили. Разобрался с помощъю китайского форума.
/* Пины, к которым подключен энкодер */ #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.
Юзайте на здоровье/
ну вот. сам разобрался))
В куске кода для 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. Другие комбинации не пробовал, возможно, они тоже не совпадают.
Собрал регулятор громкости pt2258. Сильный шум перепаивал неоднократно конденсаторы впаивал резисторы, всё бестолку. Это не может быть в коде?
Когда добавляешь громкость шум уменьшается.
Когда уменьшаешь громкость шум увеличивается.
pt2258 китайская, наерна. Перемаркированый генератор белого шума.