Как инициализировать и запустить PCA9685?

Я пытаюсь написать простой код для инициализации и запуска PCA9685. Я протестировал плату с библиотекой Adafruit, и она работает.

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

Я написал код, но, кажется, не понимаю работу внутренних регистров.

Но согласно техпаспорту я настроил только автоинкремент, а остальные оставил по умолчанию. Затем я направился к последним регистрам, которые являются all_led_on и all_led_off, чтобы включить/выключить выходы, чтобы мигать светодиодами. Но я думаю, что эти два регистра предназначены для включения/отключения контактов. Верно?

Это мой код:

void pca9685_init(void){
    uint8_t i,val[]={0x20,0x04};
    i2c_start(PCA9685_BASE_WR);
    i2c_tx(PCA9685_MODE1);
    for(i=0;i<2;i++)i2c_tx(val[i]);
    i2c_stop();
}

void pca9685_all_on(void){
    uint8_t i,val[]={0x00,0x10};
    i2c_start(PCA9685_BASE_WR);
    i2c_tx(PCA9685_ALL_LED_ON_L);
    for(i=0;i<2;i++)i2c_tx(val[i]);
    i2c_stop();
}

void pca9685_all_off(void){
    uint8_t i,val[]={0x00,0x10};
    i2c_start(PCA9685_BASE_WR);
    i2c_tx(PCA9685_ALL_LED_OFF_L);
    for(i=0;i<2;i++)i2c_tx(val[i]);
    i2c_stop();
}

, 👍1

Обсуждение

Если хотите просто, то используйте библиотеку arduino Wire и перестаньте возиться с кодом i2c, который не работает. Потребовалось много лет, чтобы удалить ошибки из библиотеки проводов arduino. Шина i2c не так проста, поэтому вы никогда не сможете получить уровень качества библиотеки проводов Arduino. То, что вы делаете, это слишком усложняете и тратите свое время. Извините за мои резкие слова, я хочу четко дать понять, что вы не должны продолжать в том же духе. Ну, это, по крайней мере, мое мнение, пытающееся помочь вам., @Jot

Абсолютно я понимаю вас и уважаю вашу цель, что вы не хотите, чтобы я тратил время на настоящую коммуникационную библиотеку. Но моя библиотека i2c работала для всех моих модулей i2c и пересматривала разные библиотеки i2c, чтобы она была не идеальной, но хотя бы для запуска основных функций отправки и получения. Написание собственного кода очень помогло мне научиться писать код, мне сложно идти в проекты, не изучив внутренности. Но я согласен, что внутренняя библиотека, такая как Wire, должна быть очень хорошим выбором., @R1S8K

@PerchEagle Вам не следует бояться пробела. Я знаю, что он большой и внушительный, но не бойтесь нажимать его время от времени ;), @Majenko

Я тебя понял, код выглядит таким компактным, лол., @R1S8K

Я только что подумал о космическом аспекте, но у меня есть вопрос: в какие места следует поместить пространство? Мое самое важное место — когда я использую арифметические, логические или рациональные операторы. Но я не помещаю их в фигурные скобки или после имен функций. Кажется, он хорошо подходит, но, может быть, вы правы, он может быть более компактным, чем я чувствую., @R1S8K

@Jot Просто чтобы обновить то, что вы сказали мне о том, что сбои могут быть связаны с моей библиотекой I2C. Ты прав! В моей библиотеке I2C отсутствует что-то, что приводит к сбоям в работе программы!, @R1S8K


1 ответ


Лучший ответ:

3

Регистры предназначены не только для включения и выключения светодиодов. Они предназначены для установки времени включения и выключения ШИМ. Бит 12 каждого комбинированного значения используется как «полная» настройка, поэтому:

Чтобы включить светодиоды на полную яркость, необходимо установить:

  • PCA9685_ALL_LED_OFF_L в 0x00
  • PCA9685_ALL_LED_OFF_H в 0x00
  • PCA9685_ALL_LED_ON_L в 0x00
  • PCA9685_ALL_LED_ON_H в 0x10

Это устанавливает время выключения равным 0, а время включения — «полным включением».

