Adc sensor что это

Документация

Смещение ADC датчика тока и калибровка датчика положений

Этот раздел посвящен калибровке смещения аналого-цифрового контроллера (ADC) и датчика положения.

Калибровка смещения ADC датчика тока

В инверторе создание условий сигнала для датчика тока вводит напряжение смещения во входе ADC, чтобы измерить и положительный и отрицательный ток. Это значение смещения отличается для каждого целевого компьютера, потому что это зависит от допусков компонентов в сигнале распознающаяся и обусловливающая схема. Рекомендуется, чтобы вы измерили смещение ADC датчика тока для целевого компьютера. Смещение ADC датчика тока представлено в отсчетах ADC, которые соответствуют нулевому значению тока.

Смотрите Запуск в качестве примера 3-фазовые электродвигатели переменного тока в Регулировании без обратной связи и Калибруйте Смещение ADC, чтобы вручную измерить значение смещения ADC. В примерах Motor Control Blockset™ обновите измеренное значение в inverter.CtSensAOffset и inverter.CtSensBOffset переменные в скрипте инициализации модели. По умолчанию скрипт обновляет inverter.CtSensAOffset и inverter.CtSensBOffset переменные со значениями по умолчанию.

Примечание

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

Калибровка смещения датчика положений для квадратурного датчика энкодера и Холла

Контроллер требует, чтобы расчет смещения датчика положений определил точную обратную связь в реальном времени положения ротора и реализовал алгоритм Ориентированного на поле управления (FOC) правильно. Рекомендуется, чтобы вы использовали примеры для калибровки смещения, чтобы вычислить смещение положения прежде, чем запустить любой другой пример, который использует FOC.

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

При помощи этого алгоритма калибровочные примеры смещения обнаруживают смещение положения этим способом:

Проверяйте, находится ли двигатель в условии без загрузок.

Измерьте положение обратной связи доступного датчика положений (Холл или квадратурный энкодер).

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

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

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Этот рисунок показывает сравнение положения разомкнутого контура от алгоритма управления наряду с фактическим положением двигателя. Рисунок также показывает обратную связь от датчика положений. Смещение положения, которое является различием между положением разомкнутого контура и положением обратной связи от датчика, вычисляется алгоритмом, предоставленным в калибровочных моделях смещения.

Обновите измеренное смещение в pmsm.PositionOffset переменная в скрипте инициализации модели примеров.

Для оценки параметра обновите измеренное смещение Холла в поле Hall Offset mcb_param_est_host_read модель.

Примечание

Калибровка Смещения Холла для Моторного примера PMSM выводит электрическое смещение положения. Принимая во внимание, что, Квадратурная Калибровка Смещения Энкодера для Моторного примера PMSM выводит механическое смещение положения.

Для шагов, чтобы вычислить смещения, смотрите эти примеры:

Источник

ADC (перевод из книги Mastering STM32)

Наконец я взялся и закончил новый перевод из книги Mastering STM32, на этот раз я взялся за главу про АЦП (ADC). Остальные мои переводы, можно также найти в блоге. Глава большая, так что пост длинный, поэтому вот вам содержание.

Содержание

12. Аналого-цифровое преобразование

Наличие аналоговой периферии в микроконтроллерах является общепринятой практикой. В цифровую эпоху все еще очень много устройств, работающих с аналоговыми сигналами: датчики, потенциометры, преобразователи и аудио периферия — вот несколько примеров аналоговых устройств, которые вырабатывают переменное напряжение, которое, обычно, находится в определенном фиксированном интервале значений. Считывая данное напряжение, мы можем конвертировать его в числовое представление, которое может быть обработано прошивкой нашего микроконтроллера. К примеру, TMP36 довольно популярный датчик температуры, который генерирует напряжение, пропорциональное напряжению питания и температуре окружающей среды.

Все микроконтроллеры STM32 имеют в своем составе хотя бы один аналого-цифровой преобразователь (АЦП), который может получать несколько входных напряжений через специально предназначенные входа и конвертировать их в числовое представление. Данное входное напряжение сравнивается с хорошо известным фиксированным напряжением, известным как опорное напряжение или reference voltage, в англоязычной литературе. Опорное напряжение может либо браться из VDDA, либо, в микроконтроллерах с большим количеством выводов, для этого есть отдельный вывод VREF+, к которому можно подвести внешнее опорное напряжение от источника опорного напряжения. В большинстве микроконтроллеров STM32 представлен 12-битный АЦП. Некоторые имеют 16-битный АЦП, например из семейства STM32F3.

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

