реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Таймер для генерации импульсов
lomy
сообщение Mar 19 2018, 13:37
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Здравствуйте, уважаемые коллеги.
Прошу помочь с решением задачи. Сразу оговорюсь, что я инженер-схематехник, и практического опыта программирования микроконтроллеров у меня нет. Задача такая, используя микроконтроллер STM32L476RG (можно другой серии, главное STM32) нужно генерировать сигнал на двух портах микроконтроллера как на прикрепленном изображении. Сигналы должны быть обязательно синхронизированы.

На данный момент я уже попытался по-разному решить эту задачу несколькими способами, в каждом из которых столкнулся с проблемами, опишу их:
Способ 1: активировал два таймера (ведущий и ведомый), один отсчитывает длинные периоды по 15 мс и тактирует второй, который в режиме one pulse генерирует прямой и комплементарный сигнал, проблема состоит в том, что в инверсном канале, когда таймер 2 «бездействует» устанавливается 1 (это правильно по логике работы инверсного канала, но не удовлетворяет решению)

Способ 2: активировал два таймера, один отсчитывает длинные периоды по 15 мс второй считает короткие полупериоды 0,5 мкс порты переключаю вручную в обработчике прерываний, получается, довольно криво. Синхронизировать два канала не удается (сгенерированные импульсы смещены друг относительно друга)
Способ 3: активировал 3 таймера один отсчитывает длинные периоды по 15 мс и тактирует второй, который генерирует два импульса и тактирует третий таймер, который генерирует одиночный импульс, проблема в том, что все это почему-то работает только с тактовой частотой контроллера 80 МГц, стоит только начать настраивать частоты тактирования контроллера или самих таймеров как все разваливается.
Если у кого то есть идеи или готовое решение, пожалуйста, ответьте.
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Mar 20 2018, 11:48
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



Посмотрите в Application note, например en.DM00236305.pdf
Прикрепленные файлы
Прикрепленный файл  en.DM00236305.pdf ( 1.95 мегабайт ) Кол-во скачиваний: 104
 
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 20 2018, 12:49
Сообщение #3





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Спасибо за ответ.
Я активно использовал этот Application note, и научился его помощью генерировать пачки импульсов. Но я не смог решить своей задачи. Если у Вас будет время взгляните, пожалуйста, на диаграмму стр. 68. Там видно, что в инверсном канале остается «лишний импульс». Возможно ли сделать то, что там называется “Commutation update to inactive mode” на один импульс раньше?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 12:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(lomy @ Mar 19 2018, 15:37) *
Сразу оговорюсь, что я инженер-схематехник, и практического опыта программирования микроконтроллеров у меня нет. Задача такая, используя микроконтроллер STM32L476RG (можно другой серии, главное STM32)

А чем вызваны такие ограничения? По религиозным соображениям? Или у вас нет программистов, а есть только кубо-кодеры? laughing.gif

Цитата(lomy @ Mar 19 2018, 15:37) *
Способ 1: активировал два таймера (ведущий и ведомый), один отсчитывает длинные периоды по 15 мс и тактирует второй, который в режиме one pulse генерирует прямой и
...
Способ 2: активировал два таймера, один отсчитывает длинные периоды по 15 мс второй считает короткие полупериоды 0,5 мкс порты переключаю вручную в обработчике прерываний,
...
Способ 3: активировал 3 таймера один отсчитывает длинные периоды по 15 мс и тактирует второй, который генерирует два импульса и тактирует третий таймер, который генерирует

Вообще это элементарно решается на любом МК LPC имеющем интерфейс SGPIO - он как раз и предназначен для генерации таких пачек последовательных импульсов синхронно по нескольким ногам.
Я его как раз и использовал для генерации очень похожих пачек из фиксированного числа импульсов и по разным ногам для управления пьезоизлучателем. Только у меня было 3 импульса с периодом 200нс.

Ну а если на любом другом МК (в том числе и на STM32), то можно использовать dual-SPI например.

Также это легко реализуется на семействе МК Infineon XMC4xxx - там есть богатые возможности по синхронной работе нескольких таймеров.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 20 2018, 13:05
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Да, к сожалению, свободных программистов для этого проекта нет, поэтому приходится делать самому.
Если есть возможность дайте ссылки на инфу как можно использовать dual-SPI для решения задачи.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 13:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(lomy @ Mar 20 2018, 15:05) *
Если есть возможность дайте ссылки на инфу как можно использовать dual-SPI для решения задачи.

Так это вроде самоочевидно. Почитайте как работает dual-SPI.
Там в режиме OUT вместо одного пина MOSI на вывод работают 2 пина: чётные биты слова - через один пин, нечётные - через другой. Вот и всё.
Подключаете верхнюю линию осциллограммы к DATA0, нижнюю - к DATA1, настраиваете порт на SCLK==1МГц, вывод, выводите байт == 0x19 и получаете на пинах первую группу импульсов со своей осциллограммы.
Главное чтоб Ваш МК умел dual-SPI. Или quad-SPI.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 20 2018, 13:26
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Хорошо, буду читать. Но разве там линии не полностью инверсны друг другу? Мне нужно что бы когда нет импульсов обе линии были в нуле.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 15:18
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(lomy @ Mar 20 2018, 15:26) *
Хорошо, буду читать. Но разве там линии не полностью инверсны друг другу? Мне нужно что бы когда нет импульсов обе линии были в нуле.

