Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 10:42

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 20:37 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Доброго времени.

дано: stm32f042f6p6, ws2812b;
задача: включить первый светодиод определенным цветом;
ограничения: настроить таймер для работы с ws2812b без использования DMA, только прерывания;

Настраиваю tim2 для работы с ws2812b:
Частота МК - 48 000 000 Гц
Предделитель tim2 - 0 (без делителя)
Период tim2 - 59 (с учетом +1 будет 60)

Длительность HI - 38
LO - 22

При этих настройках (как я думаю) период импульса будет 1.25мкс, HI=0.8мкс, LO=0.4мкс;
В прерывании tim2 - сбрасываю флаг СC2IF (tim2, channel_2);
- записываю очередное значение в таймер (LO/HI) из заранее поготовленного буфера;
- если достигнут конец буфера выключаю таймер;

Запускаю и... не работает, работает, но цвета не соответствуют заданным. При загрузке в буфер значений G - 1, R - 0, B - 0 - светится красным? Думаю, значит, что-то не то с частотой прохождения импульсов. Методом научного тыка подбираю tim2->APR = от 109 до 139 все начинает работать как положено. Проверил частоту на которой работает таймер: установил предделитель 47999, период 999, импульс 500 и "учебно-тренировачный" (DS202) осциллограф показывает четкие импульсы каждые пол секунды, следовательно таймер тактируется частотой в 48 МГц.
Таким образом при увеличении периода импульсов почти в два раза - начинает работать. В место положенных 1.25 мкс период составляет 2.50 мкс.
Что-то я не понимаю как это происходит? Подскажите где искать?

main.c

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 21:31 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
Возможно банально производительности не хватает, только на вход в прерывание нужно 16 тактов плюс WS, немного меньше на выход, суммарно обработчик может и в 1us не вписаться, а если еще оптимизация выключена...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 21:44 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Есть у меня stm429i-disco, как будет минутка, запилю тоже самое на ней. Поэкспериментирую с разными частотами от 180 до 48.
Как-то тяжеловато укладывается мысль, что электроника совсем не точная наука. По даташиту ws2812b - период = 1.25мкс. В моем же случае это утверждение нарушено в два раза и работает. Хотя допуски там плюс-минус 150 ns.

Ок. Reflector, Спасибо.

ps: и да оптимизация отключена.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 21:47 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
Эти мк минимум на 80MHz работают, можно и на них проверить, просто множитель PLL увеличь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 21:53 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
О как! Попробую, надеюсь от таких частот, максимум МК не запустится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 22:16 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Капец! Увеличил частоту МК до 72МГц, привел все паузы\импульсы в соответствие с новой частотой и ага. Все завелось и прекрасно работает.
Увеличение частоты почти в два раза выше максимальнодопустимой приведет к...?
-увеличению потребления тока
-к возможной нестабильной работе МК, так-ли это? Или еще что-то более тяжелое?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 23:01 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 875
Заниматься программным ногодрыгом на уровне отдельных битов, да ещё и на приличной скорости...
Достаточно одного таймера с внешним запуском по фронту SCK от spi, и двух внешних аналоговых коммутаторов. Первый "запоминает" значение линии данных spi (проходной ёмкости вполне достаточно), второй по этому напряжению коммутирует один из двух выходных контактов таймера, где уже будут готовые тайминги. Можно добавить ещё один мелкий корпус для перевода 3,3V в 5V.
SPI через dma, и у вашего мк 99,9% свободного времени.
Например для sk6812 достаточно одного коммутатора в мелком корпусе sn74lvc1g3157, там тайминги иные.

Где-то в сети видел схему на расыпухе (6 деталек), принцип схож, но без внешнего таймера. Параметры 1/0 зависят от напряжения и температуры, но зато буквально из говна и палок.

