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

 
 
> Вопрос по контроллеру прерывания STM32F103
misyachniy
сообщение Feb 5 2015, 16:42
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 716
Регистрация: 27-05-05
Из: Kyiv
Пользователь №: 5 454



Предисловие:
Микроконтроллер с помощью прерывания таймера и АЦП оцифровывает сигнал, вычисляет его амплитуду и фазу.
Для проверки алгоритма и статистической обработки введена функция съема данных в компьютер.
Съем данных через USB, переделан из примера USB CDC.

Суть вопроса:
При частоте сигнала около 6,5 кГц, обычно работает.
Если поднять частоту в 3 раза, соответственно и объем данных в три раза, то сбои становятся заметны.
Сбои проявляются в скачках фазы при обмене по USB.

Понятно что конфликт в прерываниях.

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

Нашел "особенность"
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
Как я понял, разрешается манипуляция приоритету по всему диапазону от 0 до 15
http://caxapa.ru/527021.html

Предположил, что виноваты критические секции встречающиеся в USB
Код
ENTR_CRT_SECTION();
EXT_CRT_SECTION();

Отключать их в примерах от производителя не хочется.

теперь сижу и думаю - как организовать съем данных с АЦП, чтобы USB не мешал?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Feb 5 2015, 16:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Ну можно сигналы АЦП забирать не по прерыванию, а через ДМА. А оттуда выгребать. В случае если повисаете в USB у вас там будет 2 отсчета, так будите видеть там 1 отсчет. Сделайте буфер с запасом, и пусть туда складываются данные. Время от время от времени проверяйте буфер, забирайте все оттуда и перезапускайте ДМА.

А так критическая секция не есть круто, это фактически запрет прерывания, но после нее прерывание должно сработать. Неужели программа сидит в критической секции дольше чем время между отсчетами? Тогда не сделав буфер вы от проблемы не избавитесь.

Лучше сразу на 2 каналах ДМА делать буфер кольцевым чтобы их не перенастраивать и следить какие значения вы уже считали и двигать указатель на свободные данные
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:58
Рейтинг@Mail.ru


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