Jump to content

    

stm32f407, ADC и flash ART prefetcher

Приветствую всех!

 

Обнаружил такую засаду (которая оказалась частично документирована в errata на этот камушек). Началось с того, что внесение в код некоторых изменений (не связаны с работой АЦП) приводило к росту шума АЦП где-то в 6 раз :1111493779: . Из-за чего устройство переставало нормально работать. При этом код этот к АЦП никакого отношения не имел :), ну а закончилось, когда изменение кода в той части, которая никогда не выполняется дало тот же результат :laughing:

При этом единственное, что изменилось в работающей части кода это некоторые части кода сдвинулись на 4 байта. После этого подозрения упали на модуль флеш памяти и ART. Отключение "префетчера" полностью решило вопрос с шумом АЦП. В принципе примерно то же описано в AN4073.

 

Собственно это вступление, которое может кому-то будет полезно :) Теперь вопрос - в более старших моделях есть специальные биты ADCDC1/ADCxDC2 которые позволяют эту проблему пофиксить и оставить префетчер включенным, в 407х их нет. В принципе мне хватает производительности и с отключенным префетчером, но все же, так сказать на будущее - кто-то боролся с этим безобразием в 407м? Если да, то какой был результат и как он был достигнут (если не секрет)?

Share this post


Link to post
Share on other sites

Аналогичная ситуация, только отключение prefetch не помогает

 

Share this post


Link to post
Share on other sites

Речь идёт о FLASH_ACR_PRFTEN? Я его отключил по другой причине: еррата говорит, что в ревизии А эта штука глючит, и я это наблюдал. Опять же, скорости хватает, зачем копать глубже? :laughing:

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

Share this post


Link to post
Share on other sites
Если да, то какой был результат и как он был достигнут (если не секрет)?

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)

 

Share this post


Link to post
Share on other sites

В STM32F405 замечал повышенный шум если во время преобразования идет выполнение. Обычно делаю преобразование по событию таймера когда МК находится во сне. Префетч отключать не пробовал, с выполнение из RAM не сравнивал.

Share this post


Link to post
Share on other sites

Делаю DDC приёмник на STM32F407 в 100 корпусе. Аналоговой сигнал через буферный повторитель, собранный на AD823, поступает на вход 10 канала ADC1 (PC0). Запуск АЦП по таймеру, частота дискретизации 2048000 выборок в секунду. Далее, по накоплению N отсчетов АЦП, данные по каналу DMA поступают в double буфер, откуда уже в прерывании по тому же DMA происходить их снос на ноль и децимация. На выходу получаю полосу в 32 кГц в IQ отсчетах и передаю их на комп по обычному UARTу.

Проблема в тому что, при выборе определенного N, появляются искажения в исходном сигнале на частотах кратных 2048000/N Гц.

Питание от USB, фильтры, опора, киндеры все сделал как надо. Пробовал решать проблему отключением буфера предвыборки - не помогает, точнее помехи стают меньше но более размазаны по полосе. Сейчас планирую переделать проект под STM32F7, там есть специальные настройку наподобие битовых полей ADCDC1 и ADCxDC, которые отвечают за снижение шумов вызванные работой буфера предвыборки.

Share this post


Link to post
Share on other sites
частота дискретизации 2048000 выборок в секунду.

Вы загнали АЦП практически под теоретический предел по частоте. При максимальной тактовой 36МГц для АЦП и с минимальным временем выборки из одного канала АЦП можно выжать 2116кГц для режима 12 бит.

А если импульсы синхронизации будут идти чаще, чем длительность преобразования, возможны нехорошие последствия.

Рекомендую снизить частоту до более разумной для этого кристалла и увеличить время выборки.

Если нужна всё же нужна большая скорость к Вашим услугам double and triple mode.

Share this post


Link to post
Share on other sites

Предел по частоте дискретизации равен 2400000. (36 МГц делим на 15, где 15 это сума 12 с 3) тоесть запас есть. Пробовал даже на 2.304 МГц запускать - все норм. За совет спасибо, попробую triple или double mode но не думаю, что это решит проблему с шумами на этом камне.

Share this post


Link to post
Share on other sites
Кстати, говорят, медианная фильтрация эффективно срезает выбросы, так что изучите возможность применения.

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

 

P.S. Вот уж не думал, что через год кто-то напишет в тему :) Да, девайс давно и успешно работает с отключенным префетчером.

Share this post


Link to post
Share on other sites
Предел по частоте дискретизации равен 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.

Share this post


Link to post
Share on other sites

Все правильно, 17 тактов при внешней синхронизации, 15 при внутренней от таймера в моем случае.

Share this post


Link to post
Share on other sites
Все правильно, 17 тактов при внешней синхронизации, 15 при внутренней от таймера в моем случае.

Внутренний таймер в качестве триггера - это тот же внешний триггер в этом контексте. Имеется в виду внешний по отношению к АЦП.

Share this post


Link to post
Share on other sites
а для серии F7 также такое набдюдается?

Я ж в первом сообщении про это писал: "...в более старших моделях есть специальные биты ADCDC1/ADCxDC2 которые позволяют эту проблему пофиксить и оставить префетчер включенным". Подробности смотрите в AN4073.

На практике об F7 ничего сказать не могу, т.к. задач требующих очень малые шумы АЦП на F7 не попадалось.

Edited by Шаманъ

Share this post


Link to post
Share on other sites
Вы слишком оптимистичны в этом направлении. Когда мне нужно было обеспечить 2,5МГц дискретизацию, я перешел на double mode.

 

Попробовал double mode для АЦП. Частота дискретизации отдельного АЦП уменшылась соответственно вдвое и стала равной 1024000 выб/с, однако на шумы это никак не повлияло, что характер, что уровень не изменился. Отключение буфера предвыборки не сильно помогает.

. В качестве эксперимента также запускал в triple mode АЦП, по этом шумы как были так и остались, а вот чувствительность АЦП к слабым сигналам (менее 2 мВ) упала примерно в четверо, как будто АЦП стало 10 битным.

. Далее буду пробовать все сделать на STM32F7

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this