_________________
[url=https://github.com/AVI-crak/Rtos_cortex]Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 23:30 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
AVI-crak, Ногодрыг, в данном случае, только для убедиться в том, шо усё работает. Теперь все понятно, при 48 МГц не работает, стало быть увеличил частоту и все заработало.
Теперь следующий шаг, запустить все это через DMA. Но вот тут полный затык. Изначально пытался переделывать готовые чужие проекты stm_DMA_TIM_ws2812b, естественно ничего не работало. Теперь вроде можно переходить на DMA. Как правильно это все организовать?
Есть в памяти буфер с данными пауз/импульсов, DMA по запросу таймера заберет порцию данных и вкорячит их в таймер. Далее DMA как-то сообщит об окончании передачи (наверно в прерывании) и в этот момет или останавливаем эту карусель или запускаем новую.
1. В какой момент таймер отправит запрос DMA.
2. В каком порядке все это инициализировать и главное запустить (сначала запустить DMA потом таймер или наоборот).

Кому не трудно проясните всю эту кашу, какими-нибуть простыми словами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 26 окт 2020, 23:50 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
wasa7272 писал(а):
Кому не трудно проясните всю эту кашу, какими-нибуть простыми словами.

Инитишь DMA чтобы брал в массиве байт и копировал его в регистр таймера(дополняя до 16/32 бит), затем инитишь таймер с периодом 1.25 us, чтобы он пинал DMA нужно дополнительно включить запрос DMA в регистре DIER(например, TIM_DIER_UDE). Какой DMA с каким таймером работает смотрится в табличке, собственно все. Но накосячить легко, крайне рекомендуется заюзать ЛА и смотреть что там в действительности генерится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 00:08 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Reflector, спасибо. Пойду пробывать, думать. И ЛА видимо надо приобрести.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 09:28 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1688
Есть небольшой фокус с этими светодиодами, важен строб верхний, нижний может немного плавать и все будет работать.
P\S Если интересно могу скинуть Могу скинуть пример использования SPI с WS2812b


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 11:12 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
sed_alex, да интересно, забрасывай

Ну и чтоб не создавать новой темы, продолжу вопрошать тут же.

Теперь непонимание DMA и TIM.

-настроил DMA (канал выключен);
-настроил TIM2 (таймер не запускал);
-в прерывании от DMA, проверяю флаг DMA_ISR_TCIF3 - если установлен, то сбрасываю записью единички, выключаю канал DMA, останавливаю TIM2;
-подготовил буфер с данными;
-включил канал DMA;
-запустил TIM2;

и... результата нет. Ставлю точку останова в прерывании от DMA , не срабатывает , программа не входит в прерывание? Что еще не настроил?

main.c

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 11:34 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 551
Откуда: Киев
DMA1_Channel3->CNDTR = BUF_LEN; // длина пересылки перезаряжай количество


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 11:40 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Увы не работает. Добавил перезарядку длинны буфера не помогло, как не входил в прерывание так и не входит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 12:09 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
А я ведь писал, что DMA читает байт, а пишет 16/32 бита, в зависимости от таймера... Регистры таймеров не поддерживают 8-ми битный доступ, в таком случае байты на шине дублируются и вместо 0x10 для 32-х битного TIM2 запишет 0x10101010.
Далее, для шима положено включать буферизацию записи в CCRx(TIM_CCMR1_OC2PE), без нее у тебя сравнение может сработать для "нулевого" значения CCR, затем оно обновится и в том же периоде сработает для "единичного".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 12:54 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Reflector, В настройках DMA установил размер периферии 32 бит, в настройках таймера разрешил буферизацию CCR2. Не работает. В реф. ман. есть приписка про бит предзагрузки. Но с английским у меня не очень, не понимаю важная там приписка или нет: "The PWM mode can be used without validating the preload register only in onepulse mode (OPM bit set in TIMx_CR1 register). Else the behavior is not guaranteed"? Возможно в этом причина?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 13:29 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1688
wasa7272 писал(а):
sed_alex, да интересно, забрасывай


https://github.com/AlekseySedyshev/WS2812B

Как раз делал под STM32F042 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 13:32 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
Попробуй все нули записываемые в CCR2 заменить единичками, в прерывание будет входить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 13:46 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
sed_alex писал(а):
https://github.com/AlekseySedyshev/WS2812B

Зачем вычитывать DR, если чтение не используется?
Код:
while (!(SPI1->SR & SPI_SR_TXE)){};   
SPI1_DR_8bit = (pBuf[i]);
while (SPI1->SR & SPI_SR_BSY){};
while (!(SPI1->SR & SPI_SR_RXNE)){};
SPI1->DR;

Последние 3 строки лишние.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 13:50 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
sed_alex, Спасибо буду посмотреть.

Reflector, заменил 0 на 1 - нет в прерывание не входит

main.c

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 13:52 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
wasa7272 писал(а):
заменил 0 на 1 - нет в прерывание не входит

А начальное TIM2->CCR2 = 0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 14:11 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Заменил и начальное, нет не входит


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 14:25 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
wasa7272 писал(а):
нет не входит

А у меня с твоим кодом входит, даже с нулевыми значениями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 14:33 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 655
Откуда: Киев
Уже три года делаю новогодние гирлянды на таймере с DMA:
http://sova-audio.blogspot.com/2018/01/ws2811.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 15:16 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
SOVA, Я очень за Вас рад. А у меня пока что-то не получается.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Minoru


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB