baralgin 0 13 октября, 2009 Опубликовано 13 октября, 2009 · Жалоба Помогите настроить АЦП на такой режим: по таймеру запускается сканирование группы каналов, по окончании сканирования всей группы генерируется прерывание и начинается обработка данных. Насколько я понял, нужно использовать dma, чтобы он перегонял каждый новый результат в мой массив? В каком режиме должен работать АЦП: single, continuous, scan или ... ? ps: библиотекой очень не хочется пользоваться, а в RM0008 - не всё кристально ясно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
baralgin 0 16 октября, 2009 Опубликовано 16 октября, 2009 · Жалоба Несколько нервных дней и всё заработало: 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: . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Как правильно работать с самокалибровкой АЦП в 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 26 июля, 2010 Опубликовано 26 июля, 2010 · Жалоба Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования. По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц. Но и без калибровки при включении- выключении и температурных прогонов результаты на ОДНОМ устройстве идеально повторяемы ( до 0.5 бит - оверсемплинг небольшой). А на разных процессорах- нет :) разброс несколько единиц. После калибровки разброс 1-2ед. Тестировал не много устройств, меньше 2-х десятков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 27 июля, 2010 Опубликовано 27 июля, 2010 · Жалоба Я делал практически так же., только калибровочные биты не сбрасывал - они по умолчанию сброшены. Калибровал до включения преобразования. Спасибо! Ну, у меня АЦП большую часть времени выключен, поэтому каждый раз перед измерением его надо включать и калибровать заново. Ну и сброс регистров калибровки на всякий случай пусть будет :) По измерениям от внешнего опорника- после калибровки изменяется линейность по краям, из- за него ползет центральное значение на пару десятков единиц. В одном из документов по STM32 было написано, что калибровка позволяет устранить offset error и gain error. Это что-то вроде "ошибки нуля" и "ошибки усиления"? ЗЫ: почему литиевые батареи CR2032 имеют напряжение не 3 вольта, как написано на упаковке да и на самой батарее, а все 3.3 вольта? 10% отклонение в плюс. Хорошо ещё, что не в минус :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 27 июля, 2010 Опубликовано 27 июля, 2010 · Жалоба Я мерял тестовые напряжения 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 указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 28 июля, 2010 Опубликовано 28 июля, 2010 · Жалоба Также, вроде в RM указано что ацп надо калибровать после включения питания. Если питание не отключается, вроде калибровать не надо... На этом можно время сэкономить.. Хотя, я спящие режимы не пробовал еще. А я понял, что после включения питания АЦП, а не контроллера. Так как при сброшенном бите ADON АЦП пребывает в режиме power down, и не потребляет практически ничего. После установки ADON получаем режим power up, требуется пауза в 1 мкс для запуска аналоговых цепей. У меня АЦП обычно отключен, поэтому делаю калибровку каждый раз после установки ADON. Хотя можно её и пропустить, потому что не требуется большой точности. ЗЫ: спящие режимы было бы интересно потестить, мне надо снизить потребление девайса в отключке до минимума, чтобы не грелся радиатор линейника. На данный момент STM32 уже радует - на 72 МГц со всеми включенными SPI, I2C и большинством таймеров потребляет всего 30 ма. Несколько снизив частоту и задействовав спячку, думаю, можно добиться потребления меньше 10 ма. Но немного поэкспериментировав с WFE получил не очень понятные результаты. Может быть, кто нибудь может привести пример\описание входа\выхода в\из sleep\stop mode через WFE\WFI? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serj78 0 29 июля, 2010 Опубликовано 29 июля, 2010 · Жалоба Да, включения АЦП. Просто у меня АЦП включен все время, жрет он не много и я его не выключаю. По старту включил- откалибровался и не выключается. Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 29 июля, 2010 Опубликовано 29 июля, 2010 · Жалоба Да, включения АЦП. Просто у меня АЦП включен все время, жрет он не много и я его не выключаю. По старту включил- откалибровался и не выключается. Мне и голову не приходило принудительно его выключать- (только при спящих режимах разве что). Ибо ядро жрет на порядок больше. АЦП жрёт почти 2 ма. Потягаться с ним могут только таймеры. Конечно, если не стоит задача снижения потребления - можно и не париться :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Haamu 0 8 июля, 2014 Опубликовано 8 июля, 2014 · Жалоба В АЦП настроена последовательность из трех каналов, старт измерения по событию переполнения таймера, складывается через DMA в память. После всех настроек запускаю сначало DMA, а потом таймер. Поидее до запуска таймера никаких измерений не должно происходить, но почему-то сразу после запуска DMA в памяти появляется первое измерение и счетчик DMA уменьшается на единицу. В какой последовательности что надо запускать, чтобы такого не происходило? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться