Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Sinus 2kHz на К1986ВЕ92QI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Konrad
Коллеги, нужен совет.

Хочу с помощью имеющихся в МК К1986ВЕ92QI ЦАП и DMA генерировать синус 2 кГц.
Для своих целей я задействовал таймер 1. Когда происходит событие CNT=ARR, формируется запрос DMA, и DMA-контроллер должен очередное табличное значение функции отправить в ЦАП.
У контроллера DMA есть несколько режимов работы: основной, автозапрос, пинг-понг и др. Из документации не совсем ясна разница между ними, но в ходе экспериментов я выяснил, что в режимах основной и автозапрос при поступлении от таймера одиночного запроса, контроллер DMA пересылает подряд в ЦАП весь массив значений, чего мне не нужно... А вот в режиме пинг-понг в ответ на запрос происходит пересылка одного значения и декремент счетчика числа передач. В итоге я остановился на режиме пинг-понг, и всё работает, но есть одно "но", которое меня смущает...
По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...
Например:
http://chipspace.ru/stm32-dac-3/

Кто-нибудь может сказать: можно ли на этом МК решить мою задачу без использования прерывания от DMA? Так чтобы синус формировалсяисключительноаппаратными средствами.
amiller
Цитата(Konrad @ Sep 6 2016, 23:46) *
По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

В STM32 в настройках DMA есть специальный бит "CIRC" (Circular Mode), который как раз и отвечает за этот функционал. Ищите аналог у Вашего контроллера.
ViKo
А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.
jcxz
Цитата(Konrad @ Sep 7 2016, 01:46) *
но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать.
STM32 тут никак не поможет.

Цитата(Konrad @ Sep 7 2016, 01:46) *
чтобы синус формировалсяисключительноаппаратными средствами.

А зачем?

Цитата(ViKo @ Sep 7 2016, 11:08) *
А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.

Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???
Ведь у ТС совсем другой МК.

PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать wink.gif
редактор
Не обязательно использовать прерывание, можно переинициализировать в фоне. Опрашиваете контроллер DMA на предмет активной структуры. Если используется альтернативная - настраиваем основную и наоборот. Без прерываний но не совсем аппаратно.
HardEgor
В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.
ViKo
Цитата(jcxz @ Sep 7 2016, 09:34) *
Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???
Ведь у ТС совсем другой МК.

Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.
jcxz
Цитата(ViKo @ Sep 7 2016, 14:25) *
Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.

И в тех МК что я перечислил, есть и ping-pong и передачи связным списком. Эти режимы можно использовать для того, что нужно ТС. И даже без прерываний.
Konrad
Цитата(HardEgor @ Sep 7 2016, 12:23) *
В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.


Спасибо, проглядел. В этом примере прерывание тоже используется. Значит иначе никак.

Цитата(jcxz @ Sep 7 2016, 10:34) *
А причём тут STM32? У Вас какой контроллер? Очевидно что в нём совершенно другой контроллер DMA (как и другая периферия) с другими возможностями. И только его и надо изучать.
STM32 тут никак не поможет.


А зачем?


Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???
Ведь у ТС совсем другой МК.

PS: Впрочем - если в МК ТС-а DMA-контроллер соответствует стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller", то могу подсказать wink.gif


Ну, этот контроллер заявлялся как отдаленный аналог STM32...
Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше? понятно, что ПДП все равно занимает шину и может тормозить работу МК, но не хотелось бы тормозить его еще и прерываниями...

Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).
jcxz
Цитата(Konrad @ Sep 7 2016, 16:26) *
Ну, этот контроллер заявлялся как отдаленный аналог STM32...

Аналог в чём? Имеющий то же самое ядро Cortex-M4? Так таких аналогов - пруд пруди.

Цитата(Konrad @ Sep 7 2016, 16:26) *
Зачем? Ну, хочется...) Вообще, в данном случае синхронно с генерацией мне нужно производить измерения, так что это прерывание весьма кстати... Но если рассуждать отвлеченно, то хотелось бы иметь возможность все делать аппаратно... Сейчас частота 2к, а если бы она была выше?

Была-бы выше и что? Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём. С такой маленькой скоростью даже DMA излишне.
У меня сейчас на Tiva через DMA->SPI идут потоки до 15МБ/сек на 120МГц ядра и нормально - загрузка МК небольшая.
У Вас и других прерываний нигде не будет в ПО? Или Вас только прерывания от ЦАП не устраивают почему-то?

Цитата(Konrad @ Sep 7 2016, 16:26) *
Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).