Прежде чем начать рассмотрение функционала АЦП в STM32 и, связанный с ним API CubeHAL, было бы неплохо сделать небольшое введение в то, как данная периферия работает.

12.1 Введение в АЦП последовательного приближения SAR ADC

Почти во всех микроконтроллерах STM32, АЦП выполнено по схеме 12-битного АЦП последовательного приближения (на момент написания данной книги появилось семейство STM32F37x, в котором представлен более прецизионный 16-битный сигма-дельта АЦП. В данной книге он не рассматривается. Тем не менее, функции HAL, используемые в данном случае, имеют такую же организацию). В зависимости от типа и используемого корпуса, микроконтроллер может иметь различное количество мультиплексированных входных каналов (обычно более 10 в большинстве МК), позволяющих измерять сигналы от внешних источников. Кроме того, доступны также несколько внутренних каналов: канал внутреннего температурного сенсора (Vsense), канал для внутреннего опорного напряжения (Vrefint), канал для мониторинга внешнего напряжения питания батареи (Vbat) и в некоторых случаях канал для мониторинга напряжения питания LCD в микроконтроллерах с интерфейсом подключения монохромного ЖК-дисплея (например, STM32L053 один из таких). Более того, АЦП, реализованный в STM32F3 и большинстве микроконтроллеров STM32L4, также может похвастаться поддержкой полностью дифференциальных входов. В Таблице 1 представлен полный список по количеству периферии АЦП и источникам входных сигналов всех микроконтроллеров STM32, которые имеются в составе 16 плат Nucleo, рассматриваемых в данной книге.

Преобразование различных каналов может выполняться в одноканальном (single), многоканальном (scan), непрерывном (continuous) или прерывистом (discontinuous) режимах. Результат работы АЦП записывается в 16-битный регистр данных с левым или правым выравниванием. Кроме того, АЦП также может работать в качестве аналогового сторожевого таймера, который позволяет приложению определять момент, когда входное напряжение выходит за рамки определенного пользователем, в случае, если это происходит, генерируется прерывание.

На Рисунке 1 показана блок-схема структуры АЦП. Блок выбора канала и контроля сканирования выполняет выборку источника входного напряжения для АЦП. В зависимости от режима преобразования (single, scan или continuous), этот блок автоматически переключает входные каналы, так что каждый из них может быть считан с определенным периодом. Выход данного блока подключен к АЦП.

На Рисунке 1 также можно увидеть еще один важный блок АЦП: блок контроля запуска и остановки. Его роль заключается в контроле процесса АЦП, он может переключаться как программно, так и по событиям от некоторых входных источников. Кроме того, внутренне он подключен к линии TRGO нескольких таймеров, поэтому может использовать преобразования по таймеру в режиме DMA. Мы рассмотрим этот важный режим немного позже.

Рисунок 2 иллюстрирует основные блоки, формирующие SAR ADC блок из Рисунка 1. На Рисунке 1 можно было заметить коммутатор и конденсатор последовательно со входом АЦП. Данный узел представлен на Рисунке 2 как блок Выборки и хранения (Sample-and-Hold SHA), который присутствует во всех АЦП. Этот узел играет важную роль в сохранении входного сигнала неизменным на время всего цикла преобразования. Благодаря внутреннему блоку таймингов, который регулируется настраиваемым тактированием, как мы увидим позднее, АЦП непрерывно подключает/отключает источник сигнала путем открытия/закрытия коммутатора с Рисунка 1. Для сохранения уровня напряжения входа постоянным SHA узел выполняется в связке с конденсатором: это гарантирует некоторое постоянное значение входного сигнала на время аналого-цифрового преобразования, которое зависит от выбранного периода преобразования.

Выход блока выборки и хранения (SHA) подключен к компаратору, который сравнивает его с другим сигналом, источником которого является внутренний цифро-аналоговый преобразователь (DAC). Результат сравнения отправляется в блок Логики (Logic unit), который вычисляет числовое представление входного сигнала в соответствии с хорошо-известным алгоритмом. Этот алгоритм это то, что отличает АЦП последовательного приближения (SAR) от других аналого-цифровых преобразователей.

