Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f407, ADC и flash ART prefetcher
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Шаманъ
Приветствую всех!

Обнаружил такую засаду (которая оказалась частично документирована в errata на этот камушек). Началось с того, что внесение в код некоторых изменений (не связаны с работой АЦП) приводило к росту шума АЦП где-то в 6 раз 1111493779.gif . Из-за чего устройство переставало нормально работать. При этом код этот к АЦП никакого отношения не имел sm.gif, ну а закончилось, когда изменение кода в той части, которая никогда не выполняется дало тот же результат laughing.gif
При этом единственное, что изменилось в работающей части кода это некоторые части кода сдвинулись на 4 байта. После этого подозрения упали на модуль флеш памяти и ART. Отключение "префетчера" полностью решило вопрос с шумом АЦП. В принципе примерно то же описано в AN4073.

Собственно это вступление, которое может кому-то будет полезно sm.gif Теперь вопрос - в более старших моделях есть специальные биты ADCDC1/ADCxDC2 которые позволяют эту проблему пофиксить и оставить префетчер включенным, в 407х их нет. В принципе мне хватает производительности и с отключенным префетчером, но все же, так сказать на будущее - кто-то боролся с этим безобразием в 407м? Если да, то какой был результат и как он был достигнут (если не секрет)?
Игорь_Sh88
Аналогичная ситуация, только отключение prefetch не помогает
scifi
Речь идёт о FLASH_ACR_PRFTEN? Я его отключил по другой причине: еррата говорит, что в ревизии А эта штука глючит, и я это наблюдал. Опять же, скорости хватает, зачем копать глубже? laughing.gif
Кстати, говорят, медианная фильтрация эффективно срезает выбросы, так что изучите возможность применения.
adnega
Цитата(Шаманъ @ Feb 16 2017, 12:51) *
Если да, то какой был результат и как он был достигнут (если не секрет)?

FLASH_ACR_PRFTEN отключал, а для отсчетов делал усреднение по схеме N-X (8-4).
Звук (речь) становился гораздо лучше.
Код
        FLASH->ACR = 0
                |    (0 << FLASH_ACR_PRFTEN)
                | (1 << FLASH_ACR_DCEN)
                | (1 << FLASH_ACR_ICEN)
                | (6 << FLASH_ACR_LATENCY);
#define MIC_N                                    (8)
#define MIC_X                                    (4)

amaora
В STM32F405 замечал повышенный шум если во время преобразования идет выполнение. Обычно делаю преобразование по событию таймера когда МК находится во сне. Префетч отключать не пробовал, с выполнение из RAM не сравнивал.
Игорь_Sh88
Делаю DDC приёмник на STM32F407 в 100 корпусе. Аналоговой сигнал через буферный повторитель, собранный на AD823, поступает на вход 10 канала ADC1 (PC0). Запуск АЦП по таймеру, частота дискретизации 2048000 выборок в секунду. Далее, по накоплению N отсчетов АЦП, данные по каналу DMA поступают в double буфер, откуда уже в прерывании по тому же DMA происходить их снос на ноль и децимация. На выходу получаю полосу в 32 кГц в IQ отсчетах и передаю их на комп по обычному UARTу.
Проблема в тому что, при выборе определенного N, появляются искажения в исходном сигнале на частотах кратных 2048000/N Гц.
Питание от USB, фильтры, опора, киндеры все сделал как надо. Пробовал решать проблему отключением буфера предвыборки - не помогает, точнее помехи стают меньше но более размазаны по полосе. Сейчас планирую переделать проект под STM32F7, там есть специальные настройку наподобие битовых полей ADCDC1 и ADCxDC, которые отвечают за снижение шумов вызванные работой буфера предвыборки.
amiller
Цитата(Игорь_Sh88 @ Apr 11 2018, 09:51) *
частота дискретизации 2048000 выборок в секунду.

