roboforum.ru

Технический форум по робототехнике.

Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение bambrman » 09 ноя 2013, 17:54

Задача в следующем. Необходимо генерировать ШИМ для управления сервоприводами. Количество серво - от 16 и больше. Понравилась высказанная тут тут идея использовать DMA и GPIO, т.е. есть в памяти массив из uint16_t размером 2200, задача - с с заданной частотой вывести данный массив на пины GPIO.
dma1.JPG

Начал реализовывать.
Выяснилось, что передача DMA - GPIO возможна только в режиме DMA_DIR_MemoryToMemory, и теперь возник вопрос - возможно ли сконфигурировать контроллер DMA на работу с конкретной заданной частотой, в моем случае с частотой 1 МГц?
bambrman
 
Сообщения: 3
Зарегистрирован: 07 окт 2013, 19:39

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение citizen » 09 ноя 2013, 21:54

Вот здесь: http://www.youtube.com/watch?v=IRT4ShYi8Bw утверждается, что передавать данные из DMA в GPIO можно.
В исходниках того проекта http://wakaba.c3.cx/repos/stm32f4-vga/VGA.c вроде как используется режим Memory to peripheral.
Частоту 1 Мгц должен обеспечивать один из таймеров, служащий источником событий для DMA.
OpenSimpleLidar - проект простого самодельного лидара.
Аватара пользователя
citizen
 
Сообщения: 369
Зарегистрирован: 12 окт 2008, 12:40
Откуда: Красногорск, Подмосковье

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение dccharacter » 09 ноя 2013, 23:15

Я делал, можно.
Упс, поторопился. Нет, не получится. Я хотел то же самое сделать для УАРТА - плеваться символами. Нет, не сработает. Ты даешь команду контроллеру начать ДМА-трансфер, и он будеь фигачить с максимальной доступной ему скоростью то количество байтов/полуслов/слов, еоторое в регистре прописано.
Тебе можно делать такое либо в прерывании по таймеру, либо бёрст-инициализацией синхронизированных таймеров.

Тьфу, чет ничего не соображаю
Все, отстаньте от меня
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение Angel71 » 09 ноя 2013, 23:28

даже если решится воспрос с выплёвыванием данных за желаемый промежуток времени, всё-равно нужно много памяти. допустим у сервы диапазон 700-2400 или 500-2250 на 180 градусов. :oops: :wink: :pardon: это же сколько бит на каждый канал... ладно с памятью, допустим при 45 байт на канал и даже с переключением между двумя массивами, у f4 для таких ленивых алгоритмов памяти более чем предостаточно. но чем больше же памяти задействуете, тем больше тактов затратите для "пересчёта". а после превышения определённой частоты пересчётов, такой алгоритм ещё и по тактам сведёт на нет всю эту затею с дма.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение bambrman » 10 ноя 2013, 12:08

citizen писал(а):Вот здесь: http://www.youtube.com/watch?v=IRT4ShYi8Bw утверждается, что передавать данные из DMA в GPIO можно.
В исходниках того проекта http://wakaba.c3.cx/repos/stm32f4-vga/VGA.c вроде как используется режим Memory to peripheral.
Частоту 1 Мгц должен обеспечивать один из таймеров, служащий источником событий для DMA.


Передавать-то можно, пока у меня получилось передать только в режиме MemoryToMemory, как в примере по ссылке - не выходит :( (позже попробую весь проект пересобрать) Чисто теоретически можно генерировать DMA запросы с частотой 1 МГц по апдейту таймера и передавать (задав размер буфера = 1) по одному слову (байту, полуслову). Но в таком случае нужно будет сгенерировать около 2500 запросов на один массив, не многовато ли?
Задача тут другая - один запрос и данные из буфера пошли пошли пошли с заданной скоростью :) В реалии получается так, как говорит dccharacter - на запрос dma контроллер выплевывает данные из буфера с ему только известной скоростью (к примеру массив uint16_t [60000] - так что светодиод еле успевает моргнуть).

Angel71 писал(а):Angel71

Памяти нужно не так уж и много на 16 серв максимум 2500 x 2 байт + возможно, второй массив такой же, а пересчитывать можно необходимыми кусками. Но, видимо, затее не суждено сбыться.
Уже переложил алгоритм DI_HALT'a c easyelectronics на stm32f4 - был немного разочарован, дрожание фронтов заставляет ноги поддергиваться, да и движения дерганные какие-то получаются, в общем, гексапод - псих выходит :) (с таймерами все гораздо плавнее можно сделать), сегодня буду сглаживание прикручивать.
bambrman
 
Сообщения: 3
Зарегистрирован: 07 окт 2013, 19:39

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение citizen » 10 ноя 2013, 16:04

Чисто теоретически можно генерировать DMA запросы с частотой 1 МГц по апдейту таймера и передавать (задав размер буфера = 1) по одному слову (байту, полуслову). Но в таком случае нужно будет сгенерировать около 2500 запросов на один массив, не многовато ли?

Насколько я понимаю, после того, как передача завершена, DMA остановится, и запустить его можно будет только специальной программной командой.

Вот здесь: http://kazus.ru/forums/showthread.php?t=28338&page=324 еще один пример, правда для stm32f0, тоже Memory to peripheral используется.
OpenSimpleLidar - проект простого самодельного лидара.
Аватара пользователя
citizen
 
Сообщения: 369
Зарегистрирован: 12 окт 2008, 12:40
Откуда: Красногорск, Подмосковье

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение Angel71 » 10 ноя 2013, 21:23

bambrman, яж и писал, что с одной стороны памяти требует очень много, но с другой стороны у вас 4xx камушек, а в нём озу относительно много. на каком-нибудь младшем камне вопрос памяти просто бы стал основным гвоздём в гробег, а так у вас просто могут быть нефификтивные затраты по тактам. про сильное дрожание серв единственное, что приходит в голову - это недопилиность алгоритма. хоть на одной шине и сидит куча всего и детально не вникалось что и как из особенностей может повлиять, но в столь значительные проблемы верится очень плохо. можно было бы очень глубоко копнуть, какие там нюансы в работе, но имхо в этом нет необходимости. вы передумали делать на дма и выбрали имхо самый нормальный вариант реализации.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение TedBeer » 22 ноя 2013, 18:18

Не знаю, если поможет. Вот есть пример как управляют RGB светодиодами через DMA. Там требуется для управления поток в 800 кГц.
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Stm32f4 DMA + GPIO = ШИМ. Возможно ли ?

Сообщение Angel71 » 22 ноя 2013, 21:19

пасибки :) нужно будет попробовать это для ws2811
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1


Вернуться в Микроконтроллеры

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67