Алгоритм последовательного приближения вычисляет напряжение входного сигнала путем его сравнения с генерируемым от внутреннего ЦАП: если входной сигнал больше, чем это внутреннее опорное напряжение, то происходит дальнейшее увеличение этого опорного напряжения пока входной сигнал не станет меньше него. Окончательный результат соотносится с числовым представлением в пределах от нуля до максимального значения 12 битного целого беззнакового числа, т.е. 2 12 − 1 = 4095. При условии, что VREF = 3300мВ, мы получаем, что 3300мВ представляется числом 4095. Это означает что 1 единица АЦП равно 3300/4095 = 0.8мВ. Для примера, пусть входной сигнал равен 2.5В, тогда он будет преобразован:

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Алгоритм SAR работает следующим образом:

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Текущее значение VIN больше, чем 1760мВ, следовательно 4 бит остается равным 1 и алгоритм переходит к следующему MSB биту. Теперь значение в регистре данных равно 11002 = 1210 и ЦАП генерирует напряжение равное 2640 мВ. Текущее значение VIN все еще больше опорного и следовательно 3 бит также остается равным 1. Регистр устанавливается в значение 11102 = 1410, которое соответствует опорному напряжению 3080мВ. Теперь VIN меньше опорного напряжения и второй бит сбрасывается в 0. Теперь алгоритм установит в 1 первый бит, который установит значение опорного напряжения равным 2860мВ. Это значение все еще больше, чем VIN и алгоритм сбросит и этот бит в 0. Очевидно, что чем выше разрядность АЦП, тем более близкое значение к VIN может быть получено после преобразования.

Как вы можете видеть, алгоритм последовательного приближения по сути осуществляет поиск в бинарном дереве. Большое преимущество этого алгоритма в том, что преобразование выполняется за N циклов, где N зависит от разрядности АЦП. Таким образом 12-битный АЦП нуждается в 12 циклах для осуществления преобразования. Но как долго может продолжаться цикл? Количество циклов в секунду это частота АЦП, параметр, по которому оценивается его производительность. SAR АЦП может быть реально очень быстрым, особенно, если уменьшена разрядность АЦП (меньше выборок соответствует меньшему количеству циклов на одно преобразование). Однако, импеданс аналогового источника сигнала или последовательного сопротивления RIN между источником сигнала и выводом микроконтроллера, является причиной падения напряжения на нем из-за тока протекающего по этой цепи.

Заряд внутреннего конденсатора в цепи СADC контролируется коммутатором на Рисунке 1, который имеет сопротивление, равное RADC. С дополнительным сопротивлением источника (RTOT = RADC + RIN) время, необходимое для полной зарядки конденсатора увеличивается. На Рисунке 4 показан эффект сопротивления аналогового источника сигнала. На эффективный заряд емкости СADC влияет RTOT, таким образом постоянная времени заряда конденсатора tC = (RADC + RIN) * СADC. Если время выборки меньше, чем время, необходимое для полной зарядки конденсатора СADC через сопротивление RTOT, цифровое значение, получаемое в результате преобразования будет меньше, нежели актуальное значение. В общем, необходимо выжидать время tC для получения приемлемой точности измерения.

Для высокой скорости преобразования важно принимать в расчет эффекты, вносимые печатной платой устройства и правильность развязки цепей питания в процессе проектирования платы. ST предоставляет отлично написанный appnote, который предлагает несколько важных техник для получения наилучшей производительности от встроенных АЦП микроконтроллеров STM32.

12.2 Модуль HAL_ADC

После короткого введения в наиболее важные возможности, предлагаемые периферией АЦП в микроконтроллерах STM32, самое время погрузиться в соответствующий CubeHAL API.

Давайте проанализируем наиболее важные поля данной структуры:

Давайте проанализируем наиболее значимые поля этой структуры.

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

12.2.1 Режимы преобразования

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

12.2.1.1 Один канал, однократный режим преобразования

