Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Модулированный сигнал на STM32f407
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
mantech
Есть такая задача, получить аппаратно модулированный сигнал - 1000Гц промодулированный 48КГц.

Желательно на одном таймере (tim8) или если никак не получается, то на 2х (tim14 или tim3) Остальные все заняты biggrin.gif

Пока мысли запутались, может кто знает, можно-ли получить прерывание от канала таймера 8, который работает в режиме ШИМ? Тогда можно попробовать этим прерыванием "торкать" DMA, который будет циклически крутить буфер из 48 элементов, половина которых =0, а вторая 128...

ЗЫ. Хотя может есть проще варианты??
maksim-starcity
Можно так сделать.
Вариант 1: гуглите TIM DAC DMA (или что-то вроде синтезатора звука) - т.е. это реализация на ЦАПе, таймере и DMA. У меня там работает wav плеер. Делается он на TIM7, потому что он на ЦАП заточен.
Вариант 2: что Вам мешает сделать ШИМ?
Вариант 3: DMA Memory to memory, где 1 инкрементится адрес, другой не инкрементится. в качестве точки назначения указываете GPIOx->ODR. Минусы: занят весь порт.
Вариант 3а: 2 потока ДМА: один в BSRR, другой в BRR

На мой взгляд, по трезвости вариант 2 в Вашем случае лидирует.
Что касается таймеров и DMA. Если мне не изменяет память, то чтобы таймер пинал DMA, нужно, чтобы они сидели на одной ветке клока (AHB и тот и тот или APB1)
mantech
Цитата(maksim-starcity @ Feb 1 2014, 22:53) *
Можно так сделать.
Вариант 2: что Вам мешает сделать ШИМ?


Ничего не мешает! Только шим должен включаться и выключаться с частотой 1КГц, вот в чем проблема. Пробовал включать и выключать его по прерыванию другого таймера - дрожжание частоты(загрузка проца под 80% с лишним), особенно во время работы с усб - оттого задачу нужно решить каким-либо аппаратным способом...
maksim-starcity
Зачем такие сложности? у Вас 180 МГц?
В прескейлер 17999 записываете, в arr 9, в нужный ccr то ли 4, то ли 5, не помню и всё 1 КГц
У вас достаточно большая частота, чтобы 2 таймера использовать. Минимальная частота на одном таймере 0,042 Гц. Хотя, скорее всего, на некоторых таймерах еще раза в 4 меньше или в 16.
Golikov A.
он же модулирует,
я так понимаю ему надо чтобы было то ноль
то 48 КГц, при этом длительность частоты и длительность 0 как у сигнала 1 КГц...

а внешнего генератора не поставить, вкл - выкл по таймеру?

или же хотя бы может логику "И", тогда 2 таймера
1 КГц, и 48 КГц, и поендить их?

и еще вариант ДМА, по таймеру 2КГц , писать в регистр вкл-выкл выхода таймера, если так можно. Или же в регистр 48КГц шима, скважность 50%-0%
maksim-starcity
Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА
Могу код выложить в понедельник, под себя подредактируете немного и всё
mantech
Цитата(maksim-starcity @ Feb 2 2014, 00:35) *
Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА
Могу код выложить в понедельник, под себя подредактируете немного и всё


ЦАП уже занят, а вот таймер с дма - это интересно, буду очень рад, если поможете с кодом rolleyes.gif
scifi
Цитата(mantech @ Jan 31 2014, 22:27) *
Пока мысли запутались, может кто знает, можно-ли получить прерывание от канала таймера 8, который работает в режиме ШИМ? Тогда можно попробовать этим прерыванием "торкать" DMA, который будет циклически крутить буфер из 48 элементов, половина которых =0, а вторая 128...

ЗЫ. Хотя может есть проще варианты??

Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать.
mantech
Цитата(scifi @ Feb 2 2014, 10:04) *
Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ.


Какой бит настраивать в качестве запускающего для дма, который срабатывает при совпадении или при переполнении таймера? В аврках раньше помнится, использовал факт совпадения, а тут?
jcxz
Цитата(scifi @ Feb 2 2014, 12:04) *
Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать.

Придумать rolleyes.gif
Это получается: таймер+DMA и ещё + 48 байт(слов?) в ОЗУ.
ТС-у ведь нужен цифровой сигнал: 0, 1, 0, 1, .... как я понял.
Не знаком с периферией STM32, но думаю проще сделать по-другому:
SPI(master)+DMA. Если не понятно, поясню:
Настраиваем SPI на битовую частоту 48*2 кГц.
DMA настраиваем в flip-flop режиме (первый буфер - передача 6 раз байта 0x55, второй буфер - передача 6 раз байта 0 (или 0xFF по желанию)).
Сигнал получаем с MOSI.
Пересылок по шине в 8 раз меньше, а так как у ТС CPU и так загружен (>80%) то это важно. Если использовать 16-битный режим SPI, то можно ещё в 2 раза уменьшить кол-во пересылок.
К тому-же - при связке таймер+DMA, так как состояние пина должно быть изменено в тот момент, когда таймер формирует событие, то любые задержки из-за загрузки шины будут также
приводить к дрожанию фронтов сигнала. В связке-же SPI+DMA, в SPI имеется буферизация, поэтому такая связка гораздо устойчивее к загрузке шины.
Всё
SSerge
Цитата(jcxz @ Feb 2 2014, 23:39) *
Это получается: таймер+DMA и ещё + 48 байт(слов?) в ОЗУ.

У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта).
Через каждые 24 периода (0.5мс) перезагружать регистр CCRx.
mantech
Цитата(SSerge @ Feb 2 2014, 21:16) *
У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта).
Через каждые 24 периода (0.5мс) перезагружать регистр CCRx.


Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером...
scifi
Цитата(mantech @ Feb 2 2014, 23:23) *
Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером...

Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-)
mantech
Цитата(scifi @ Feb 2 2014, 23:33) *
Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-)

Придется...Просто думал, что кто-нить этим уже занимался laughing.gif
Axel
Цитата(maksim-starcity @ Feb 2 2014, 00:35) *
...ЦАП и таймер с ДМА
Могу код выложить в понедельник, под себя подредактируете немного и всё


Буду весьма признателен - у меня с первого раза криво полетело, а время поджимает...
SSerge
Цитата(mantech @ Feb 3 2014, 02:23) *
Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером...

http://electronix.ru/forum/index.php?showt...p;#entry1220741
http://electronix.ru/forum/index.php?showt...p;#entry1202063
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.