реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> stm32f103, 4 PWM
chOl
сообщение Apr 14 2011, 05:35
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 17-08-06
Из: Днепропетровск
Пользователь №: 19 638



Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.

Сообщение отредактировал IgorKossak - Apr 14 2011, 06:50
Причина редактирования: Отделил как частную тему
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 15 2011, 06:02
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(chOl @ Apr 14 2011, 07:35) *
Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.

Вопросом на вопрос: а зачем использовать прерывания? CCRx состоит по сути из двух регистров: рабочего (теневого, active), с которым происходит сравнение для выработки PWM, и защелки (хранения, preload), где содержится значение для сравнения. Таким образом, если установлен бит OCxPE регистра TIMx_CCMR1 (стр. 395 документа RM0008.PDF Doc ID 13902 Rev 12.), защелка переписывается аппаратно в рабочий регистр только в момент сравнения (match). То есть, запись в защелку можно производить в любой момент, а действовать новое знаение начнет синхронно, как только предыдущее значение "отыграет свое" в момент match.

А DMA использовать можно для записи в CCRx: см. регистр TIMx_DIER, стр. 390 документа RM0008.PDF Doc ID 13902 Rev 12, совместно с регистрами TIMx_DCR и TIMx_DMAR, стр. 403. Там хитро наворочено: DMA нужно указать регистр TIMx_DMAR в качестве регистра периферии, а регистром TIMx_DCR обозначить, куда же будут попадать данные. Или же можно воспользоваться тем фактом, что CCRx регистры каналов расположены по адресам друг за другом, и писать в них из DMA, задав инкрементирование адреса периферии.
Go to the top of the page
 
+Quote Post
koyodza
сообщение Apr 16 2011, 19:41
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 213
Регистрация: 28-02-07
Из: Киев
Пользователь №: 25 744



Цитата(chOl @ Apr 14 2011, 08:35) *
Вопрос к знатокам. Задача: одновременная работа 4-х, 8-ми разрядных PWM каналов, частота PWM > 32 kHz, значения в регистрах обновлять через 125uS, данные являются 8-ми разрядными выборками аудио сигналов и хранятся в 4-х flash массивах. Вопрос, возможно ли обойтись без обработчика прерываний, а использовать только DMA для циклической пересылки из flash в TIMx->CCRx? Использую контроллер STM32F103B (второй день нет результата). Пасиба.

Если хотите использовать один канал DMA, то так сделать не получится.
DMA не умеет пересылать по одному запросу некоторыми порциями.
Здесь или 1. использовать 4 таймера (по одному каналу DMA на каждый),
или 2. иметь прерывание после пересылки каждого блока данных, а блоком данных тогда будут значения для четырёх каналов, один сэмпл.

Кстати, тоже выводил звук через таймеры STM32 правда у меня только один канал.
Скажу, что обновлять значения в регистрах лучше всё-таки не 8кГц, а с передискретизацией. Я делал 24кГц, и два дополнительных отсчёта вычислял по соседним.
Ещё, если используется динамик прямо в устройстве, то можно подавать ШИМ прямо на него, не преобразовывая в аналоговый сигнал. Только буфер поставить, и отдельным сигналом отключать буфер когда ничего не выводится.
При тактовой таймера 24МГц вполне прилично получается вывод голосовых сообщений, записанных как 8ксэмплов/сек
Регулировка громкости тоже работает нормально, простым умножением
Go to the top of the page
 
+Quote Post
akimych
сообщение Apr 17 2011, 16:27
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073



Вообще если я правильно понимаю смысл "DMA burst length" (в TIMx_DCR), то можно по одному запросу записать данные в неск. регистров таймера подряд. Только тогда данные должны быть не в 4х массивах, а в одном, где каждый элемент - 4 сэмпла для 4х каналов.

Сообщение отредактировал akimych - Apr 17 2011, 16:30
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 05:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016