Это самый простой режим работы АЦП. В этом режиме, АЦП осуществляет одно преобразование (одна выборка) одного канала, как показано на Рисунке 5, и завершает свою работу, когда преобразование завершено.

12.2.1.2 Несколько каналов, однократный режим преобразования

Этот режим также называют многоканальным в документации ST, используется для получения по одной выборке с каждого канала в независимом режиме. Используя rank каждого канала, можно задать любую последовательность до 16 каналов АЦП с различным временем преобразования и различной очередности. Для примера, вы можете выполнить последовательность преобразований, показанную на Рисунке 6. В данном случае, вы не можете остановить АЦП во время процесса преобразования для того, чтобы изменить время преобразования следующего канала. Этот режим дополнительно нагружает процессорное ядро и сложен программно. Режим сканирования лучше осуществлять в режиме DMA.

Для примера, этот режим может использоваться при запуске системы, зависящей от некоторых параметров таких как положение пальца руки в системе механизированного манипулятора. В этом случае, вам необходимо прочитать позицию каждого сочленения в этом манипуляторе при подаче питания для определения координаты расположения пальца руки. Этот режим также может использоваться для измерения нескольких уровней сигналов (напряжение, давление, температура и т.д.) для принятия решения о запуске системы или не запуске, если это поможет защитить людей и оборудование.

12.2.1.3 Один канал, режим непрерывного преобразования

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

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

12.2.1.4 Режим непрерывного преобразования нескольких каналов

Этот режим также называют многоканальным непрерывным режимом и он может использоваться для преобразования нескольких каналов в независимом режиме. Используя индексы каналов rank, вам доступна настройка любой последовательности из 16 каналов с различным временем выборок и очередностью преобразования. Этот режим похож на простой многоканальный режим с той лишь разницей, что преобразование не останавливается после преобразования последнего канала в последовательности регулярных каналов, а начинается по новой с самого первого канала и продолжается этот цикл бесконечно долго. В этом режиме также доступен DMA.

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

12.2.1.5 Режим преобразования инжектированных каналов

Этот режим предназначен для использования в режиме запуска преобразования по внешнему событию или программно. Группа инжектированных каналов имеет более высокий приоритет нежели группа регулярных каналов. Ее преобразование может прервать преобразование текущего канала в группе регулярных каналов.

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

12.2.1.6 Сдвоенные режимы

Сдвоенный режим доступен в STM32 как функция двух АЦП: ADC1 в качестве master и ADC2 slave. Триггеры ADC1 и ADC2 синхронизируются внутри для преобразований регулярных и инжектированных каналов. Оба АЦП работают вместе. В некоторых микроконтроллерах имеется до 3х АЦП: ADC1, ADC2 и ADC3. В этом случае ADC3 всегда работает независимо и не синхронизируется ни каким способом с другими АЦП.

Во время работы сдвоенного режима, когда завершается преобразование, его результат одновременно сохраняется от обоих АЦП ADC1 и ADC2 в 32-битном регистре данных ADC1. Разделение результатов позволяет нам получать данные от двух отдельных каналов в одно время.

Для более подробной информации можно обратиться к AppNote от ST AN3116.

12.2.2 Выбор канала

В зависимости от семейства STM32 и используемого корпуса, АЦП в микроконтроллерах STM32 могут преобразовывать сигналы от различного числа каналов. В семействах F0 и L0 расположение каналов фиксированное: первый всегда IN0, второй — IN1 и так далее. Пользователь лишь может принимать решение использовать или нет тот или иной канал. Это означает, что в режиме сканирования или многоканальном по другому, первым будет считан всегда канал IN0, вторым IN1 и так далее. Тогда как в других микроконтроллерах STM32 предлагается идея групп каналов. Группа содержит последовательность преобразований для любых каналов и в любой очередности. В то время как входные каналы фиксированы и привязаны к конкретным выводам микроконтроллера (IN0, IN1 и т.д.), в то же самое время они могут быть логически переназначены на любую очередность выборок. Переназначение каналов реализовано путем назначения каждому каналу индекса в диапазоне от 1 до 16. Этот индекс называется rank в CubeHAL и соответствует очередности преобразования канала в последовательности регулярных каналов.

