mantech 53 31 января, 2014 Опубликовано 31 января, 2014 · Жалоба Есть такая задача, получить аппаратно модулированный сигнал - 1000Гц промодулированный 48КГц. Желательно на одном таймере (tim8) или если никак не получается, то на 2х (tim14 или tim3) Остальные все заняты Пока мысли запутались, может кто знает, можно-ли получить прерывание от канала таймера 8, который работает в режиме ШИМ? Тогда можно попробовать этим прерыванием "торкать" DMA, который будет циклически крутить буфер из 48 элементов, половина которых =0, а вторая 128... ЗЫ. Хотя может есть проще варианты?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksim-starcity 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба Можно так сделать. Вариант 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 53 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба Можно так сделать. Вариант 2: что Вам мешает сделать ШИМ? Ничего не мешает! Только шим должен включаться и выключаться с частотой 1КГц, вот в чем проблема. Пробовал включать и выключать его по прерыванию другого таймера - дрожжание частоты(загрузка проца под 80% с лишним), особенно во время работы с усб - оттого задачу нужно решить каким-либо аппаратным способом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksim-starcity 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба Зачем такие сложности? у Вас 180 МГц? В прескейлер 17999 записываете, в arr 9, в нужный ccr то ли 4, то ли 5, не помню и всё 1 КГц У вас достаточно большая частота, чтобы 2 таймера использовать. Минимальная частота на одном таймере 0,042 Гц. Хотя, скорее всего, на некоторых таймерах еще раза в 4 меньше или в 16. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба он же модулирует, я так понимаю ему надо чтобы было то ноль то 48 КГц, при этом длительность частоты и длительность 0 как у сигнала 1 КГц... а внешнего генератора не поставить, вкл - выкл по таймеру? или же хотя бы может логику "И", тогда 2 таймера 1 КГц, и 48 КГц, и поендить их? и еще вариант ДМА, по таймеру 2КГц , писать в регистр вкл-выкл выхода таймера, если так можно. Или же в регистр 48КГц шима, скважность 50%-0% Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksim-starcity 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 · Жалоба Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА Могу код выложить в понедельник, под себя подредактируете немного и всё Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Сорри, неправильно понял суть вопроса) Тогда ЦАП и таймер с ДМА Могу код выложить в понедельник, под себя подредактируете немного и всё ЦАП уже занят, а вот таймер с дма - это интересно, буду очень рад, если поможете с кодом :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Пока мысли запутались, может кто знает, можно-ли получить прерывание от канала таймера 8, который работает в режиме ШИМ? Тогда можно попробовать этим прерыванием "торкать" DMA, который будет циклически крутить буфер из 48 элементов, половина которых =0, а вторая 128... ЗЫ. Хотя может есть проще варианты?? Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Проще, мне кажется, и не придумать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба Конечно, прерывание или запрос DMA можно получать и в режиме ШИМ. Какой бит настраивать в качестве запускающего для дма, который срабатывает при совпадении или при переполнении таймера? В аврках раньше помнится, использовал факт совпадения, а тут? Изменено 2 февраля, 2014 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Отличный вариант, я бы так и сделал. Конечно, прерывание или запрос 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 имеется буферизация, поэтому такая связка гораздо устойчивее к загрузке шины. Всё Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Это получается: таймер+DMA и ещё + 48 байт(слов?) в ОЗУ. У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта). Через каждые 24 периода (0.5мс) перезагружать регистр CCRx. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба У TIM8 есть регистр RCR, поэтому можно обойтись буфером DMA на два слова (4 байта). Через каждые 24 периода (0.5мс) перезагружать регистр CCRx. Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Это я понял, мне больше интересно, как "подопнуть" дма этим-же таймером... Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба Предлагаю почитать мануал. Точно помню, что там есть ответ на этот вопрос :-) Придется...Просто думал, что кто-нить этим уже занимался :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба ...ЦАП и таймер с ДМА Могу код выложить в понедельник, под себя подредактируете немного и всё Буду весьма признателен - у меня с первого раза криво полетело, а время поджимает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться