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

stm32f407, ADC и flash ART prefetcher

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

 

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

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

 

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

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


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

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

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

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


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

Если да, то какой был результат и как он был достигнут (если не секрет)?

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)

 

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


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

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

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


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

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

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

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

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


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

частота дискретизации 2048000 выборок в секунду.

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

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

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

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

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


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

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

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


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

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

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

 

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

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


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

Предел по частоте дискретизации равен 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.

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


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

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

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


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

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

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

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


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

а для серии F7 также такое набдюдается?

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

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

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

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


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

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

 

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

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

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

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


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

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

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

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

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

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

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

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

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

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