Рисунок 10 демонстрирует данный принцип. Несмотря на то, что канал IN4 фиксирован (здесь он соответствует выводу PA4 микроконтроллера STM32F401RE), он может быть логически назначен индексу rank 1 и станет первым каналом, из которого будут браться выборки. Микроконтроллеры, предлагающие данный функционал, также позволяют выбрать частоту выборок АЦП для каждого канала индивидуально, за исключением микроконтроллеров F0/L0, где конфигурация работает на весь АЦП в целом.

Существует две группы для каждого АЦП:

12.2.3 Разрядность АЦП и скорость преобразования

Можно выполнить преобразования быстрее, если уменьшить разрядность АЦП (это справедливо для все микроконтроллеров STM32, кроме STM32F1). Время одной выборки, по существу, определяется фиксированным числом циклов (всегда 3) плюс переменным числом циклов, которое зависит от разрядности АЦП. Минимальное время преобразования для каждой из разрядностей выглядит следующим образом:

6 = 9 циклов ADCCLK

Уменьшая разрядность, возможно увеличить максимальное число выборок в секунду, которое в некоторых микроконтроллерах STM32 может достигать 15Msps. Помните, что ADCCLK производно от тактирования периферии: это означает, что SYSCLK и PCLK сильно влияют на число выборок в секунду.

12.2.4 Аналого-цифровое преобразование в режиме опроса

Как и большинство периферии STM32, АЦП может работать в трех режимах: опрос, прерывание и режим DMA. Как мы увидим позднее, последним режимом можно управлять с помощью таймера, чтобы обеспечить регулярный интервал преобразований. Это очень полезно, если нам нужно получать выборки сигнала с фиксированной частотой, как скажем в приложениях, обрабатывающих звук.

В режиме опроса мы будем использовать функцию

Чтобы получить результат преобразования необходимо использовать функцию

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

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

В Таблице 3 показаны характеристики температурного сенсора в микроконтроллере STM32F401RE. У него типовая погрешность измерения параметра 1°C и наклон линейной характеристики 2.5мВ/°C. Также известно, что при 25°C падение напряжения равно 760мВ. Это означает, что для вычисления измеряемой температуры мы можем использовать формулу:

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

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

Строки [66:68] настраивают канал температурного сенсора и назначают ему индекс очередности rank 1: даже если мы не используем многоканальный режим преобразования, нам необходимо определить этот индекс для используемого канала. Время одной выборки устанавливается в 480 циклов: это означает то, что с учетом частоты тактирования 84МГц, ADCCLK, которая равна половине PCLK, мы получим время одной выборки АЦП, равное 10 мкс (ADCCLK = 48МГц, выполняет 48 циклов каждую 1 мкс, таким образом 480 циклов, деленные на 48 циклов/мкс дают нам 10 мкс).

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

В этой же таблице можно найти другой интересный параметр: время запуска температурного сенсора (это время, необходимое для стабилизации выходного напряжения включенного сенсора), которое находится в пределах от 6 до 10 мкс. Тем не менее, нам не нужно беспокоиться о данном аспекте, т.к. функция HAL_ADC_ConfigChannel() реализована для корректного запуска преобразования значения температурного сенсора. Это означает, что функция автоматически осуществляет задержку в 10 мкс, чтобы дать установиться рабочему режиму сенсора.

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

HAL_ADC модуль в CubeF1 HAL незначительно отличается от других. Для начала преобразования программным запуском рекомендуется настроить параметр hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START во время инициализации АЦП. Это совершенно отличается от того, что нужно делать в других HAL и не ясно почему разработчики ST оставили такое поведение. Более того, CubeMX предлагает различную конфигурацию данного специфичного момента в процессе генерации соответствующего кода инициализации, рассмотрим данный момент в конце главы.

12.2.5 Аналого-цифровое преобразование в режиме прерывания

Следующий пример показывает как выполнить преобразование в режиме прерывания. Код инициализации АЦП точно такой же как и в предыдущем примере.

12.2.6 Аналого-цифровое преобразование в режиме DMA

Наиболее интересный режим работы АЦП это в связке с DMA. Он позволяет производить преобразования без участия ядра микроконтроллера и, используя DMA в циклическом режиме, таким образом, что мы получим непрерывное преобразование последовательности каналов АЦП. Более того, как мы увидим далее по мере изучения, этот режим идеален для использования АЦП, запускаемого от таймера, что позволяет осуществлять преобразования с фиксированной частотой выборок. Также важно использовать DMA, когда нам необходимо осуществлять преобразования нескольких каналов в непрерывном режиме.

