Пробую тут запустити адресну світлодіодну стрічку на WS2812 (https://cdn-shop.adafruit.com/datasheets/WS2812.pdf).
Там дані передаються на стрічку як PWM на частоті 800кГц (1.25мкс на період).
Гуглиться купка статей на цю тему, де все ± просто робиться через таймер в PWM режимі з DMA.
Проблема виникає в тому, що на виході сигнал виходить … якийсь явно не той.
Наприклад, пробую передавати 0xFF. На осцилографі щось таке:
Тобто, чомусь лише 5 періодів замість 8. При цьому кожен раз там щось інше: може бути 5, може 4, може 6, можуть бути довші імпульси, можуть бути коротші.
Думав, що криво налаштований таймер. Але якщо prescaler поставити в 100 замість 0, всі 8 імпульсів виглядають як треба:
Тобто, сигнал рветься саме на більш високих частотах.
Що встиг спробувати:
- сіпати GPIO на процесорі, без таймера
- ставити різні варіанти Maximum Output Speed на GPIO
- використовувати різні таймери, різної розрядності, на різних GPIO
- думав, може осцилограф глючить (він досить простий: Hantek6022BE), але на 2Мгц з Master Clock Output, наче, ± норм … лиш інколи спотворює якийсь імпульс.
- перезапускав контроллер з відключеним дебагером
- думав, що мож DMA не встигає … спробував зробити просто PWM з таймером.
На 800кГц виглядає так (а мали б бути однакові імпульси десь в пів періода):
На 8кГц так:
В архіві проект для Nucleo на F446RE з самим простим налаштуванням (що дає передостанній графік на PB6):
- 180 МГц
- TIM4 з prescaler 0, імпульсом в півперіода та ARR 113
- PB6 з VeryHigh Maximum output speed
F446re-ws2812.zip (963.4 KB)
Відчувається, що тут щось очевидне працює не так, адже по datasheet GPIO тут мали б видавати до 90МГц.
Буду вдячний за підказку.