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

Настройка ADC в stm32

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

 

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

 

 

 

ps: библиотекой очень не хочется пользоваться, а в RM0008 - не всё кристально ясно.

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


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

Несколько нервных дней и всё заработало:

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: .

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


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

Как правильно работать с самокалибровкой АЦП в 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:

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


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

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

 

По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц.

Но и без калибровки при включении- выключении и температурных прогонов результаты на ОДНОМ устройстве идеально повторяемы ( до 0.5 бит - оверсемплинг небольшой).

А на разных процессорах- нет :)

разброс несколько единиц. После калибровки разброс 1-2ед. Тестировал не много устройств, меньше 2-х десятков.

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


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

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

Спасибо!

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

Ну и сброс регистров калибровки на всякий случай пусть будет :)

 

По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц.

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

Это что-то вроде "ошибки нуля" и "ошибки усиления"?

 

ЗЫ: почему литиевые батареи CR2032 имеют напряжение не 3 вольта, как написано на упаковке да и на самой батарее, а все 3.3 вольта?

10% отклонение в плюс. Хорошо ещё, что не в минус :)

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


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

Я мерял тестовые напряжения 3000мв , 1500мв и 250мв. Получал их делителями от 4096мв опорника. В качестве измерительного прибора был тестер показывающий 0.1мв до 4 в. Тестер проверялся на точном вольтметре, проходящем поверку. Меня, собственно, интересовала природа калибровки.

 

Без калибровки центральное значение смещено на 10-15 ед, 250мв- на 2-3 ед, а вот 3000мв- иногда в +5 ед, иногда точно!

но проверял это только на 3-х кристаллах... Опорник АЦП везде был 3.3в, немного гулял (2-3мв).

 

Про батарейки-

3.3 вольта- потому что свежие :)

1.5 вольтовые батарейки тоже 1. 63в имеют когда новые :)

 

Также, вроде в RM указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще.

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


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

Также, вроде в RM указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще.

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

 

Так как при сброшенном бите ADON АЦП пребывает в режиме power down, и не потребляет практически ничего.

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

 

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

 

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

 

ЗЫ: спящие режимы было бы интересно потестить, мне надо снизить потребление девайса в отключке до минимума, чтобы не грелся радиатор линейника.

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

Несколько снизив частоту и задействовав спячку, думаю, можно добиться потребления меньше 10 ма.

 

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

 

Может быть, кто нибудь может привести пример\описание входа\выхода в\из sleep\stop mode через WFE\WFI?

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


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

Да, включения АЦП.

Просто у меня АЦП включен все время, жрет он не много и я его не выключаю.

По старту включил- откалибровался и не выключается.

Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше.

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


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

Да, включения АЦП.

Просто у меня АЦП включен все время, жрет он не много и я его не выключаю.

По старту включил- откалибровался и не выключается.

Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше.

АЦП жрёт почти 2 ма. Потягаться с ним могут только таймеры.

Конечно, если не стоит задача снижения потребления - можно и не париться :)

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


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

В АЦП настроена последовательность из трех каналов, старт измерения по событию переполнения таймера, складывается через DMA в память. После всех настроек запускаю сначало DMA, а потом таймер. Поидее до запуска таймера никаких измерений не должно происходить, но почему-то сразу после запуска DMA в памяти появляется первое измерение и счетчик DMA уменьшается на единицу. В какой последовательности что надо запускать, чтобы такого не происходило?

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


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

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

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

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

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

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

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

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

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

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