Feb. 26th, 2021

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

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 06:23 am
Powered by Dreamwidth Studios