Сигнал готовности данных (data ready, DRDY)
Датчик измеряет со своей частотой, а микроконтроллер читает со своей. Если читать по таймеру, можно получить старый отсчёт или пропустить новый. Поэтому многие датчики и АЦП сообщают о новом результате отдельным сигналом готовности данных. Разбираем, как это сделано у MPU-6050 и HX711.
Обновлено Редакция GAW
Сигнал готовности данных (data ready, DRDY) — выход или флаг датчика, АЦП или другого устройства, который сообщает, что закончено новое измерение и результат можно читать. Обычно он подключается к входу внешнего прерывания микроконтроллера, и программа читает данные ровно тогда, когда они появились.
Зачем
Датчик выдаёт отсчёты со своей частотой выдачи данных от собственного генератора, а таймер микроконтроллера идёт от другого. При опросе по таймеру частоты расходятся: часть отсчётов читается дважды, часть пропускается. Сигнал готовности синхронизирует чтение с датчиком.
MPU-6050: прерывание DATA_RDY
У MPU-6050 прерывание готовности данных разрешается битом DATA_RDY_EN и возникает каждый раз, когда датчик записал новые значения во все регистры данных. Вывод INT настраивается регистром 55:
| Бит | 0 | 1 |
|---|---|---|
| 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 бита.
Как обрабатывать
Частые вопросы
Зачем нужен сигнал готовности данных, если можно читать по таймеру?
Таймер микроконтроллера и генератор датчика не синхронны. При чтении по таймеру иногда получишь тот же отсчёт дважды, иногда пропустишь новый, а при чтении в момент обновления — части разных измерений. Чтение по сигналу готовности синхронизирует программу с датчиком: каждый отсчёт читается ровно один раз.
Почему прерывание MPU-6050 срабатывает только один раз?
Вероятно, флаг прерывания не сбрасывается. По умолчанию флаги сбрасываются только чтением регистра INT_STATUS (58), и если программа читает лишь данные, вывод INT в режиме удержания уровня (LATCH_INT_EN = 1) так и останется активным. Решение — читать INT_STATUS или включить INT_RD_CLEAR, чтобы флаги сбрасывались любым чтением.
Как HX711 сообщает о готовности, если у него нет вывода прерывания?
Через вывод данных DOUT: пока результат не готов, он в высоком уровне, а когда преобразование закончено, опускается в низкий. Микроконтроллер ждёт спада DOUT — опросом или прерыванием по фронту — и затем выдвигает 25–27 тактами PD_SCK 24 бита результата.
Источники
- 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 устанавливается при прерывании готовности и сбрасывается чтением
- 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
- 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 мкс
Нашли ошибку?
Смотрите также
- ПрерываниеЗапрос периферии, вектор и обработчик прерывания
- Частота выдачи данных (ODR)Сколько новых отсчётов в секунду выдаёт датчик и чем она задаётся
- EXTI — внешние прерывания STM32Линии, которые превращают фронт на выводе в прерывание или событие
- Прерывание по фронту и по уровнюДва способа запуска внешнего прерывания: перепадом сигнала или его уровнем
- MPU-60506 осей по I²C: выводы, адрес, регистры, пересчёт кодов, код Arduino
- HX711АЦП для тензодатчиков: выводы, каналы и усиление, протокол, шум, питание