Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Настройка ADC в stm32
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
baralgin
Помогите настроить АЦП на такой режим: по таймеру запускается сканирование группы каналов, по окончании сканирования всей группы генерируется прерывание и начинается обработка данных.

Насколько я понял, нужно использовать dma, чтобы он перегонял каждый новый результат в мой массив? В каком режиме должен работать АЦП: single, continuous, scan или ... ? 



ps: библиотекой очень не хочется пользоваться, а в RM0008 - не всё кристально ясно.
baralgin
Несколько нервных дней и всё заработало:
1) Timer. Тут вышла основная проблема: не так просто оказалось запускать преобразование от внешнего источника(событий таймера). Пробовал с событием TIM1_CC1. Событие есть, а преобразование не стартует. В примере из библиотеки (недокументированно) проводится дополнительное шаманство с PWM-ом. На форуме st проблема встречается - народ тоже нервничает. В итоге использую событие TIM3_TRGO - заработало без плясок.
2) DMA. Режим(mode) Circular . Включаем прерывание DMA_IT_TC - это и будет прерывание в котором будем "разгребать" результаты.
3) ADC. Mode_Independent, Scan = en, Continuous = dis, ExternalTrig = T3_TRGO. NbrOfChannel - количество каналов на обработку.
Таймер включать, естественно, после настройки всего вышеперечисленного.

Итого: таймер инициирует запуск конверсии группы каналов, по каждому EOC-событию DMA перегоняет результат в наш массив, и только когда вся группа "оцифрована" имеем одно прерывание. Что и требовалось реализовать. Всем спасибо за участие laughing.gif .
sonycman
Как правильно работать с самокалибровкой АЦП в STM32?
Есть там такая фича.

Из мануала это не совсем понятно, к сожалению.

Пока думаю это делать так:
1. Включаю АЦП битом ADON.
2. Сбрасываю калибровочные регистры установкой бита RSTCAL.
3. Жду сброса бита RSTCAL.
4. Включаю калибровку установкой CAL.
5. Жду сброса CAL.

Вроде так.

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

Однако, тогда непонятно, для чего результаты калибровки по окончанию процесса заносятся в регистр данных:
The calibration codes are stored in the ADC_DR as soon as the calibration phase ends.

Может быть, всё таки надо самому корректировать, используя эти данные?
05.gif
Serj78
Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования.

По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц.
Но и без калибровки при включении- выключении и температурных прогонов результаты на ОДНОМ устройстве идеально повторяемы ( до 0.5 бит - оверсемплинг небольшой).
А на разных процессорах- нет smile.gif
разброс несколько единиц. После калибровки разброс 1-2ед. Тестировал не много устройств, меньше 2-х десятков.
sonycman
Цитата(Serj78 @ Jul 26 2010, 22:44) *
Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования.

Спасибо!
Ну, у меня АЦП большую часть времени выключен, поэтому каждый раз перед измерением его надо включать и калибровать заново.
Ну и сброс регистров калибровки на всякий случай пусть будет smile.gif

Цитата(Serj78 @ Jul 26 2010, 22:44) *
По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц.

В одном из документов по STM32 было написано, что калибровка позволяет устранить offset error и gain error.
Это что-то вроде "ошибки нуля" и "ошибки усиления"?

ЗЫ: почему литиевые батареи CR2032 имеют напряжение не 3 вольта, как написано на упаковке да и на самой батарее, а все 3.3 вольта?
10% отклонение в плюс. Хорошо ещё, что не в минус smile.gif
Serj78
Я мерял тестовые напряжения 3000мв , 1500мв и 250мв. Получал их делителями от 4096мв опорника. В качестве измерительного прибора был тестер показывающий 0.1мв до 4 в. Тестер проверялся на точном вольтметре, проходящем поверку. Меня, собственно, интересовала природа калибровки.

Без калибровки центральное значение смещено на 10-15 ед, 250мв- на 2-3 ед, а вот 3000мв- иногда в +5 ед, иногда точно!
но проверял это только на 3-х кристаллах... Опорник АЦП везде был 3.3в, немного гулял (2-3мв).

Про батарейки-
3.3 вольта- потому что свежие smile.gif
1.5 вольтовые батарейки тоже 1. 63в имеют когда новые smile.gif

Также, вроде в RM указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще.
sonycman
Цитата(Serj78 @ Jul 27 2010, 20:48) *
Также, вроде в RM указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще.

А я понял, что после включения питания АЦП, а не контроллера.

Так как при сброшенном бите ADON АЦП пребывает в режиме power down, и не потребляет практически ничего.
После установки ADON получаем режим power up, требуется пауза в 1 мкс для запуска аналоговых цепей.

У меня АЦП обычно отключен, поэтому делаю калибровку каждый раз после установки ADON.

Хотя можно её и пропустить, потому что не требуется большой точности.

ЗЫ: спящие режимы было бы интересно потестить, мне надо снизить потребление девайса в отключке до минимума, чтобы не грелся радиатор линейника.
На данный момент STM32 уже радует - на 72 МГц со всеми включенными SPI, I2C и большинством таймеров потребляет всего 30 ма.
Несколько снизив частоту и задействовав спячку, думаю, можно добиться потребления меньше 10 ма.

Но немного поэкспериментировав с WFE получил не очень понятные результаты.

Может быть, кто нибудь может привести пример\описание входа\выхода в\из sleep\stop mode через WFE\WFI?
Serj78
Да, включения АЦП.
Просто у меня АЦП включен все время, жрет он не много и я его не выключаю.
По старту включил- откалибровался и не выключается.
Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше.
sonycman
Цитата(Serj78 @ Jul 29 2010, 22:53) *
Да, включения АЦП.
Просто у меня АЦП включен все время, жрет он не много и я его не выключаю.
По старту включил- откалибровался и не выключается.
Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше.

АЦП жрёт почти 2 ма. Потягаться с ним могут только таймеры.
Конечно, если не стоит задача снижения потребления - можно и не париться smile.gif
Haamu
В АЦП настроена последовательность из трех каналов, старт измерения по событию переполнения таймера, складывается через DMA в память. После всех настроек запускаю сначало DMA, а потом таймер. Поидее до запуска таймера никаких измерений не должно происходить, но почему-то сразу после запуска DMA в памяти появляется первое измерение и счетчик DMA уменьшается на единицу. В какой последовательности что надо запускать, чтобы такого не происходило?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.