April 7th, 2020

Модуль измерения температуры на базе ADT7420

Некоторые особенности и наблюдения.

1. На плате EVAL-ADT7420-PMDZ подтяжка шины I2C отсутствует, лучше ставить внешнюю, не касающуюся платы.
2. Подтяжку выводов прерывания с платы EVAL-ADT7420-PMDZ стоит снять и сделать внешней.
3. RC-фильтры по питанию, если они нужны, тоже делать внешними.
Все выше, как изящно выражается публика на Analog Devices, нужно для того, чтобы гарантировать, что the thermal
mass is kept as low as possible.

В режиме прерываний флажки Tlow, Thigh, Tcrit не работают, ни в регистре Status, ни, при 13-битном режиме, в регистре LSB Temperature value. Если эти флажки нужны, включите режим comparator mode / CT в регистре Configuration.

Если Вы используете 13-битный режим, можно обнулить 3 младших бита в (LSB) Temperature value (в INT mode там всегда нули, но я б не полагался...) и использовать то же преобразование, что и для 16-битного режима:
ADT7420_ui16_to_degC(code) ((float)((int16_t)(code))/128.0f)
Альтернатива - сдвиг на 3 бита вправо и деление на 16.

Программирование регистров Setpoint Tlow, Thigh, Tcrit - всегда в 16 бит. Я делаю так:
ADT7420_degC_to_ui16(degC) (uint16_t)(128.0f*(degC)+0.5f-signbit(degC))

При чтении 16 бит в Arduino IDE перед Wire.requestFrom нужна Wire.endTransmission(false).

Я использую
union WB {
uint8_t b[2];
uint16_t w;
};

и, соответственно, при чтении
wb.b[1] = Wire.read();
wb.b[0] = Wire.read();
val = wb.w;

при записи
Wire.write(wb.b[1]);
Wire.write(wb.b[0]);