|
|
  |
Настройка ADC в stm32 |
|
|
|
Oct 16 2009, 13:36
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Несколько нервных дней и всё заработало: 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 перегоняет результат в наш массив, и только когда вся группа "оцифрована" имеем одно прерывание. Что и требовалось реализовать. Всем спасибо за участие  .
|
|
|
|
|
Jul 26 2010, 18:00
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Как правильно работать с самокалибровкой АЦП в 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.Может быть, всё таки надо самому корректировать, используя эти данные?
|
|
|
|
|
Jul 26 2010, 18:44
|

Знающий
   
Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499

|
Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования. По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц. Но и без калибровки при включении- выключении и температурных прогонов результаты на ОДНОМ устройстве идеально повторяемы ( до 0.5 бит - оверсемплинг небольшой). А на разных процессорах- нет разброс несколько единиц. После калибровки разброс 1-2ед. Тестировал не много устройств, меньше 2-х десятков.
|
|
|
|
|
Jul 27 2010, 10:30
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Serj78 @ Jul 26 2010, 22:44)  Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования. Спасибо! Ну, у меня АЦП большую часть времени выключен, поэтому каждый раз перед измерением его надо включать и калибровать заново. Ну и сброс регистров калибровки на всякий случай пусть будет  Цитата(Serj78 @ Jul 26 2010, 22:44)  По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц. В одном из документов по STM32 было написано, что калибровка позволяет устранить offset error и gain error. Это что-то вроде "ошибки нуля" и "ошибки усиления"? ЗЫ: почему литиевые батареи CR2032 имеют напряжение не 3 вольта, как написано на упаковке да и на самой батарее, а все 3.3 вольта? 10% отклонение в плюс. Хорошо ещё, что не в минус
|
|
|
|
|
Jul 27 2010, 16:48
|

Знающий
   
Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499

|
Я мерял тестовые напряжения 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 указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще.
|
|
|
|
|
Jul 28 2010, 10:04
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(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?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|