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

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. Ничего не мог понять, ничто не помогало. Бред да и всё. Пишу уже втупую значение в память, читаю, а в памяти

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

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...