dual-SPI - это SPI выводящий два бита за такт SCLK. Соответственно - на эти две линии можно выставлять данные совершенно независимо, но полностью синхронно.
Читайте мануал! Хотя бы гугл используйте: https://www.totalphase.com/support/articles...Serial-Software
Go to the top of the page
 
+Quote Post
e-serg
сообщение Mar 21 2018, 02:52
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Вариант, проверен на stm32f107 такт таймера 1мкс.
у таймера используются два канала сравнения, два канала DMA, две таблицы в памяти.
по сравнению одного канала таймера, DMA транзакция из таблицы в GPIOx->BSRR устанавливаю или сбрасываю нужные пины выбранного порта.
по сравнению другого канала, DMA burst из второй таблицы выбирается следующие два значения для каналов сравнения таймера.
каналы срабатывают одновременно.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 21 2018, 06:21
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Спасибо, jcxz и e-serg, я постараюсь разобраться в предложенных вариантах.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 21 2018, 08:30
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(e-serg @ Mar 21 2018, 04:52) *
Вариант, проверен на stm32f107 такт таймера 1мкс.
у таймера используются два канала сравнения, два канала DMA, две таблицы в памяти.

Сто раз уже эту байду обсуждали... twak.gif
Никакой жёсткой синхронности такой метод не даёт, только с точностью +-трамвайная остановка и в тепличных условиях (когда CPU остановлен/спит, никакие другие bus-master-ы в системе не работают).
Достаточно хоть немного подумать головой что будет если в момент когда DMA нужно что-то переслать в GPIO-порт, шина окажется занятой (хоть всего на пару тактов). Будет постоянный джиттер фронтов сигналов, зависящий от приоритета DMA-каналов, работы других bus-master-ов в системе, кода выполняемого CPU, пятен на солнце...
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 21 2018, 08:51
Сообщение #12





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Если синхронности не дает, то не буду тратить на это время.

К тому моменту как я обратился на форум, я перерыл много информации в интернете. У меня сложилось такое ощущение, что это задача имеет решение с помощью двух таймеров (один ведомый другой ведущий) и периферии которой они могут управлять напрямую. Наверное я заблуждался.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 21 2018, 09:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(lomy @ Mar 21 2018, 10:51) *
К тому моменту как я обратился на форум, я перерыл много информации в интернете. У меня сложилось такое ощущение, что это задача имеет решение с помощью двух таймеров (один ведомый другой ведущий) и периферии которой они могут управлять напрямую. Наверное я заблуждался.

Так возможно тоже можно, я просто не использовал работу связок таймеров в STM32 и не знаю возможно ли это. Но в других МК это возможно.
Если нужны жёстко детерминированные временные зависимости неких сигналов генерируемых МК, то эти сигналы не должны зависеть от неизвестных временнЫх величин, коими являются транзакции по внутренним шинам МК. А значит это можно сделать и на связках таймеров если они связаны своими внутренними сигналами синхронизации без привязки к CPU или DMA.
Как только изменение некоего сигнала становится зависимым от пересылки по матрице шин (с помощью CPU или DMA), так сразу возникает неопределённость во времени перепада этого сигнала так как пересылка по шине не выполняется мгновенно или даже просто фиксированное время - это величина переменная, зависящая от загрузки шины. Так как шина - общая.
Но проще, имхо, будет сделать на dual-SPI - и периферии меньше задействовано.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 21 2018, 11:03
Сообщение #14





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Спасибо за разъяснение. Я уже начал читать про dual-SPI.
Однако если кто-то реализовал нечто подобное на связках таймеров в STM32, поделитесь своим опытом, пожалуйста.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 21 2018, 11:47
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(jcxz @ Mar 21 2018, 15:30) *
Достаточно хоть немного подумать головой что будет если в момент когда DMA нужно что-то переслать в GPIO-порт, шина окажется занятой (хоть всего на пару тактов). Будет постоянный джиттер фронтов сигналов, зависящий от приоритета DMA-каналов, работы других bus-master-ов в системе, кода выполняемого CPU, пятен на солнце...

Так передавать по DMA надо не в порты GPIO, а перепрограммировать режим таймера. У таймера все необходимые регистры буферизованы и могут обновляться разом, будет вам синхронизация.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
e-serg
сообщение Mar 21 2018, 14:21
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180



