Перейти к содержанию

Сигнал готовности данных (data ready, DRDY)

Датчик измеряет со своей частотой, а микроконтроллер читает со своей. Если читать по таймеру, можно получить старый отсчёт или пропустить новый. Поэтому многие датчики и АЦП сообщают о новом результате отдельным сигналом готовности данных. Разбираем, как это сделано у MPU-6050 и HX711.

Обновлено Редакция GAW

Сигнал готовности данных (data ready, DRDY) — выход или флаг датчика, АЦП или другого устройства, который сообщает, что закончено новое измерение и результат можно читать. Обычно он подключается к входу внешнего прерывания микроконтроллера, и программа читает данные ровно тогда, когда они появились.

Зачем

Датчик выдаёт отсчёты со своей частотой выдачи данных от собственного генератора, а таймер микроконтроллера идёт от другого. При опросе по таймеру частоты расходятся: часть отсчётов читается дважды, часть пропускается. Сигнал готовности синхронизирует чтение с датчиком.

MPU-6050: прерывание DATA_RDY

У MPU-6050 прерывание готовности данных разрешается битом DATA_RDY_EN и возникает каждый раз, когда датчик записал новые значения во все регистры данных. Вывод INT настраивается регистром 55:

Бит01
INT_LEVELактивный высокийактивный низкий
INT_OPENдвухтактныйоткрытый сток
LATCH_INT_ENимпульс 50 мксуровень до сброса
INT_RD_CLEARсброс чтением INT_STATUSсброс любым чтением

Импульс 50 мкс удобен для прерывания по фронту, удержание уровня — для прерывания по уровню и опроса. Подробнее о датчике — на странице MPU-6050.

HX711: готовность через DOUT

У АЦП HX711 отдельного вывода нет: пока данные не готовы, DOUT в высоком уровне, а спад DOUT означает готовность. После этого микроконтроллер подаёт 25–27 импульсов на PD_SCK и читает 24 бита.

Как обрабатывать

  1. Прерывание по активному фронту или уровню — на линии EXTI или аналоге.
  2. В обработчике — только отметка о готовности; чтение по I²C или SPI — в основном цикле или через DMA.
  3. Сброс флага прерывания в датчике, иначе следующее событие не придёт.

Частые вопросы

Зачем нужен сигнал готовности данных, если можно читать по таймеру?

Таймер микроконтроллера и генератор датчика не синхронны. При чтении по таймеру иногда получишь тот же отсчёт дважды, иногда пропустишь новый, а при чтении в момент обновления — части разных измерений. Чтение по сигналу готовности синхронизирует программу с датчиком: каждый отсчёт читается ровно один раз.

Почему прерывание MPU-6050 срабатывает только один раз?

Вероятно, флаг прерывания не сбрасывается. По умолчанию флаги сбрасываются только чтением регистра INT_STATUS (58), и если программа читает лишь данные, вывод INT в режиме удержания уровня (LATCH_INT_EN = 1) так и останется активным. Решение — читать INT_STATUS или включить INT_RD_CLEAR, чтобы флаги сбрасывались любым чтением.

Как HX711 сообщает о готовности, если у него нет вывода прерывания?

Через вывод данных DOUT: пока результат не готов, он в высоком уровне, а когда преобразование закончено, опускается в низкий. Микроконтроллер ждёт спада DOUT — опросом или прерыванием по фронту — и затем выдвигает 25–27 тактами PD_SCK 24 бита результата.

Источники

  1. InvenSense. MPU-6000 and MPU-6050 Register Map and Descriptions, RM-MPU-6000A-00, Revision 4.2 — регистр 55 INT_PIN_CFG: INT_LEVEL — 0 активный высокий, 1 активный низкий; INT_OPEN — 0 двухтактный выход, 1 открытый сток; LATCH_INT_EN — 0 импульс 50 мкс, 1 уровень держится до сброса прерывания; INT_RD_CLEAR — 0 флаги сбрасываются только чтением INT_STATUS (регистр 58), 1 — любым чтением; регистр 56 INT_ENABLE: DATA_RDY_EN разрешает прерывание готовности данных, которое возникает каждый раз после записи во все регистры датчиков; регистр 58: DATA_RDY_INT устанавливается при прерывании готовности и сбрасывается чтением
  2. InvenSense. MPU-6000 and MPU-6050 Product Specification, PS-MPU-6000A-00, Revision 3.4 (08/19/2013) — разд. 7.18 Interrupts (таблица источников прерываний): FIFO Overflow, Data Ready (регистры датчиков), ошибки ведущего I²C
  3. Avia Semiconductor. HX711 24-Bit Analog-to-Digital Converter (ADC) for Weigh Scales — Serial Interface: пока данные не готовы, выход DOUT в высоком уровне, PD_SCK должен быть низким; переход DOUT в низкий уровень означает готовность данных; 25–27 импульсов PD_SCK выдвигают данные; табл. временных параметров: от спада DOUT до фронта PD_SCK ≥ 0,1 мкс

Нашли ошибку?