|
Модулированный сигнал на STM32f407, желательно на 1м таймере... |
|
|
|
Feb 1 2014, 18:53
|
Группа: Участник
Сообщений: 11
Регистрация: 25-01-13
Пользователь №: 75 348

|
Можно так сделать. Вариант 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)
|
|
|
|
|
Feb 1 2014, 20:21
|
Группа: Участник
Сообщений: 11
Регистрация: 25-01-13
Пользователь №: 75 348

|
Зачем такие сложности? у Вас 180 МГц? В прескейлер 17999 записываете, в arr 9, в нужный ccr то ли 4, то ли 5, не помню и всё 1 КГц У вас достаточно большая частота, чтобы 2 таймера использовать. Минимальная частота на одном таймере 0,042 Гц. Хотя, скорее всего, на некоторых таймерах еще раза в 4 меньше или в 16.
|
|
|
|
|
Feb 1 2014, 20:29
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
он же модулирует, я так понимаю ему надо чтобы было то ноль то 48 КГц, при этом длительность частоты и длительность 0 как у сигнала 1 КГц...
а внешнего генератора не поставить, вкл - выкл по таймеру?
или же хотя бы может логику "И", тогда 2 таймера 1 КГц, и 48 КГц, и поендить их?
и еще вариант ДМА, по таймеру 2КГц , писать в регистр вкл-выкл выхода таймера, если так можно. Или же в регистр 48КГц шима, скважность 50%-0%
|
|
|
|
|
Feb 1 2014, 20:35
|
Группа: Участник
Сообщений: 11
Регистрация: 25-01-13
Пользователь №: 75 348

|
Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА Могу код выложить в понедельник, под себя подредактируете немного и всё
|
|
|
|
|
Feb 2 2014, 06:04
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(mantech @ Jan 31 2014, 22:27)  Пока мысли запутались, может кто знает, можно-ли получить прерывание от канала таймера 8, который работает в режиме ШИМ? Тогда можно попробовать этим прерыванием "торкать" DMA, который будет циклически крутить буфер из 48 элементов, половина которых =0, а вторая 128...
ЗЫ. Хотя может есть проще варианты?? Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать.
|
|
|
|
|
Feb 2 2014, 16:39
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Feb 2 2014, 12:04)  Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать. Придумать Это получается: таймер+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 имеется буферизация, поэтому такая связка гораздо устойчивее к загрузке шины. Всё
|
|
|
|
|
Feb 2 2014, 17:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(jcxz @ Feb 2 2014, 23:39)  Это получается: таймер+DMA и ещё + 48 байт(слов?) в ОЗУ. У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта). Через каждые 24 периода (0.5мс) перезагружать регистр CCRx.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Feb 3 2014, 05:34
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

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