Цитата(jcxz @ Mar 21 2018, 17:30) *
Сто раз уже эту байду обсуждали... twak.gif
Никакой жёсткой синхронности такой метод не даёт, только с точностью +-трамвайная остановка и в тепличных условиях (когда CPU остановлен/спит, никакие другие bus-master-ы в системе не работают).
Достаточно хоть немного подумать головой что будет если в момент когда DMA нужно что-то переслать в GPIO-порт, шина окажется занятой (хоть всего на пару тактов). Будет постоянный джиттер фронтов сигналов, зависящий от приоритета DMA-каналов, работы других bus-master-ов в системе, кода выполняемого CPU, пятен на солнце...

Ну ну, там вполне измеряемый и вычисляемый джиттер, трамвайная остановка, это в прерывании ноги переключать.
Пятна на солнце призывать не надо, в системе не всегда один голый микроконтроллер.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Mar 21 2018, 16:11
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



А не надо ничего мудрить... и все получится...
Запустить два таймера синхронно... Первый формирует двойной импульс... второй - одиночный...
Началом отсчёта обоих таймеров принять спад второго импульса верхней эпюры...
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 23 2018, 14:02
Сообщение #18





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Задача решена на связке нескольких таймеров. За основу взяты три таймера TIM3, TIM2 и TIM1.
TIM3 отсчитывает длинные периоды по 15 мс по окончании счета тактирует TIM2 и TIM1 по ITR2.
TIM2 настроен как Slave, своим первым каналом он управляет портом МК в режиме PWM Generation. Обязательно включить One Pulse Mode.
TIM1 тоже настроен как Slave, и своим первым каналом он управляет портом МК в режиме PWM Generation. Обязательно включить One Pulse Mode и задать счет повторений Repetition Counter ( по моему эта функция есть только у Advanced-control timers).
Собственно все работает самостоятельно, без каких либо пользовательских прерываний. Поэтому синхронизация импульсов получается идеальная (видно на осциллограмме). Частоту можно задавать изменением тактирования частоты таймеров или изменением длительностей импульсов PWM.
Спасибо всем кто откликнулся на обсуждение. Если будут вопросы с удовольствием отвечу.


Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 23 2018, 15:46
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(lomy @ Mar 23 2018, 16:02) *
Задача решена на связке нескольких таймеров. За основу взяты три таймера TIM3, TIM2 и TIM1.

А почему так громоздко? На dual-SPI не получилось?
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 23 2018, 18:40
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



dual-SPI будет задействован по прямому назначению wink.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Timmy
сообщение Mar 24 2018, 05:38
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Если не нужен дедтайм между каналами, то можно решить задачу на одном таймере и DMA. Первый сигнал представляется в виде двух последовательных широтно модулированных импульсов с различным периодом и скважностью. Второй сигнал аналогично, но в противоположной полярности, и с нулевой скважностью в одном такте из двух. Соотвественно настраиваем ШИМ режимы, и загрузку теневых ARR, CCR1, CCR2 через DMA burst при переполнении счётчика. DMA в кольцевом режиме на 6 слов по 16 бит.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 26 2018, 09:47
Сообщение #22





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Цитата(jcxz @ Mar 23 2018, 18:46) *
А почему так громоздко? На dual-SPI не получилось?

Просто с таймерами я уже некоторое время провозился и более менее разобрался как их настраивать. А с dual-SPI мне нужно еще нужно разобраться, но я попробую. Если все получится то отпишусь в этой теме.

Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 26 2018, 11:06
Сообщение #23





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Цитата(Timmy @ Mar 24 2018, 08:38) *
Если не нужен дедтайм между каналами, то можно решить задачу на одном таймере и DMA. Первый сигнал представляется в виде двух последовательных широтно модулированных импульсов с различным периодом и скважностью. Второй сигнал аналогично, но в противоположной полярности, и с нулевой скважностью в одном такте из двух. Соотвественно настраиваем ШИМ режимы, и загрузку теневых ARR, CCR1, CCR2 через DMA burst при переполнении счётчика. DMA в кольцевом режиме на 6 слов по 16 бит.

Да нечто подобное подробно описано в Application note, который выложил A.Lex на первой страницы этого обсуждения глава называется: Arbitrary waveform generation using timer DMA-burst feature (стр. 45). Я не смог реализовать такую штуку для двух каналов одного таймера, но это скорее от недостатка опыта, думаю Ваша идея пригодится кому-то более опытному.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 26 2018, 11:31
Сообщение #24


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Один таймер с двумя каналами и один элемент "исключающее или" в малом корпусе.
Go to the top of the page
 
+Quote Post
lomy
сообщение Mar 26 2018, 12:01
Сообщение #25





Группа: Участник
Сообщений: 11
Регистрация: 31-10-13
Из: СПб
Пользователь №: 78 983



Цитата(ViKo @ Mar 26 2018, 14:31) *
Один таймер с двумя каналами и один элемент "исключающее или" в малом корпусе.

В предыдущем варианте устройства, было сделано на логике, сейчас была поставлена задача, все оптимизировать, если что-то может делать контроллер то логику исключить.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 14:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01583 секунд с 7
ELECTRONIX ©2004-2016