Модуль силовых ключей, 4 N-канала с измерением тока.
Техническое описание: Данная страница содержит подробное техническое описание модуля силовых ключей на 4 N-канала с измерением тока, I2C, Flash и раскрывает работу с модулем через его регистры.
Ознакомиться с пользовательским описанием модуля и примерами работы с библиотекой iarduino_I2C_Relay можно на странице Wiki - Модуль силовых ключей на 4 N-канала с измерением тока, I2C, Flash.
Назначение:
Модуль силовых ключей на 4 N-канала с измерением тока, I2C, Flash - является устройством коммутации, которое позволяет подключать и отключать питание от входа «Vin» (до 24В) к любому из 4 выходов модуля «K1», «K2», «K3», «K4». При этом устройства подключённые к выходам модуля, не должны потреблять более 2А постоянного тока (на каждый канал).
Модуль позволяет не только подавать питание «Vin» на свои выходы, но и устанавливать на них сигнал ШИМ с амплитудой питания «Vin». Частота и коэффициент заполнения задаются программно, значит модуль может не только включать и выключать устройства, но и управлять скоростью вращения моторов, яркостью свечения ламп, светодиодов и т.д. Так же модуль позволяет узнать ток потребляемый устройствами на каждом выходе модуля.
Модуль способен автоматически отключать нагрузку при превышении заданного тока, или ограничивать потребление тока на указанном уровне.
Управление модулем осуществляется по шине I2C. К одной шине I2C можно подключить более 100 модулей. Адрес модуля на шине I2C (по умолчанию 0x09) назначается программно и хранится в его энергонезависимой памяти.
Модуль можно использовать в любых проектах где требуется управлять устройствами с напряжением питания до 24В и потреблением постоянного тока до 2А.
Описание:
Модуль построен на базе микроконтроллера STM32F030F4 и снабжен собственным стабилизатором напряжения. У модуля имеются 4 выхода «K1», «K2», «K3», «K4» которые подключены к входу питания «Vin» через полевые N-канальные MOSFET транзисторы. Закрытие транзисторов приводит к разрыву цепи «GND» между входом «Vin» и выходом модуля.
О состоянии транзисторов можно судить по светодиодам расположенным рядом с разъёмами выходов модуля. Если светодиод светится, значит соответствующий транзистор открыт и питание «Vin» поступает на соответствующий выход модуля.
Последовательно с транзисторами, установлены шунтирующие резисторы номиналом 50 мОм на которых падает напряжение пропорционально силе тока потребляемого нагрузкой на выходе. Напряжение с резисторов поступает на входы АЦП микроконтроллера, который рассчитывает силу тока проходящего через каждый выход модуля.
Управление выходами модуля, запись и чтение значений, осуществляется через регистры модуля. Доступ к регистрам модуля осуществляется по шине I2C.
С помощью регистров модуля можно:
- Изменить адрес данного модуля, временно (пока есть питание) или постоянно.
- Изменить частоту ШИМ от 1 до 12'000 Гц (по умолчанию 490 Гц).
- Изменить номинал шунтирующих резисторов (скорректировать расчёт силы тока).
- Разрешить / запретить автоотключение любого выхода при превышении силы тока.
- Разрешить / запретить ограничение силы тока на любом выходе до заданного значения.
- Задать максимальную силу тока для каждого выхода (для автоотключения и ограничения).
- Установить / отключить питание «Vin» на любом из выходов.
- Установить сигнал ШИМ на любом из выходов (12 бит).
- Прочитать аналоговый уровень (12 бит АЦП) падения напряжения на шунтирующем резисторе любого выхода, для самостоятельного расчёта силы тока.
- Прочитать силу тока на любом выходе (в мА) рассчитанную микроконтроллером.
Выводы модуля:
В левой части платы расположены два разъема для подключения модуля к шине I2C. Шина подключается к любому разъему I2C, а второй разъем можно использовать для подключения следующего модуля силовых ключей, или других устройств.
- SCL - вход/выход линии тактирования шины I2C.
- SDA - вход/выход линии данных шины I2C.
- Vcc - вход питания модуля 5В.
- GND - общий вывод питания.
По центру платы, сверху и снизу, расположены разъемы Vin, для подключения питания коммутируемого на выходы модуля. Напряжение питания до 24 В постоянного тока, подаётся на любой разъём Vin, а второй разъем можно использовать для подачи питания на следующий модуль силовых ключей. Дорожки печатной платы, соединяющие разъемы Vin, не изолированы паяльной маской, что позволяет нанести на них слой припоя, это уменьшит потери при работе с несколькими модулями силовых ключей.
- Vin - вход питания (до 24В) коммутируемого на выходы модуля.
- Вывод «-Vin» разъема Vin и вывод GND разъема I2C электрически соединены на плате модуля.
В правой части платы расположены четыре разъема: K1, K2, K3, K4, это выходы на которые коммутируется напряжение со входа Vin. К выходам модуля подключаются устройства которыми Вы желаете управлять. Устройства не должны потреблять более 2А (на каждый выход).
- K1 - выход №1 для подключения устройства с током потребления до 2А.
- K2 - выход №2 для подключения устройства с током потребления до 2А.
- K3 - выход №3 для подключения устройства с током потребления до 2А.
- K4 - выход №4 для подключения устройства с током потребления до 2А.
Характеристики:
- Напряжение питания: 5 В (постоянного тока)
- Потребляемый ток: до 15 мА.
- Коммутируемое напряжение: до 24 В.
- Коммутируемые токи: до 2А (на каждый выход модуля).
- Разрешение АЦП: 12 бит (значение от 0 до 4095).
- Разрешение ШИМ: 12 бит (значение от 0 до 4095).
- Частота ШИМ: 1 - 12'000 Гц (по умолчанию 490 Гц).
- Шаг измерения токов: 10 мА.
- Ограничение тока на заданном уровне: есть.
- Отключение нагрузки при превышении указанного тока: есть.
- Количество выходов: 4 (все выходы поддерживают ШИМ).
- Интерфейс: I2C.
- Скорость шины I2C: 100 кбит/с.
- Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
- Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
- Рабочая температура: от -40 до +65 °C.
- Габариты с креплением: 55 х 55 мм.
- Габариты без креплений: 55 х 45 мм.
- Вес: 20 г.
Установка адреса:
Модуль силовых ключей на 4 N-канала с измерением тока, I2C, Flash относится к линейке «Flash» модулей. Все модули данной линейки позволяют назначать себе адрес для шины I2C, как временно (новый адрес действует пока есть питание), так и постоянно (новый адрес сохраняется в энергонезависимую память и действует даже после отключения питания). По умолчанию все модули линейки «Flash» поставляются с адресом 0x09.
Установка адреса (без сохранения):
Если в регистр 0x06 «ADDRESS» записать значение из 7 бит адреса и младшим битом «SAVE_FLASH» равным 0, то указанный адрес станет адресом модуля на шине I2C, но он не сохранится во FLASH памяти, а значит после отключения питания или перезагрузки, установится прежний адрес модуля.
Установка адреса может быть заблокирована, если в регистре 0x01 «BITS_0» установлен бит «BLOCK_ADR». Этот бит по умолчанию сброшен, но он самостоятельно устанавливается при попытке записи данных в регистры предназначенные только для чтения. Бит «BLOCK_ADR» используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».
Установка адреса (с сохранением):
Для установки адреса с его сохранением в FLASH память модуля необходимо выполнить два действия:
- Установить бит «SAVE_ADR_EN» в регистре 0x01 «BITS_0» (при этом адрес модуля останется прежним).
- Записать в регистр 0x06 «ADDRESS» значение из 7 бит адреса и младшим битом «SAVE_FLASH» равным 1.
Если не выполнить первое действие (не установить бит «SAVE_ADR_EN»), то новый адрес будет проигнорирован и у модуля останется старый адрес. Бит «SAVE_ADR_EN» самостоятельно сбрасывается после сохранения адреса во FLASH память, а так же при обращении к любому регистру модуля (кроме записи в 0x01 «BITS_0» и 0x06 «ADDRESS»).
Установка адреса может быть заблокирована, если в регистре 0x01 «BITS_0» установлен бит «BLOCK_ADR». Этот бит по умолчанию сброшен, но он самостоятельно устанавливается при попытке записи данных в регистры предназначенные только для чтения. Бит «BLOCK_ADR» используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».
ВАЖНО: запись адреса занимает не менее 30 мс.
Регистры:
Карта регистров модуля:
Регистры с адресами 0x02, 0x03, 0x0F зарезервированы, их биты сброшены. Попытка записи данных в эти регистры будет проигнорирована модулем.
Регистр 0x00 «FLAGS_0» - содержит флаги чтения состояния модуля:
Регистр только для чтения.
- FLG_RESET - Флаг указывает на факт выполнения успешной перезагрузки модуля. Флаг самостоятельно сбрасывается после чтения регистра 0x00 «FLAGS_0».
- FLG_SELF_TEST - Флаг указывает на результат выполнения самотестирования модуля (0-провал, 1-успех). Не поддерживается данным модулем.
- FLG_GET_NAME - Если флаг установлен, значит модуль поддерживает вывод своего названия установкой бита «SET_GET_NAME» в регистре 0x01 «BITS_0».
- RAND_ADR - Если флаг установлен, значит модуль поддерживает генерацию случайного адреса для шины I2C регистрами 0x64 «RANDOM_NUM», «RANDOM_ADR», «BUN_ADR».
- FLG_I2C_UP - Если флаг установлен, значит модуль позволяет управлять подтяжкой линий шины I2C при помощи бита «SET_I2C_UP» регистра 0x01 «BITS_0».
Регистр 0x01 «BITS_0» - содержит биты установки состояния модуля:
Регистр для записи и чтения.
- SET_RESET - Бит запускает программную перезагрузку модуля. О завершении перезагрузки свидетельствует установка флага «FLG_RESET» регистра 0x00 «FLAGS_0».
- SET_SELF_TEST - Бит запускает самотестирование модуля. При успешном завершении самотестирования устанавливается флаг «FLG_SELF_TEST » регистра 0x00 «FLAGS_0». Не поддерживается данным модулем.
- SET_GET_NAME - Бит указывает использовать регистр 0x04 «MODEL» для посимвольного вывода названия модуля. Бит сбрасывается автоматически через 300 мс после его установки. Если флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» сброшен, значит модуль не поддерживает посимвольный вывод своего названия.
- BLOCK_ADR - Бит блокирует смену и сохранение адреса для шины I2C. Бит устанавливается автоматически при попытке записи данных в регистры предназначенные только для чтения. Это защищает чип от ненамеренной смены адреса шумами на шине I2C, бит используется в модулях версии 5 и выше. Версия модуля хранится в регистре 0x05 «VERSION».
- SET_I2C_UP - Бит управляет внутрисхемной подтяжкой линий шины I2C. Значение бита сохраняется в FLASH память модуля. Установка бита в «1» приведёт к подтяжке линий SDA и SCL до уровня 3,3 В. На линии I2C допускается устанавливать внешние подтягивающие резисторы и иные модули с подтяжкой до уровня 3,3 В или 5 В, вне зависимости от состояния текущего бита. Если флаг «FLG_I2C_UP» регистра 0x00 «FLAGS_0» сброшен, значит управление подтяжкой не поддерживается модулем.
- SAVE_ADR_EN - Бит разрешает записать новый адрес модуля для шины I2C в FLASH память. Бит самостоятельно сбрасывается после сохранения адреса во FLASH память. запись адреса выполняется следующим образом: нужно установить бит «SAVE_ADR_EN», после чего записать новый адрес в регистр 0x06 «ADDRESS» с установленным битом «SAVE_FLASH».
Регистр 0x04 «MODEL» - содержит идентификатор типа модуля:
Регистр только для чтения.
- MODEL[7-0] - Для модуля силовых ключей на 4 N-канала с измерением тока - идентификатор равен 0x0C.
- Если установлен флаг «FLG_GET_NAME» регистра 0x00 «FLAGS_0» значит модуль поддерживает посимвольный вывод своего названия.
- Установка бита «SET_GET_NAME» регистра 0x01 «BITS_0» включает режим посимвольного вывода названия модуля. При этом в регистре 0x04 «MODEL» появится первый символ названия модуля. В процессе чтения регистра 0x04 «MODEL» он будет возвращать очередной символ названия, вплоть до символа конца строки имеющего код 0x00. Далее цикл повторится.
- Сброс бита «SET_GET_NAME» регистра 0x01 «BITS_0» отключает режим посимвольного вывода названия модуля. Регистр 0x04 «MODEL» вновь будет содержать идентификатор.
Регистр 0x05 «VERSION» - содержит версию прошивки модуля:
Регистр только для чтения.
- VERSION[7-0] - Версия прошивки (от 0x01 до 0xFF).
Регистр 0x06 «ADDRESS» - отвечает за чтение/установку адреса модуля на шине I2C:
Регистр для чтения и записи.
- ADDRESS[6-0] - 7 бит адреса модуля на шине I2C. При чтении возвращается текущий адрес модуля, при записи устанавливается указанный адрес модулю.
- SAVE_FLASH - Флаг записи адреса в FLASH память модуля.
Флаг имеет значение только при записи данных в регистр.
Если флаг сброшен, то адрес в битах ADDRESS[6-0] будет установлен временно (до отключения питания, или сброса/записи нового адреса). Если флаг установлен, то адрес в битах ADDRESS[6-0] будет сохранён в FLASH память модуля (останется и после отключения питания), но только если в бите «SAVE_ADR_EN» регистра 0x01 «BITS_0» установлена логическая 1. Если флаг «SAVE_FLASH» установлен, а бит «SAVE_ADR_EN» сброшен, то адрес в битах ADDRESS[6-0] не будет установлен ни временно, ни постоянно.
Регистр 0x07 «CHIP_ID» - содержит идентификатор общий для всей линейки «Flash» модулей:
Регистр только для чтения.
У всех модулей линейки «Flash» в регистре «CHIP_ID» содержится значение 0x3C. Если требуется отличить модули линейки «Flash» на шине I2C от сторонних модулей, то достаточно прочитать значение регистров 0x06 «ADDRESS» и 0x07 «CHIP_ID» всех модулей на шине I2C. Если 7 старших битов регистра 0x06 «ADDRESS» хранят адрес совпадающий с адресом модуля, а в регистре 0x07 «CHIP_ID» хранится значение 0x3C, то можно с большой долей вероятности утверждать, что данный модуль является модулем линейки «Flash».
Регистры 0x08-0x09 «FREQUENCY» - содержат частоту ШИМ:
Регистр только для записи.
- FREQUENCY[15-0] - Частота ШИМ в диапазоне от 1 до 12'000 Гц. Значение по умолчанию 0x01EA = 490 Гц. Частота записанная в регистры «FREQUENCY[15-8]», «FREQUENCY[7-0]» применяется после записи старшего байта «FREQUENCY[15-8]».
Если записать значение < 0x0001 то в регистрах появится 0x0001 и частота будет 1 Гц.
Если записать значение > 0x2EE0 то в регистрах появится 0x2EE0 и частота будет 12 кГц.
Регистр 0x0A «AVERAGING» - содержит коэффициент усреднения показаний АЦП:
Регистр только для записи.
- AVERAGING[7-0] - Значение от 0 до 255 определяющее усреднение (сглаживание данных) АЦП. Значение регистра по умолчанию 0x0F = 16%.
Чем выше значение данного регистра, тем плавнее будут меняться показания регистров 0x1C-0x23 «ADC-1...4» (АЦП) и 0x24-0x2B «CURRENT-1...4» (ток в мА), что значительно снижает уровень шума АЦП. Значение 0 означает что усреднение АЦП отключено.
ПРИМЕЧАНИЕ: От скорости изменения показаний тока в регистрах 0x24-0x2B зависит время срабатывания функций ограничения тока и отключения нагрузки при превышении тока.
Регистр 0x0B «SHUNT-1» - содержит сопротивление Rш 1 выхода:
Регистр 0x0C «SHUNT-2» - содержит сопротивление Rш 2 выхода:
Регистр 0x0D «SHUNT-3» - содержит сопротивление Rш 3 выхода:
Регистр 0x0E «SHUNT-4» - содержит сопротивление Rш 4 выхода:
Регистры только для записи.
- SHUNT[7-0] - Регистры хранят значения сопротивлений шунтирующих резисторов в мОм, от 1 до 255 (по умолчанию 50 мОм), для каждого выхода. Данное значение влияет на результаты расчётов силы тока в регистрах 0x24-0x2B «CURRENT-1...4».
Микроконтроллер рассчитывает силу тока по формуле I = (ADC * 3,3 В) / (Rш * 4095).
Если рассчитанная сила тока в одном из регистров 0x24-0x2B «CURRENT-1...4» превышает реально измеренную, то нужно увеличить значение соответствующего регистра 0x0B-0x0E «SHUNT-1...4» и наоборот.
ПРИМЕЧАНИЕ: Значения регистров 0x0B-0x0E «SHUNT-1...4» хранятся в FLASH памяти модуля. Значит записанные в них значения сохранятся и после отключения питания.
Регистр 0x10 «FLG» - содержит флаги контроля защиты по току:
Регистр для чтения и записи.
- FLG_MAX-1...4 - Флаги сигнализируют о том, что на соответствующем выходе выполняется функция ограничения тока, включённая битами «SET_MAX-1...4» регистра 0x11 «SET».
Флаги сбрасываются самостоятельно при падении тока ниже порога ограничения. - FLG_OFF-1...4 - Флаги сигнализируют о том, что соответствующий выход был отключён из-за превышения допустимого тока, при установленном бите «SET_OFF-1...4» регистра 0x11 «SET».
Сброс флагов осуществляется записью логической «1».
Регистр 0x11 «SET» - содержит биты установки защиты по току:
Регистр для чтения и записи.
- SET_MAX-1...4 - Установка битов включает функцию ограничения тока на соответствующем выходе до уровня указанного в регистре 0x2C-0x2F «LIMIT-1...4». Если ограничение тока разрешено и ток на выходе превышает указанное значение, то устанавливается флаг «FLG_MAX-1...4» регистра 0x10 «FLG», при этом на выходе формируется сигнал ШИМ коэффициент заполнения которого контролируется на таком уровне, что бы ток на выходе не превышал значение заданное в регистре 0x2C-0x2F «LIMIT-1...4».
- SET_OFF-1...4 - Установка битов включает функцию отключения нагрузки при повышении тока выше уровня указанного в регистре 0x2C-0x2F «LIMIT-1...4». Если функция отключения нагрузки разрешена и ток на выходе превышает указанное значение, то выход отключается и устанавливается флаг «FLG_OFF-1...4» регистра 0x10 «FLG». Для восстановления работоспособности выхода, необходимо сбросить флаг «FLG_OFF-1...4» регистра 0x10 «FLG».
- ПРИМЕЧАНИЕ: Скорость срабатывания функций ограничения тока и отключения нагрузки при повышении тока, зависит от коэффициента усреднения показаний АЦП указанного в регистре 0x0A «AVERAGING», чем выше коэффициент усреднения, тем медленнее работают функции.
Регистр 0x12 «DIGITAL_ALL» - содержит биты управления выходами:
Регистр для чтения и записи.
- DIGITAL-1...4 - Биты определяют состояния выходов: «0» - выключен, «1» - включён.
Пример: DIGITAL_ALL = (XXXX0011)2 => выходы 1 и 2 - включены, выходы 3 и 4 - выключены.
Таким образом, можно управлять всеми выходами записав всего один байт в данный регистр.
Регистр 0x13 «DIGITAL_ONE» - содержит биты управления выходами:
Регистр для чтения и записи.
- WRITE_H-1...4 - Установка данных битов приводит к установке соответствующих битов «DIGITAL-1...4» регистра 0x12 «DIGITAL_ALL» и, как следствие, включению соответствующих выходов.
Биты сбрасываются самостоятельно. - WRITE_L-1...4 - Установка данных битов приводит к сбросу соответствующих битов «DIGITAL-1...4» регистра 0x12 «DIGITAL_ALL» и, как следствие, отключению соответствующих выходов.
Биты сбрасываются самостоятельно. - Данный регистр, в отличии от регистра 0x12 «DIGITAL_ALL», удобно использовать когда требуется изменить состояние не всех выводов.
Регистры 0x14-0x15 «PWM-1» - устанавливают ШИМ на 1 выходе:
Регистры 0x16-0x17 «PWM-2» - устанавливают ШИМ на 2 выходе:
Регистры 0x18-0x19 «PWM-3» - устанавливают ШИМ на 3 выходе:
Регистры 0x1A-0x1B «PWM-4» - устанавливают ШИМ на 4 выходе:
Регистры для чтения и записи.
- PWM-1...4 [11-0] - Целое 12-битное значение от 0 (0x0000) до 4095 (0x0FFF) определяющее коэффициент заполнения ШИМ на соответствующем выходе K% = «PWM-X» * 100% / 4095.
- Данные регистры, в отличии от регистров 0x12 «DIGITAL_ALL» и 0x13 «DIGITAL_ONE», позволяют не просто включать или выключать выходы, а включать их на определённый уровень. Это позволяет управлять скоростью вращения моторов, яркостью свечения ламп, светодиодов и т.д.
Регистры 0x1C-0x1D «ADC-1» - позволяют считать напряжение на Rш1:
Регистры 0x1E-0x1F «ADC-2» - позволяют считать напряжение на Rш2:
Регистры 0x20-0x21 «ADC-3» - позволяют считать напряжение на Rш3:
Регистры 0x22-0x23 «ADC-4» - позволяют считать напряжение на Rш4:
Регистры только для чтения.
- ADC-1...4 [11-0] - Целое 12-битное значение от 0 (0x0000) до 4095 (0x0FFF) пропорциональное падению напряжения на шунтирующем сопротивлении (50 мОм) включённом последовательно с нагрузкой соответствующего выхода.
- При протекании тока через нагрузку (IН), подключённую к выходу модуля, на резисторе (RШ) падает часть напряжения (URШ), которое можно рассчитать: URШ = «ADC-X» * 3,3 / 4095.
Зная падение напряжения на шунтирующем резисторе (URШ) и его сопротивление (RШ), можно рассчитать ток проходящий через него: IRШ = URШ / RШ = URШ / 0,05.
Так как шунтирующий резистор (RШ) подключён последовательно с нагрузкой (RН) то их токи равны (IRШ = IН), следовательно, по показаниям регистров 0x1C-0x23 «ADC-1...4» можно рассчитать токи проходящие через выходы модуля.
ПРИМЕЧАНИЕ: В регистрах 0x24 - 0x2B «CURRENT-1...4» уже хранятся рассчитанные значения токов каждого выхода в мА.
Регистры 0x24-0x25 «CURRENT-1» - хранят значение тока 1 выхода:
Регистры 0x26-0x27 «CURRENT-2» - хранят значение тока 2 выхода:
Регистры 0x28-0x29 «CURRENT-3» - хранят значение тока 3 выхода:
Регистры 0x2A-0x2B «CURRENT-4» - хранят значение тока 4 выхода:
Регистры только для чтения.
- CURRENT-1...4 [15-0] - Целое 16-битное значение от 0 (0x0000) до 4095 (0xFFFF) определяющее силу тока (в мА) протекающего через соответствующий выход модуля.
- Микроконтроллер рассчитывает силу тока по формуле I = (ADC * 3,3 В) / (Rш * 4095).
Реальное сопротивление RШ может отличаться от 50 мОм в пределах заводского допуска, что влияет на точность измерений тока.
Если рассчитанная сила тока превышает реально измеренную на выходе модуля, то нужно увеличить значение RШ хранящееся в соответствующем регистре 0x0B-0x0E «SHUNT-1...4».
Если рассчитанная сила тока ниже реально измеренной на выходе модуля, то нужно уменьшить значение RШ хранящееся в соответствующем регистре 0x0B-0x0E «SHUNT-1...4».
Регистр 0x2C «LIMIT-1» - задаёт максимальный ток для 1 выхода:
Регистр 0x2D «LIMIT-2» - задаёт максимальный ток для 2 выхода:
Регистр 0x2E «LIMIT-3» - задаёт максимальный ток для 3 выхода:
Регистр 0x2F «LIMIT-4» - задаёт максимальный ток для 4 выхода:
Регистры для чтения и записи.
- LIMIT-1...4 [7-0] - Целое значение от 0 до 255 соответствующее максимальному току в десятых долях Ампер (от 00,0 до 25.5 А) для соответствующего выхода модуля.
Указанные значения используются для работы функций ограничения тока выхода и отключения выхода при превышении заданного максимального тока. - Функция ограничения тока формирует на выходе сигнал ШИМ коэффициент заполнения которого препятствует повышению тока выше заданного в регистре «LIMIT-X».
Разрешить работу функции можно установив бит «SET_MAX-1...4» регистра 0x11 «SET». - Функция отключения нагрузки при повышении тока на выходе выше заданного в регистре «LIMIT-X», позволяет защитить подключённые к выходу устройства.
Разрешить работу функции можно установив бит «SET_OFF-1...4» регистра 0x11 «SET».
Регистр 0x30 «WDT» - содержит время сторожевого таймера:
Регистр для чтения и записи.
Сторожевой таймер предназначен для безопасности Вашего устройства.
- WDT[7-0] - Значение от 0 до 254 указывает время (в сек.) оставшееся до перезагрузки модуля.
Значение 255 (по умолчанию) означает, что сторожевой таймер отключён (не считает).
Если записать число от 1 до 254, то каждую секунду, значение регистра будет уменьшаться на единицу, пока не достигнет 0. По достижении 0, модуль перезагрузится и все каналы, а так же таймер, будут отключены.
ПРИМЕЧАНИЕ: Если сторожевой таймер досчитает до 0, то модуль перезагрузится и данные всех его регистров сбросятся в значения по умолчанию, по умолчанию нагрузки отключены.
ПРИМЕР: Управляющее устройство (например, Arduino) постоянно (в цикле loop) отправляет в регистр «WDT» значение 10. Как только Arduino перестанет работать (отключится, зависнет), значение регистра «WDT» начнёт уменьшаться и через 10 секунд, нагрузки подключённые к модулю будут отключены.
Регистры 100+:
У младших версий модулей линейки «FLASH-I2C» нет блока регистров «100+», так же этого блока нет у модулей линейки «Metro», о его наличии свидетельствует установленный флаг «RAND_ADR» в регистре 0x00 «FLAGS_0».
Блок регистров «100+» с адресами от 0x64 (100)10 до 0x75 (117)10 не участвует в работе модуля, он предназначен только для обнаружения модулей с одинаковыми адресами и назначения этим модулям разных адресов, не отключая их от шины I2C.
Карта регистров 100+:
Регистры 0x64-0x65 «RANDOM_NUM» - содержат случайное число:
Регистры только для чтения.
- RANDOM_NUM[15-0] - Содержит двухбайтное случайное число позволяющее определить наличие нескольких устройств с одинаковым адресом.
- Значение из регистров читается одним пакетом (младший и старший байт). После чтения старшего байта, модуль на 5мс перейдёт в режим «молчания». В этом режиме модуль будет отправлять NACK мастеру после получения номера регистра в любых запросах.
- Если прочитать регистры 0x64-0x65 «RANDOM_NUM» дважды, с промежутком между чтениями менее 5мс, то первый раз мы получим два байта случайного числа, а второй раз модуль откажет в чтении, так как отправит NACK. Но это только в том случае, если адрес модуля уникален.
- Если адрес принадлежит нескольким устройствам, то и отвечать на запрос чтения будут несколько устройств. При первом чтении регистров 0x64-0x65 «RANDOM_NUM», биты случайного числа у разных модулей не совпадут, в результате чего один модуль передаст оба байта случайного числа и перейдёт в режим «молчания», а другой модуль (или модули) зафиксирует потерю арбитража и не передаст старший байт, следовательно, и не перейдёт в режим «молчания». Значит при повторном чтении регистров, мы опять получим два байта случайного числа от того модуля который не перешёл в режим «молчания», что будет свидетельствовать о наличии нескольких устройств на одном адресе.
Регистр 0x66 «RANDOM_ADR» - случайный адрес:
Регистр для чтения и записи.
- RANDOM_ADR[7-0] - Позволяет задавать модулю случайный временный адрес, подтверждать временный адрес и получать информацию о состоянии временного адреса.
- Запись 0x0F - Назначить модулю случайный временный адрес на 50 мс.
В регистре 0x06 «ADDRESS» останется значение постоянного адреса. - Запись 0xF0 - Подтвердить назначенный временный адрес до отключения питания.
В регистре 0x06 «ADDRESS» появится назначенный временный адрес. - Чтение 0x55 - Назначен временный случайный адрес на 50 мс.
- Чтение 0xFF - Назначенный временный адрес подтверждён до отключения питания.
- Чтение 0x00 - Временный адрес не назначался или отменён по истечении 50 мс.
- Если на шине несколько устройств имеют одинаковый адрес, то запись значения 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. За указанное время следует найти все новые временные адреса устройств и подтвердить их отправив в регистр 0x66 «RANDOM_ADR» значение 0xF0.
- Примечание: Случайный адрес модуль выбирает сам из диапазона от 0x08 до 0x7E включительно, кроме адресов запрещённых регистрами 0x67-0x75 «BUN_ADR».
Регистры 0x67-0x75 «BUN_ADR» - запрещают назначать адреса:
Регистры для чтения и записи.
- BUN_ADR_08 - Бит запрещает назначать адрес 0x08 регистром 0x66 «RANDOM_ADR».
- BUN_ADR_09 - Бит запрещает назначать адрес 0x09 регистром 0x66 «RANDOM_ADR».
- ...
- BUN_ADR_7D - Бит запрещает назначать адрес 0x7D регистром 0x66 «RANDOM_ADR».
- BUN_ADR_7E - Бит запрещает назначать адрес 0x7E регистром 0x66 «RANDOM_ADR».
- Если бит регистров 0x67-0x75 «BUN_ADR» установлен, то модуль не назначит себе случайный временный адрес соответствующий установленному биту.
- Если на шине есть несколько устройств с одинаковым адресом, то отправка команды 0x0F в регистр 0x66 «RANDOM_ADR» этих устройств, приведёт к тому, что каждый модуль сам себе назначит временный случайный адрес на 50 мс. Но вновь назначенный адрес может совпасть с адресом другого модуля на шине I2C, особенно если их много. По этому перед назначением случайного временного адреса рекомендуется записать в регистры 0x67-0x75 «BUN_ADR» все найденные на шине I2C уникальные адреса.
Доступ к данным регистров:
Каждый регистр модуля хранит 1 байт данных. Так как модуль использует интерфейс передачи данных I2C, то и доступ к данным охарактеризован им.
Обмен данными по шине I2C происходит по одному биту за один такт, после каждых переданных 8 бит (1 байта) принимающее устройство отвечает передающему одним битом: «ACK» в случае успешного приёма, или «NACK» в случае ошибки. Пакет приёма/передачи данных начинается сигналом «START» и завершается сигналом «STOP». Первый байт пакета всегда состоит из 7 бит адреса устройства и одного (младшего) бита R/W.
Сигналы интерфейса передачи данных I2C:
- Для удобства восприятия сигналов они выполнены в следующих цветах:
- Зелёный - сигналы формируемые мастером.
- Красный - данные отправляемые мастером.
- Синий - данные отправляемые модулем.
- Фиолетовый - данные отправляемые мастером или модулем.
- «START» - отправляется мастером в начале пакета приема/передачи данных. Сигнал представляет переход уровня линии «SDA» из «1» в «0» при наличии «1» на линии «SCL».
- «STOP» - отправляется мастером в конце пакета приёма/передачи данных. Сигнал представляет переход уровня линии «SDA» из «0» в «1» при наличии «1» на линии «SCL».
- БИТ - значение бита считывается с линии «SDA» по фронту импульса на линии «SCL».
- «ACK» - бит равный 0, отправляется после успешного приёма байта данных.
- «NACK» - бит равный 1, отправляется после байта данных в случае ошибки.
- ПЕРВЫЙ БАЙТ - отправляется мастером, состоит из 7 бит адреса и бита «RW».
- «R/W» - младший бит первого байта данных указывает направление передачи данных пакета, 1 - прием (от модуля к мастеру), 0 - передача (от мастера в модуль).
- «RESTART» - повторный старт, отправляется мастером внутри пакета. Сигнал представляет из себя «START» отправленный не на свободной шине, а внутри пакета.
ВАЖНО: Все изменения на линии «SDA» должны происходить только при наличии «0» на линии «SCL» за исключением сигналов «START», «STOP» и «RESTART».
Запись данных в регистры:
- Отправляем сигнал «START».
- Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем второй байт: адрес регистра в который будет произведена запись.
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем третий байт: данные для записи в регистр.
Получаем ответ от модуля в виде одного бита «ACK». - Далее можно отправить четвёртый байт данных для записи в следующий по порядку регистр и т.д.
- Отправляем сигнал «STOP».
Пример записи в один регистр:
Запись значения 0x2A в регистр 0x06 модуля с адресом 0x09:
// Запись в регистр методами библиотеки Wire.h Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x06); // Записываем в буфер байт адреса регистра. Wire.write(0x26); // Записываем в буфер байт который будет записан в регистр. Wire.endTransmission(); // Выполняем передачу адреса и байтов из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
Пример записи в несколько регистров подряд:
Запись в модуль с адресом 0x09 нескольких значений начиная с регистра 0x12:
В регистр 0x12 запишется значение 0x0F, в следующий по порядку регистр (0x13) запишется значение 0x30 и в следующий по порядку регистр (0x14) запишется значение 0xB1.
// Запись в регистры методами библиотеки Wire.h byte data[3] = {0x0F,0x30,0xB1}; // Определяем массив с данными для передачи. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x12); // Записываем в буфер байт адреса первого регистра. Wire.write(data, 3); // Записываем в буфер 3 байта из массива data. Wire.endTransmission(); // Выполняем передачу адреса и байт из буфера. Функция возвращает: 0-передача успешна / 1 - переполнен буфер для передачи / 2 - получен NACK при передаче адреса / 3 - получен NACK при передаче данных / 4 - другая ошибка.
Чтение данных из регистров:
- При чтении пакет делится на 2 части: запись № регистра и чтение его данных.
- Отправляем сигнал «START».
- Отправляем первый байт: 7 бит адреса модуля и бит «R/W» равный 0 (запись).
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем второй байт: адрес регистра из которого нужно прочитать данные.
Получаем ответ от модуля в виде одного бита «ACK». - Отправляем сигнал «RESTART».
- Отправляем первый байт после «RESTART»: 7 бит адреса и бит «R/W» равный 1 (чтение).
Получаем ответ от модуля в виде одного бита «ACK». - Получаем байт данных из регистра модуля.
Отвечаем битом «ACK» если хотим прочитать следующий регистр, иначе отвечаем «NACK». - Отправляем сигнал «STOP».
Пример чтения одного регистра:
Чтение из модуля с адресом 0x09 байта данных регистра 0x05:
(в примере модуль вернул значение 0x01).
// Чтение регистра методами библиотеки Wire.h byte data; // Объявляем переменную для чтения байта данных. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x05); // Записываем в буфер байт адреса регистра. Wire.endTransmission(false); // Выполняем передачу без установки состояния STOP. Wire.requestFrom(0x09, 1); // Читаем 1 байт из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART. data=wire.read(); // Сохраняем прочитанный байт в переменную data.
Пример чтения нескольких регистров подряд:
Чтение из модуля с адресом 0x09 нескольких регистров начиная с регистра 0x05:
(в примере модуль вернул значения: 0x01 из рег. 0x05, 0x13 из рег. 0x06, 0xC3 из рег. 0x07).
// Чтение регистров методами библиотеки Wire.h byte data[3]; // Объявляем массив для чтения данных. Wire.beginTransmission(0x09); // Инициируем передачу данных в устройство с адресом 0x09. Wire.write(0x05); // Записываем в буфер байт адреса регистра. Wire.endTransmission(false); // Выполняем передачу без установки состояния STOP. Wire.requestFrom(0x09, 3); // Читаем 3 байта из устройства с адресом 0x09. Функция возвращает количество реально принятых байтов. Так как предыдущая функция не установила состояние STOP, то состояние START установленное данной функцией будет расценено как RESTART. int i=0; // Определяем счётчик номера прочитанного байта. while( Wire.available() ){ // Выполняем цикл while пока есть что читать из буфера. if(i<3){ // Лучше делать такую проверку, чтоб не записать данные за пределы массива data! data[i] = wire.read(); i++; // Читаем очередной байт из буфера в массив data. } // } //
Примечание:
- Если на линии I2C только один мастер, то сигнал «RESTART» можно заменить на сигналы «STOP» и «START».
- Рекомендуется не выполнять чтение или запись данных чаще 200 раз в секунду.
- Обратите внимание на сигналы «RESTART» и «STOP» в пакетах чтения данных:
- Между фронтом и спадом сигнала «RESTART» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 1.
- Между сигналом «NACK» и сигналом «STOP» проходит фронт импульса на линии «SCL», что расценивается как передача бита равного 0.
- Эти биты не сохраняются в модулях и не расцениваются как ошибки.
Модуль не поддерживает горячее подключение: Подключайте модуль только при отсутствии питания и данных на шине I2C. В противном случае потребуется отключить питание при уже подключённом модуле.
Пример включения и выключения 1 и 2 выхода модуля:
- В начале скетча определены константы с указанием адреса модуля и адреса регистра с помощью которого можно управлять одним выходом.
- В коде setup() была инициирована работа с шиной I2C.
- В коде loop с промежутками в 500 миллисекунд, в регистр «REG_DIGITAL_ONE» отправляется сначала байт данных со значением 0b00110000 (включение 1 и 2 выхода), а потом со значением 0b00000011 (выключение 1 и 2 выхода).
#include <Wire.h> // Подключаем библиотеку Wire для работы с шиной I2C. const int ADDRESS = 0x09; // Определяем адрес модуля. const int REG_DIGITAL_ONE = 0x13; // Определяем адрес регистра DIGITAL_ONE для управления выходами. // void setup(){ // Wire.setClock(100000L); // Устанавливаем скорость передачи данных по шине I2C. Wire.begin(); // Инициируем работу c шиной I2C в качестве мастера. delay(500); // } // // void loop(){ // // Включаем 1 выход модуля: // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(REG_DIGITAL_ONE); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра DIGITAL_ONE. Wire.write(0b00110000); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это число с двумя установленными битами. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. delay(500); // Добавляем задержку в пол секунды. // Выключаем 1 выход модуля: // Wire.beginTransmission(ADDRESS); // Инициируем передачу данных по шине I2C к устройству с адресом ADDRESS и битом RW=0 (запись). При этом сама передача не начнётся. Wire.write(REG_DIGITAL_ONE); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это номер регистра DIGITAL_ONE. Wire.write(0b00000011); // Функция write() помещает значение своего аргумента в буфер для передачи. В данном случае это число с двумя установленными битами. Wire.endTransmission(); // Выполняем инициированную ранее передачу данных. delay(500); // Добавляем задержку в пол секунды. } //
Обсуждение