e-serg 0 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Сто раз уже эту байду обсуждали... :twak: Никакой жёсткой синхронности такой метод не даёт, только с точностью +-трамвайная остановка и в тепличных условиях (когда CPU остановлен/спит, никакие другие bus-master-ы в системе не работают). Достаточно хоть немного подумать головой что будет если в момент когда DMA нужно что-то переслать в GPIO-порт, шина окажется занятой (хоть всего на пару тактов). Будет постоянный джиттер фронтов сигналов, зависящий от приоритета DMA-каналов, работы других bus-master-ов в системе, кода выполняемого CPU, пятен на солнце... Ну ну, там вполне измеряемый и вычисляемый джиттер, трамвайная остановка, это в прерывании ноги переключать. Пятна на солнце призывать не надо, в системе не всегда один голый микроконтроллер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HHIMERA 0 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба А не надо ничего мудрить... и все получится... Запустить два таймера синхронно... Первый формирует двойной импульс... второй - одиночный... Началом отсчёта обоих таймеров принять спад второго импульса верхней эпюры... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 23 марта, 2018 Опубликовано 23 марта, 2018 · Жалоба Задача решена на связке нескольких таймеров. За основу взяты три таймера 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. Спасибо всем кто откликнулся на обсуждение. Если будут вопросы с удовольствием отвечу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 23 марта, 2018 Опубликовано 23 марта, 2018 · Жалоба Задача решена на связке нескольких таймеров. За основу взяты три таймера TIM3, TIM2 и TIM1. А почему так громоздко? На dual-SPI не получилось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 23 марта, 2018 Опубликовано 23 марта, 2018 · Жалоба dual-SPI будет задействован по прямому назначению ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 24 марта, 2018 Опубликовано 24 марта, 2018 · Жалоба Если не нужен дедтайм между каналами, то можно решить задачу на одном таймере и DMA. Первый сигнал представляется в виде двух последовательных широтно модулированных импульсов с различным периодом и скважностью. Второй сигнал аналогично, но в противоположной полярности, и с нулевой скважностью в одном такте из двух. Соотвественно настраиваем ШИМ режимы, и загрузку теневых ARR, CCR1, CCR2 через DMA burst при переполнении счётчика. DMA в кольцевом режиме на 6 слов по 16 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 26 марта, 2018 Опубликовано 26 марта, 2018 · Жалоба А почему так громоздко? На dual-SPI не получилось? Просто с таймерами я уже некоторое время провозился и более менее разобрался как их настраивать. А с dual-SPI мне нужно еще нужно разобраться, но я попробую. Если все получится то отпишусь в этой теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 26 марта, 2018 Опубликовано 26 марта, 2018 · Жалоба Если не нужен дедтайм между каналами, то можно решить задачу на одном таймере и DMA. Первый сигнал представляется в виде двух последовательных широтно модулированных импульсов с различным периодом и скважностью. Второй сигнал аналогично, но в противоположной полярности, и с нулевой скважностью в одном такте из двух. Соотвественно настраиваем ШИМ режимы, и загрузку теневых ARR, CCR1, CCR2 через DMA burst при переполнении счётчика. DMA в кольцевом режиме на 6 слов по 16 бит. Да нечто подобное подробно описано в Application note, который выложил A.Lex на первой страницы этого обсуждения глава называется: Arbitrary waveform generation using timer DMA-burst feature (стр. 45). Я не смог реализовать такую штуку для двух каналов одного таймера, но это скорее от недостатка опыта, думаю Ваша идея пригодится кому-то более опытному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2018 Опубликовано 26 марта, 2018 · Жалоба Один таймер с двумя каналами и один элемент "исключающее или" в малом корпусе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lomy 0 26 марта, 2018 Опубликовано 26 марта, 2018 · Жалоба Один таймер с двумя каналами и один элемент "исключающее или" в малом корпусе. В предыдущем варианте устройства, было сделано на логике, сейчас была поставлена задача, все оптимизировать, если что-то может делать контроллер то логику исключить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться