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

June 2025

S M T W T F S
123 4567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 5th, 2025 10:33 pm
Powered by Dreamwidth Studios