Вы загнали АЦП практически под теоретический предел по частоте. При максимальной тактовой 36МГц для АЦП и с минимальным временем выборки из одного канала АЦП можно выжать 2116кГц для режима 12 бит.
А если импульсы синхронизации будут идти чаще, чем длительность преобразования, возможны нехорошие последствия.
Рекомендую снизить частоту до более разумной для этого кристалла и увеличить время выборки.
Если нужна всё же нужна большая скорость к Вашим услугам double and triple mode.
Игорь_Sh88
Предел по частоте дискретизации равен 2400000. (36 МГц делим на 15, где 15 это сума 12 с 3) тоесть запас есть. Пробовал даже на 2.304 МГц запускать - все норм. За совет спасибо, попробую triple или double mode но не думаю, что это решит проблему с шумами на этом камне.
Шаманъ
Цитата(scifi @ Apr 4 2018, 15:42) *
Кстати, говорят, медианная фильтрация эффективно срезает выбросы, так что изучите возможность применения.

Она используется изначально, ибо в том применении все очень плотно с шумами АЦП было.

P.S. Вот уж не думал, что через год кто-то напишет в тему sm.gif Да, девайс давно и успешно работает с отключенным префетчером.
amiller
Цитата(Игорь_Sh88 @ Apr 11 2018, 17:11) *
Предел по частоте дискретизации равен 2400000. (36 МГц делим на 15, где 15 это сума 12 с 3) тоесть запас есть. Пробовал даже на 2.304 МГц запускать - все норм. За совет спасибо, попробую triple или double mode но не думаю, что это решит проблему с шумами на этом камне.

Странно, а даташит на этот камень отводит при внешней синхронизации 17 тактов на одно преобразование, а не 15 тактов. Причём со сноской: Guaranteed by characterization results, not tested in production.
По моему Вы слишком оптимистичны в этом направлении. Когда мне нужно было обеспечить 2,5МГц дискретизацию, я перешел на double mode.
Игорь_Sh88
Все правильно, 17 тактов при внешней синхронизации, 15 при внутренней от таймера в моем случае.
scifi
Цитата(Игорь_Sh88 @ Apr 12 2018, 11:28) *
Все правильно, 17 тактов при внешней синхронизации, 15 при внутренней от таймера в моем случае.

Внутренний таймер в качестве триггера - это тот же внешний триггер в этом контексте. Имеется в виду внешний по отношению к АЦП.
golf2109
а для серии F7 также такое набдюдается?
Шаманъ
Цитата(golf2109 @ Apr 13 2018, 18:13) *
а для серии F7 также такое набдюдается?

Я ж в первом сообщении про это писал: "...в более старших моделях есть специальные биты ADCDC1/ADCxDC2 которые позволяют эту проблему пофиксить и оставить префетчер включенным". Подробности смотрите в AN4073.
На практике об F7 ничего сказать не могу, т.к. задач требующих очень малые шумы АЦП на F7 не попадалось.
Игорь_Sh88
Цитата(amiller @ Apr 12 2018, 02:12) *
Вы слишком оптимистичны в этом направлении. Когда мне нужно было обеспечить 2,5МГц дискретизацию, я перешел на double mode.


Попробовал double mode для АЦП. Частота дискретизации отдельного АЦП уменшылась соответственно вдвое и стала равной 1024000 выб/с, однако на шумы это никак не повлияло, что характер, что уровень не изменился. Отключение буфера предвыборки не сильно помогает.
. В качестве эксперимента также запускал в triple mode АЦП, по этом шумы как были так и остались, а вот чувствительность АЦП к слабым сигналам (менее 2 мВ) упала примерно в четверо, как будто АЦП стало 10 битным.
. Далее буду пробовать все сделать на STM32F7
amiller
Возможно проблема с повышенным шумом вовсе не из-за префетчера и вообще не программная.
Предлагаю попробовать сначала найти режим, в котором уровень шумов Вас устраивает.
Уменьшить частоту до килосимплов, добавить нормальное время выборки. Возможно даже усыпить ядро на время преобразования.
Если аппаратная часть не шумит, то дальше надо поэтапно двигаться к режиму работы, который Вам нужен.
И будет ясно, что именно приводит к скачкообразному повышению шумов. Ну и тогда будут версии, как с этим бороться.
Иначе есть вероятность. что при переходе на F7 Вы опять столкнётесь с теми же самыми проблемами.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.