Перейти к содержанию
    

Модулированный сигнал на STM32f407

Есть такая задача, получить аппаратно модулированный сигнал - 1000Гц промодулированный 48КГц.

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно так сделать.

Вариант 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно так сделать.

Вариант 2: что Вам мешает сделать ШИМ?

 

Ничего не мешает! Только шим должен включаться и выключаться с частотой 1КГц, вот в чем проблема. Пробовал включать и выключать его по прерыванию другого таймера - дрожжание частоты(загрузка проца под 80% с лишним), особенно во время работы с усб - оттого задачу нужно решить каким-либо аппаратным способом...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем такие сложности? у Вас 180 МГц?

В прескейлер 17999 записываете, в arr 9, в нужный ccr то ли 4, то ли 5, не помню и всё 1 КГц

У вас достаточно большая частота, чтобы 2 таймера использовать. Минимальная частота на одном таймере 0,042 Гц. Хотя, скорее всего, на некоторых таймерах еще раза в 4 меньше или в 16.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

он же модулирует,

я так понимаю ему надо чтобы было то ноль

то 48 КГц, при этом длительность частоты и длительность 0 как у сигнала 1 КГц...

 

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

 

или же хотя бы может логику "И", тогда 2 таймера

1 КГц, и 48 КГц, и поендить их?

 

и еще вариант ДМА, по таймеру 2КГц , писать в регистр вкл-выкл выхода таймера, если так можно. Или же в регистр 48КГц шима, скважность 50%-0%

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА

Могу код выложить в понедельник, под себя подредактируете немного и всё

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА

Могу код выложить в понедельник, под себя подредактируете немного и всё

 

ЦАП уже занят, а вот таймер с дма - это интересно, буду очень рад, если поможете с кодом :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ.

 

Какой бит настраивать в качестве запускающего для дма, который срабатывает при совпадении или при переполнении таймера? В аврках раньше помнится, использовал факт совпадения, а тут?

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать.

Придумать :rolleyes:

Это получается: таймер+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 имеется буферизация, поэтому такая связка гораздо устойчивее к загрузке шины.

Всё

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это получается: таймер+DMA и ещё + 48 байт(слов?) в ОЗУ.

У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта).

Через каждые 24 периода (0.5мс) перезагружать регистр CCRx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта).

Через каждые 24 периода (0.5мс) перезагружать регистр CCRx.

 

Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером...

Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-)

Придется...Просто думал, что кто-нить этим уже занимался :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...ЦАП и таймер с ДМА

Могу код выложить в понедельник, под себя подредактируете немного и всё

 

Буду весьма признателен - у меня с первого раза криво полетело, а время поджимает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...