Если это так, тогда он должен соответствовать стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller".
А в семействе Tiva как раз такой контроллер и у Вас аналог не STM32, а Tiva (по DMA-периферии по-крайней мере).
И там есть передача свЯзным списком.
редактор
Цитата
Имеющий то же самое ядро Cortex-M4?
Это М3.Но аналогов меньше не становится. Почему заявлен как анлог St для меня тоже загадка.
Цитата
Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём.
Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.
Цитата
Или Вас только прерывания от ЦАП не устраивают почему-то?
Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).
jcxz
Цитата(редактор @ Sep 7 2016, 18:22) *
Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.

100 точек - это перебор. Имхо. Но даже 200КS/sec - не проблема для такого МК. Через DMA конечно.

Цитата(редактор @ Sep 7 2016, 18:22) *
Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).

Если там (как утверждает ТС) DMA-контроллер - стандартный ARM-овский, как в Tiva, то у меня в Tiva прерывания завершения DMA-транзакций генерируются не по вектору DMA (который да, один), а по вектору периферии, обслуживаемой этим каналом DMA.
Но даже если бы и по вектору DMA, сомневаюсь, что там у ТС десятки периферийных узлов обслуживаются DMA. Скорее всего - 2-3. Обслужить все запросы завершения в одном ISR тогда не проблема.
Obam
А почему никто не посоветовал обратиться за поддержкой к производителю? "Западло" что ли "побеспокоить" не заграничного - своего-родного "вендора"? Или отфутболит?
HardEgor
Цитата(Konrad @ Sep 7 2016, 17:26) *
Спасибо, проглядел. В этом примере прерывание тоже используется. Значит иначе никак.

Стоит почитать форум на milandr.ru, довольно активный и описывается много тонкостей по этим контроллерам.
VAI
Ещё на хабре был цикл статей с общим названием "Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI".
Вот статья по Вашей теме. Остальные можно найти самому.
https://habrahabr.ru/post/255513/
Lerk
Цитата(Konrad @ Sep 6 2016, 22:46) *
Коллеги, нужен совет.

Хочу с помощью имеющихся в МК К1986ВЕ92QI ЦАП и DMA генерировать синус 2 кГц.


Если вам нужен фиксированной частоты, купите себе готовый генератор синуса - есть такие даже с приемкой "5". СКВТ запитываете?

PS. на мой взгляд ЦПУ должен заниматься более интеллектуальными задачами, чем генерация синуса.
Konrad
Цитата(Lerk @ Sep 8 2016, 11:30) *
Если вам нужен фиксированной частоты, купите себе готовый генератор синуса - есть такие даже с приемкой "5". СКВТ запитываете?

PS. на мой взгляд ЦПУ должен заниматься более интеллектуальными задачами, чем генерация синуса.


в точку. Я делаю АЦП-ВТ. Поскольку функций больше никаких на устройство не возлагается, то почему бы и не сделать генератор на МК...

Цитата(HardEgor @ Sep 7 2016, 21:45) *
Стоит почитать форум на milandr.ru, довольно активный и описывается много тонкостей по этим контроллерам.


читал, кое-что почерпнул. Форум был довольно активным, но сейчас представители компании в большинстве случаев хранят молчание...

Цитата(VAI @ Sep 7 2016, 22:07) *
Ещё на хабре был цикл статей с общим названием "Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI".
Вот статья по Вашей теме. Остальные можно найти самому.
https://habrahabr.ru/post/255513/


Читал. Автор не ас, но статьи полезные.
Lerk
Цитата(Konrad @ Sep 9 2016, 13:02) *
в точку. Я делаю АЦП-ВТ. Поскольку функций больше никаких на устройство не возлагается, то почему бы и не сделать генератор на МК...


Вероятно, что дешевле будет поставить готовый АЦПВТ. На вскидку есть производства нпо физика, нииэмп и ожидается миландр. (может кого и забыл) Сравнительный анализ решений можете провести самостоятельно sm.gif Впрочем, если начальство говорит собирать конструктор, то тут уж не поспоришь smile3009.gif
Konrad
Цитата(Lerk @ Sep 12 2016, 11:05) *
Вероятно, что дешевле будет поставить готовый АЦПВТ. На вскидку есть производства нпо физика, нииэмп и ожидается миландр. (может кого и забыл) Сравнительный анализ решений можете провести самостоятельно sm.gif Впрочем, если начальство говорит собирать конструктор, то тут уж не поспоришь smile3009.gif


Это макет пока, но вообще там упор на спецстойкость... Так что готовые решения не особо подходят
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.