Jump to content

    

Sinus 2kHz на К1986ВЕ92QI

Коллеги, нужен совет.

 

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

Для своих целей я задействовал таймер 1. Когда происходит событие CNT=ARR, формируется запрос DMA, и DMA-контроллер должен очередное табличное значение функции отправить в ЦАП.

У контроллера DMA есть несколько режимов работы: основной, автозапрос, пинг-понг и др. Из документации не совсем ясна разница между ними, но в ходе экспериментов я выяснил, что в режимах основной и автозапрос при поступлении от таймера одиночного запроса, контроллер DMA пересылает подряд в ЦАП весь массив значений, чего мне не нужно... А вот в режиме пинг-понг в ответ на запрос происходит пересылка одного значения и декремент счетчика числа передач. В итоге я остановился на режиме пинг-понг, и всё работает, но есть одно "но", которое меня смущает...

По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

Например:

http://chipspace.ru/stm32-dac-3/

 

Кто-нибудь может сказать: можно ли на этом МК решить мою задачу без использования прерывания от DMA? Так чтобы синус формировалсяисключительноаппаратными средствами.

Share this post


Link to post
Share on other sites
По завершении цикла DMA счетчик передач становится = 0, и чтобы зациклить процесс приходится разрешать прерывание от DMA и в нем переинициализировать управляющие слова основной и альтернативной структур DMA-канала. В принципе, это не фатально, в моем случае прерывание возникает раз в 500 мкс, но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

В STM32 в настройках DMA есть специальный бит "CIRC" (Circular Mode), который как раз и отвечает за этот функционал. Ищите аналог у Вашего контроллера.

Share this post


Link to post
Share on other sites

А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.

Share this post


Link to post
Share on other sites
но в примерах для STM32, что я встречал, прерывания не используются - только инициализация и всё...

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

STM32 тут никак не поможет.

 

чтобы синус формировалсяисключительноаппаратными средствами.

А зачем?

 

А еще у STM32 есть прерывание на половине буфера ПДП, очень полезная вещь в данном случае.

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

Ведь у ТС совсем другой МК.

 

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

Share this post


Link to post
Share on other sites

Не обязательно использовать прерывание, можно переинициализировать в фоне. Опрашиваете контроллер DMA на предмет активной структуры. Если используется альтернативная - настраиваем основную и наоборот. Без прерываний но не совсем аппаратно.

 

Share this post


Link to post
Share on other sites

В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.

DMA_SineWave.rar

Share this post


Link to post
Share on other sites
Я могу вспомнить кучу фич DMA-контроллеров LPC17xx, LPC43xx, TM4C129, OMAP-L137 и др. с помощью которых можно решить эту задачу. Только - толку???

Ведь у ТС совсем другой МК.

Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.

Share this post


Link to post
Share on other sites
Так, может, и у топикстартевого контроллера есть такое прерывание? В конце концов, можно 2 буфера сделать, и поочереди их использовать. Будет примерно то же.

И в тех МК что я перечислил, есть и ping-pong и передачи связным списком. Эти режимы можно использовать для того, что нужно ТС. И даже без прерываний.

Share this post


Link to post
Share on other sites
В примерах в Milandr.MDR1986BExx.1.4.2.pack есть готовая программа генерирования синуса на DMA и DAC для вашего процессора.

 

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

 

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

STM32 тут никак не поможет.

 

 

А зачем?

 

 

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

Ведь у ТС совсем другой МК.

 

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

 

Ну, этот контроллер заявлялся как отдаленный аналог STM32...

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

 

Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).

 

Share this post


Link to post
Share on other sites
Ну, этот контроллер заявлялся как отдаленный аналог STM32...

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

 

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

Была-бы выше и что? Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём. С такой маленькой скоростью даже DMA излишне.

У меня сейчас на Tiva через DMA->SPI идут потоки до 15МБ/сек на 120МГц ядра и нормально - загрузка МК небольшая.

У Вас и других прерываний нигде не будет в ПО? Или Вас только прерывания от ЦАП не устраивают почему-то?

 

Чему соответствует контроллер ПДП, я не знаю. Но его описание взято с сайта АРМа (перевод).

Если это так, тогда он должен соответствовать стандарту "ARM ® PrimeCell ® 32-channel configurable µDMA controller".

А в семействе Tiva как раз такой контроллер и у Вас аналог не STM32, а Tiva (по DMA-периферии по-крайней мере).

И там есть передача свЯзным списком.

Share this post


Link to post
Share on other sites
Имеющий то же самое ядро Cortex-M4?
Это М3.Но аналогов меньше не становится. Почему заявлен как анлог St для меня тоже загадка.

Частота 2К выборок из памяти для Cortex-M - это вообще ни о чём.
Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.

Или Вас только прерывания от ЦАП не устраивают почему-то?
Не устраивают прерывания от DMA, там одно прерывание на весь модуль и надо программно искать, какой канал его вызвал, кроме того есть проблемы совместного использования прерываний DMA и АЦП (учитывая что требуются какие то измерения).

 

Share this post


Link to post
Share on other sites
Если читать внимательнее то 2К это частота синуса, сколько точек его формирует не указано. При максимальной частоте ядра 80МГц синус из 100 точек проблемой не станет но без ДМА будет уже не комфортно.

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

 

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

Если там (как утверждает ТС) DMA-контроллер - стандартный ARM-овский, как в Tiva, то у меня в Tiva прерывания завершения DMA-транзакций генерируются не по вектору DMA (который да, один), а по вектору периферии, обслуживаемой этим каналом DMA.

Но даже если бы и по вектору DMA, сомневаюсь, что там у ТС десятки периферийных узлов обслуживаются DMA. Скорее всего - 2-3. Обслужить все запросы завершения в одном ISR тогда не проблема.

Share this post


Link to post
Share on other sites

А почему никто не посоветовал обратиться за поддержкой к производителю? "Западло" что ли "побеспокоить" не заграничного - своего-родного "вендора"? Или отфутболит?

Share this post


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

Стоит почитать форум на milandr.ru, довольно активный и описывается много тонкостей по этим контроллерам.

Share this post


Link to post
Share on other sites

Ещё на хабре был цикл статей с общим названием "Переходим с STM32 на российский микроконтроллер К1986ВЕ92QI".

Вот статья по Вашей теме. Остальные можно найти самому.

https://habrahabr.ru/post/255513/

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this