Для осуществления преобразования в режиме работы с DMA необходимо выполнить некоторый набор процедур, описанных ниже:

Следующий пример, разработанный для запуска на микроконтроллере STM32F401RE, показывает однократное преобразование нескольких каналов с использованием DMA. Рассмотрим настройку периферии и DMA контроллера для начала.

Функция MX_ADC1_Init() настраивает АЦП на однократное преобразование трех входных каналов. ADCCLK устанавливается в минимальное значение, установкой делителя (строка 56), и включается режим сканирования нескольких каналов (строка 58). Как можно заметить, АЦП сконфигурирован так, чтобы выполнять преобразование сигнала внутреннего температурного сенсора: это не очень практично, но к сожалению, платы Nucleo не предоставляют никакой другой аналоговой периферии для практики.

12.2.6.1 Несколько преобразований одного канала в режиме работы с DMA

Для получения заданного количества преобразований одного и того же канала (или последовательности каналов) в режиме DMA необходимо произвести следующие шаги:

12.2.6.2 Многократное не непрерывное преобразование в режиме DMA

Для выполнения многократного преобразования в режиме DMA проделайте следующее:

12.2.6.3 Непрерывное преобразование в режиме DMA

Для обеспечения этого алгоритма работы следуйте следующим шагам:

12.2.7 Обработка ошибок

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

Данную ошибку переполнения можно перехватить, определив в своей программе следующую функцию обратного вызова:

При возникновении ошибки переполнения DMA отключается и запросы более не доступны. Если запрос DMA был в процессе, преобразование обрывается и дальнейшие триггеры запуска игнорируются. В таком случае необходимо очистить флаг OVR и бит DMAEN используемого DMA потока, переинициализировать как DMA, так и ADC, задав верное расположение в памяти для передачи через DMA (все эти действия выполняются автоматически, когда вы вызываете функцию HAL_ADC_Start_DMA() ).

Можно просимулировать ошибку переполнения регистра данных, используя код предыдущего примера и установив в ENABLE hadc.Init.DMAContinuousRequests : если прерывание от АЦП разрешено и HAL_ADC_IRQHandler() вызывается из него, то вы сможете поймать данное событие переполнения (в некоторых микроконтроллерах также необходимо явно разрешить детекцию переполнения установкой поля hadc.Init.Overrun в значение ADC_OVR_DATA_OVERWRITTEN ).

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Ошибка переполнения не всегда связана с ошибочной конфигурацией интерфейса. Она может возникнуть когда АЦП работает в непрерывном режиме работы DMA. Для одного заказного устройства, которое автор делал на базе микроконтроллера STM32F4, DMA был сильно нагружен несколькими периферийными блоками и ошибка переполнения регистра данных АЦП возникала всякий раз, когда происходила конкурентная транзакция DMA. Даже когда установлены верные приоритеты транзакций автор столкнулся с данной проблемой в нескольких трудно-возспроизводимых ситуациях. Для корректной обработки этой ошибки необходимо перезапустить преобразование при ее возникновении. Не лишним будет сказать, что прежде, чем автор нашел в чем проблема, ему понадобилось потратить несколько дней на отладку данной ошибки.

12.2.8 Преобразования, управляемые таймером

АЦП может быть настроен для запуска по таймеру через линию TRGO таймера. Таймер, который позволяет проводить подобную операцию, специально спроектирован разработчиками микросхемы. Для примера, в микроконтроллерах STM32F401RE ADC1 может быть синхронизирован таймером TIM2. Это функция чрезвычайно полезна для реализации преобразований с заданной частотой выборок. К примеру, нам необходимо оцифровать аудиосигнал с микрофонам с частотой 20 кГц с сохранением результирующих данных в постоянную память.

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

Следующий пример показывает запуск преобразования каждую секунду в микроконтроллере STM32F401RE, используя таймер TIM2.