На самом деле не имеет значения, какое значение вы установите для параметра OFF, если для параметра ON установлено значение "полное включение", а для параметра off не установлено значение "полное выключение".

Для выключения вы должны установить ON на 0, а OFF на «полное выключение» (обратите приведенные выше настройки).

Раздел 7.3.3 технического описания гласит:

Время включения каждого выхода драйвера светодиодов и рабочий цикл ШИМ можно контролировать независимо с помощью регистров LEDn_ON и LEDn_OFF.

На каждый светодиодный выход приходится два 12-битных регистра. Эти регистры будут запрограммированы пользователем. Оба регистра будут содержать значения от 0 до 4095. Один 12-битный регистр будет содержать значение для времени включения, а другой 12-битный регистр будет хранить значение для времени выключения. Время включения и выключения сравнивается со значением 12-битного счетчика, который будет запущен. непрерывно от 0000h до 0FFFh (от 0 до 4095 десятичных знаков).

Обновление по ACK требует, чтобы все 4 регистра канала PWM были загружены, прежде чем выходные данные изменятся при последнем ACK.

Время включения, которое можно запрограммировать, будет временем, в течение которого будет активен выход светодиода, а время выключения, которое также может быть запрограммировано, будет временем, когда выход светодиода будет активен. отрицается. Таким образом, фазовый сдвиг становится полностью программируемым. Разрешение фазового сдвига составляет 1⁄ 4096 целевой частоты.

Поэтому вам нужно установить все 4 регистра вместе, чтобы что-то произошло.

В таблице также есть несколько примеров, которые лучше объясняют это.

Проще говоря:

  • Существует автономный счетчик, который считает от 0 до 4095.
  • Когда время включения соответствует показаниям счетчика, загорается светодиод.
  • Когда время выключения совпадает с показаниями счетчика, светодиод гаснет.
  • Если для канала установлено значение "ПОЛНОСТЬЮ ВЫКЛЮЧЕН", он все равно будет выключен.
  • Если канал находится в состоянии "ПОЛНОЕ ВКЛЮЧЕНИЕ" и не в состоянии "ПОЛНОЕ ВЫКЛЮЧЕНИЕ", он будет включен в любом случае.
  • "ПОЛНОЕ ВЫКЛЮЧЕНИЕ" всегда имеет приоритет над всем остальным, даже "ПОЛНОЕ ВКЛЮЧЕНИЕ".

Несколько простых примеров:

  • Все выключено: ВКЛ=0x0000 ВЫКЛ=0x1000
  • Все включено: ON=0x1000 OFF=0x0000
  • Коэффициент загрузки 50 %: ВКЛ=0x0000 ВЫКЛ=0x0800
  • Нагрузка 25%: ВКЛ=0x0000 ВЫКЛ=0x0400
  • 25% рабочий цикл со сдвигом фазы: ON=0x0100 OFF=0x0500
,

Да, ты прав. Я сделал это, я должен обновить 4 регистра для состояния all_on, и снова все 4 регистра для состояния all_off., @R1S8K

@PerchEagle Таблица данных не так очевидна. Как вы можете видеть из истории редактирования моего ответа, мне потребовалось некоторое время, чтобы полностью его понять., @Majenko

Еще раз спасибо чувак за помощь, я очень признателен, ты не первый раз мне помогаешь, теперь я это понял, я могу перейти к pwm операциям и разработке библиотеки., @R1S8K

У меня быстрый вопрос, почему есть 12-бит для включения и 12-бит для выключения. Я написал разные значения только по времени и получил определенные результаты и разные результаты по нерабочему времени, а также получил разные результаты. Так в чем же дело именно с этим чипом? Полный диапазон этого устройства 4096 ВКЛ + 4096 ВЫКЛ = 8192., @R1S8K

Нет. Имеется один 12-битный счетчик. Он включается или выключается, когда счетчик соответствует значению включения или выключения. Таким образом, вы можете контролировать фазу, а также рабочий цикл., @Majenko

В любом случае, я не освоил этот модуль, мне нужно больше практики или просто знать, что означает время включения/выключения? они одинаковы? Должен ли я использовать один, и этого достаточно, или использование обоих имеет больше функциональности? Вот вопросы, которые у меня есть для этого модуля., @R1S8K