eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2021-02-26 12:03 am

DHT22/DHT11 на STM32F103

Добил шайтана!
Сначала ожидал, что нужно будет полноценным захватом ШИМ пользоваться, но т.к. в протоколе неинформативная часть имеет постоянную длину импульса, а информативная меняется, достаточно захватывать только полную длину импульса, чтобы определить, единица это или нуль.
Используется таймер TIM1, CC1 настроен на восходящий импульс, CC2 — на нисходящий (но можно CC2 вообще удалить, он здесь роли не играет). Соответственно, таймер в режиме захвата ШИМ и сбрасывает счетчик по событию CC1. По этому же событию DMA передает содержимое счетчика CC1 в очередную ячейку массива данных. Таймер настроен на частоту 1МГц, т.е. 1 тик соответствует 1мкс. Размер массива — 45 байт (чтобы наверняка), хотя, понятное дело, нужно только 42 (короткий начальный импульс, далее 160мкс готовность и 40 бит данных). В ARR записал 200 — чтобы через 201мкс после захвата переднего фронта выключить все, если данных нет.
С инициализацией измерения не парился: завел конечный автомат, который в течение ~20мс выдает низкий уровень сигнала, а потом запускает цикл измерения.
Единственное, что не понял — так это почему каждый раз после включения железяки первое измерение заканчивается неудачей. В режиме тестирования, когда я вместо DMA использовал прерывания по UEV для заполнения массива, такого не было.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org