Код действительно просто для понимания. Функция MX_TIM2_Init() насраивает таймер TIM2 так, что он переполняется каждые 1 секунду. Кроме того, таймер настроен так, что линия TRGO изменяет состояние при переполнении (строка 95). АЦП же настроен на выполнение трех преобразований одного канала (канала температурного сенсора). Также он настроен таким образом чтобы запускаться от линии TRGO таймера TIM2 (строки [65:66]). Наконец, таймер запускается в строке 29 и АЦП запускается также в режиме DMA на выполнение 3 выборок из регистра данных DMA. Также DMA сконфигурирован в циклическом режиме. Если вы запустите пример, то сможете увидеть, что каждую третью секунду DMA завершает передачу и флаг convCompleted устанавливается в 1: это означает, что 3 выборки были отправлены в UART2.

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Владельцы плат Nucleo на базе микроконтроллера STM32F410RB могут найти незначительно отличающийся пример. Это потому, что данные микроконтроллеры не могут запускать преобразование по событию обновления таймера, а только по событию Capture Compare Event. По этой причине таймер запускается в данном режиме, как описано в Главе 11.

12.2.9 Преобразования, управляемые внешними событиями

В некоторых микроконтроллерах STM32 есть возможность настроить линии внешних прерываний EXTI так, чтобы изменения на них запускали преобразования АЦП. Для примера, в STM32F401RE для этого может быть использована линия EXTI11. Это означает, что любой вывод, подключенный к этой линии (PA11, PB11 и т.д.) может являться источником запуска преобразования ADC. Также стоит иметь в виду, что использовать события запуска EXTI и таймера невозможно в одно и то же время.

12.2.10 Калибровка АЦП

АЦП, реализованные в некоторых микроконтроллерах STM32, таких как STM32L4 и STM32F3, обеспечивают процедуру автоматической калибровки, которая управляет всей последовательностью калибровки, включая последовательность включения / выключения АЦП. Во время этого процесса АЦП рассчитывает коэффициент калибровки, размерностью 7 бит и записывает его в настройки АЦП до следующего отключения. В течение данной процедуры приложение не должно использовать АЦП, ожидая завершения калибровки. Калибровка предваряет любые операции с АЦП. Она убирает ошибку смещения, которая может варьироваться от микросхемы к микросхеме из-за изменения процесса или запрещенной зоны. Коэффициент калибровки для несимметричных входов отличается от коэффициента для дифференциальных входов.

Модель HAL_ADC_Ex предоставляет 3 функции, которые используются для калибровки АЦП. Первая

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

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

12.3 Использование CubeMX для конфигурации АЦП

CubeMX позволяет настроить АЦП периферию в несколько простых шагов. Первым нужно включить необходимые каналы АЦП в дереве компонентов периферии, как показано на Рисунке 11.

После того как каналы выбраны, можно приступать к настройке во вкладке Configuration, как на Рисунке 12.

Поля отражают настройки АЦП, рассмотренные до сих пор. Есть только одна часть, которая может сбить с толку начинающих пользователей: способ настройки каналов. Сперва необходимо установить количество каналов в поле Number of Conversion. После чего (и это очень важно) нужно кликнуть в любом месте диалогового окна, так чтобы количество полей Rank увеличилось соразмерно количеству установленных каналов. В тех микроконтроллерах, которые имеют как регулярные, так и инжектированные группы, мы можем выбрать время выборки для каждого канала независимо. CubeMX генерирует весь код инициализации автоматически.

Adc sensor что это. Смотреть фото Adc sensor что это. Смотреть картинку Adc sensor что это. Картинка про Adc sensor что это. Фото Adc sensor что это

Как уже говорилось ранее в этой главе, модуль HAL_ADC в CubeF1 отличается от других. Чтобы запускать преобразования программно необходимо установить параметр hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START в процессе инициализации. CubeMX отражает эти различия в конфигурации, но довольно проблематично понять как сконфигурировать эту периферию правильным способом. Для этого нужно параметр External Trigger Conversion Edge установить в Trigger detection on the rising edge. Это делает поле External Trigger Conversion Source доступным для настройки и уже в нем выбираем Software trigger. В противном случае преобразования не могут быть произведены.

Я очень стараюсь над данным циклом переводов и, если вам несложно, поделитесь этой статьей с другими и подписывайтесь на мой канал в telegram, где я публикую анонсы новых статей и много другой информации.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *