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

    

STM32F107. Проблема при работе АЦП с DMA.

Использую АЦП в микроконтроллере STM32F107 в режиме сбора данных с 9 регулярных каналов.

При сборе данные последовательно с каждого выхода (без DMA, по прерыванию от АЦП самостоятельно запускаю новое измерение) - никаких проблем нет. Но если я использую режим SCAN (сбор данных идет через DMA, обработка - в прерывании от DMA) - то периодически, при определенных условиях появляется сдвиг результатов на один канал. Эти условия - переключение в другое состояние некоторых выходов. Как и с чем это может быть связано - непонятно.

Примечательно еще то, что в другом экземпляре (практически аналогичное устройство) - такой проблемы нет. В остальном - микроконтроллер ведет себя абсолютно также.

Проблем с времени сэмплирования - тоже не должно быть, т.к. у меня время - более 10*тау.

Знаю, что такое бывает при отладке - но я вижу это и при отладке и без нее.

 

Проц сгорел? Я не встречал еще такого, чтобы так избирательно сгорал процессор.

 

В чем может быть проблема?

 

Ниже - настройки АЦП и DMA.

post-2468-1530606510_thumb.png post-2468-1530606585_thumb.png

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


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

ПДП работает в циклическом режиме? Если нет - возможно из-за запрета прерываний или более приоритетного обработчика вы не успеваете настроить ПДП на следующую порцию данных, за это время АЦП успевает сделать два измерения и все остальные данные получаются сдвинуты на один канал. В этом случае имеет смысл делать буфер для результатов удвоенного размера, запускать ПДП в циклическом режиме и делать обработку заполненной половины буфера в прервании ПДП по флагам заполнения половины и всего буфера.

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


Ссылка на сообщение
Поделиться на другие сайты
запускать ПДП в циклическом режиме и делать обработку заполненной половины буфера в прервании ПДП по флагам заполнения половины и всего буфера.

И еще перед запуском проверить все взведенные флаги и при необходимости все сбросить.

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


Ссылка на сообщение
Поделиться на другие сайты
ПДП работает в циклическом режиме?

Нет. Причем сразу после срабатывания прерывания - я выключаю DMA и перенастраиваю его. После этого, я запускаю DMA и запускаю АЦП. АЦП Работает в режиме SCAN: т.е. проходит группу и останавливается. Поэтому в принципе - не должно быть проблем с опаздыванием прерывания.

 

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


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

 

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


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

Почему вы действительно не запускаете DMA в циклическом режиме? Один раз настроили таймер, АЦП и DMA потом остается только обрабатывать накопленные данные по прерываниям от DMA по заполнению половины буфера и всего буфера.

После запуска DMA не надо больше с ним делать никаких манипуляций.

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


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

я как-то изначально на разных STM32 всегда использую DMA ADC. И именно циклический опрос. Настроил, запустил и только заглядывай в массив где хранятся последние считанные данные.

Но конечно все процессы у меня обычно медленные, нигде речи нет о привязки уровней с точностью до микросекунд.

 

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


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

Поставил. Сразу после сброса. Флаг EOC - равен единице, хотя только что сбросился. Делаешь шаг (внутри прерывания) - он сбрасывается.

 

Циклически не стал делать только потому, что есть вероятность, что в прерывание придет не сразу, а через несколько микросекунд, т.к. есть более приоритетные прерывания. В этом случае - есть шанс одновременно получить и результат и обратиться к памяти. Хотя эти коллизии вроде как разведены на аппаратном уровне...

 

Попробую сделать циклически. По результатам отпишусь !

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


Ссылка на сообщение
Поделиться на другие сайты
Циклически не стал делать только потому, что есть вероятность, что в прерывание придет не сразу, а через несколько микросекунд, т.к. есть более приоритетные прерывания.
Так для этого и сделана двойная буферизация. Главное успеть обработать первый буфер до того как заполнится второй. Я выбираю размеры буферов такими чтобы они заполнялись за единицы...десятки миллисекунд. Именно столько времени у вас есть чтобы обработать первый буфер. Сложно не успеть за такое время.

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


Ссылка на сообщение
Поделиться на другие сайты
Использую АЦП в микроконтроллере STM32F107 в режиме сбора данных с 9 регулярных каналов.

При сборе данные последовательно с каждого выхода (без DMA, по прерыванию от АЦП самостоятельно запускаю новое измерение) - никаких проблем нет. Но если я использую режим SCAN (сбор данных идет через DMA, обработка - в прерывании от DMA) - то периодически, при определенных условиях появляется сдвиг результатов на один канал. Эти условия - переключение в другое состояние некоторых выходов. Как и с чем это может быть связано - непонятно.

Добро пожаловать в клуб!

Такое явление я наблюдал, о чем даже писал здесь. Может Вам как заинтересованному удастся найти тему :rolleyes:.

Явление возникало на F103 спорадически при внешних электрических помехах, - включении моторов и питания устройств в округе, - хотя общая работоспособность процессора не нарушалась, т.е. не было слётов, перезапусков, зависаний. Я сделал вывод, что имеет место особенность цепей в процессоре аппаратно "сглатывать" какие-то флаги, что приводит к рассинхронизации ADC и DMA. Бороться различными дополнительными фильтрами питания я посчитал нецелесообразным: на всякие аппаратные решения всегда найдется помеха с вихрево-заточенной левой резьбой, а уже примененная схемотехника была достаточно зрела. Поборол программно, перенастраивая DMA и ADC каждый раз. Конечно, нет гарантии, что в цикле преобразования между перезапусками не произойдет сбой. Я пытаюсь предотвратить неверные результаты путем фильтрации и вообще игнорированием результата, если анализ флагов периферии дает основание подозревать, что последний цикл сбойнул.

Опасаюсь, что надежного решения на все случаи жизни нет, т.к. проблема заложена в аппаратуре процессора.

 

P.S. Слабо всплывает в памяти, что на тему я писал не здесь, а в форуме ST.

 

P.P.S. Пошерстил свои темы в ST - нет. Одна из тем здесь: https://electronix.ru/forum/index.php?showt...t&p=1269738

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

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


Ссылка на сообщение
Поделиться на другие сайты
Гость Воложанин М.А.

У меня недавно была подобная хиромантия на F746. Ничего не мог понять, ничто не помогало. Бред да и всё. Пишу уже втупую значение в память, читаю, а в памяти

старое значение. Думал с горя напиться и переползать на другую платформу. Оказалось криво настроено кэширование.

Отключил к чертям. Больше не использую.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация