STM Урок 185. LL. STM32F1. ADC. Regular Once. Часть 1



Давно мы не занимались с такой периферией микроконтроллера, как АЦП (Аналого-цифровой преобразователь) или ADC (Analog-to-digital converter). Думаю, сейчас самое время. Тем более, что, изучая возможности библиотеки LL, мы незаслуженно пропустили столь важную часть архитектуры контроллера.

С данной периферией мы раньше работали и исследовали очень немало её возможностей. Но их, во-первых, гораздо больше, чем мы проходили в уроках 16-21, а, во-вторых, мы работали с АЦП с использованием библиотеки HAL.

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

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

В контроллере (а подразумевать я буду конкретно контроллер, с которым мы работаем, а именно STM32F103C8) имеется в наличии два модуля АЦП разрешением 12 бит. Каждый из этих модулей способен работать с 16 каналами внешними и двумя внутренними, из которых на нашем контроллере физически доступны 10, а также 2 внутренних.

Также из характеристик хочется выделить, что каждый модуль АЦП нашего контроллера способен развить скорость до 1 мегасэмпла в секунду (Msps), работать с опорным напряжением от 2,4 до 3,6 вольт, но не превышающем напряжение питания, работать с прерываниями по окончанию преобразований, с преобразованиями регулярными и инжектированными, прерываниями от оконного компаратора, с DMA, с одиночными и непрерывными преобразованиями, в том числе с непрерывными по заранее заданному списку очерёдности сканирования каналов, поддерживает автокалиборовку, может выравнивать результат по правому и левому краю.

Посмотрим структурную схему одного из модулей АЦП

 

 

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

Также хочется отметить, что наши АЦП мы можем настроить для работы в парном режиме.

Также мы можем настроить АЦП в режиме аналогового сторожа (Analog Watchdog).

Ещё мы можем использовать очень много режимов работы АЦП: однократное преобразование канала, длительное преобразование (сканирование не останавливается после преобразования, а начинается заново), автоматическое поочерёдное сканирование нескольких каналов (можно задавать свою очерёдность с помощью списка), многоканальное длительное преобразование, запуск преобразования от внешнего триггера.

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

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

 

Начнём с регистра состояния

 

Теперь побитно.

STRT (Regular channel Start flag): бит запуска регулярного преобразования. Устанавливается аппаратно в 1 при начале регулярного преобразования. Сбрасывается программно

0 — регулярное преобразование не было запущено

1 — регулярное преобразование запущено.

JSTRT (Injected channel Start flag): бит запуска инжектированного преобразования. Устанавливается аппаратно в 1 при начале инжектированного преобразования. Сбрасывается программно

0 — инжектированное преобразование не было запущено

1 — инжектированное преобразование запущено.

JEOC (Injected channel end of conversion): бит окончания инжектированного преобразования. Устанавливается аппаратно в 1 в момент окончания инжектированного преобразования. Сбрасывается программно

0 — инжектированное преобразование не завершено

1 — инжектированное преобразование завершено.

EOC (End of conversion): бит окончания группового преобразования. Устанавливается аппаратно в 1 в момент окончания регулярного или инжектированного преобразования. Сбрасывается программно

0 — групповое преобразование не завершено

1 — групповое преобразование завершено.

AWD (Analog watchdog flag): бит состояния оконного компаратора. Устанавливается аппаратно в 1, когда результат преобразования вышел за нижнюю (ADC_LTR) или верхнюю (ADC_HTR) границу окна компаратора

0 — событие от оконного компаратора не зарегистрировано

1 — произошло событие пересечения верхнего или нижнего порога компаратора.

 

 

Следующий регистр — первый регистр управления

Назначение битов и битовых полей регистра:

AWDEN (Analog watchdog enable on regular channels): бит разрешения подключения оконного компаратора к регулярным каналам. Установка данного бита, также как и его сброс, производятся программно

0 — подключение оконного компаратора запрещено

1 — подключение оконного компаратора разрешено.

JAWDEN (Analog watchdog enable on injected channels): бит разрешения подключения оконного компаратора к инжектированным каналам. Установка данного бита, также как и его сброс, производятся программно

0 — подключение оконного компаратора запрещено

1 — подключение оконного компаратора разрешено.

DUALMOD[3:0] (Dual mode selection): битовое поле режима совместной работы двух АЦП

0000 — независимый режим

0001 — комбинированный регулярный однократный + инжектированный однократный режимы

0010 — комбинированный регулярный однократный + альтернативный триггерный режимы

0011 — комбинированный инжектированный однократный + быстрый режим чередования

0100 — комбинированный инжектированный однократный + медленный режим чередования

0101 — только инжектированный однократный режим

0110 — только регулярный однократный режим

0110 — только быстрый режим чередования

1000 — только медленный режим чередования

1001 — только альтернативный триггерный режим.

DISCNUM[2:0] (Discontinuous mode channel count): количество регулярных каналов в прерывистом режиме

000 — 1 канал

001 — 2 канала

111 — 8 каналов.

JDISCEN (Discontinuous mode on injected channels): бит включения прерывистого (дискретного) режима группы инжектированных каналов

0 — режим выключен

1 — режим включен.

DISCEN (Discontinuous mode on regular channels): бит включения прерывистого (дискретного) режима группы регулярных каналов

0 — режим выключен

1 — режим включен.

JAUTO (Automatic Injected Group conversion): бит включения непрерывного режима группы инжектированных каналов

0 — режим выключен

1 — режим включен.

AWDSGL (Enable the watchdog on a single channel in scan mode): бит включения режима сканирования оконного сторожевого таймера

0 — сканируются все каналы

1 — сканируется канал, настроенный в битовом поле AWDCH[4:0].

SCAN (Scan mode): режим сканирования каналов по списку, определённому либо битовым полем ADC_SQRx, либо ADC_JSQRx

0 — режим выключен

1 — режим включен.

JEOCIE (Interrupt enable for injected channels): разрешение прерываний по окончанию преобразования инжектированных каналов

0 — прерывания запрещены

1 — прерывания разрешены.

AWDIE (Analog watchdog interrupt enable): разрешение прерываний по сигналу оконного компаратора

0 — прерывания запрещены

1 — прерывания разрешены.

EOCIE (Interrupt enable for EOC): разрешение прерываний по окончанию преобразования

0 — прерывания запрещены

1 — прерывания разрешены.

AWDCH[4:0] (Analog watchdog channel select bits): выбор канала для оконного компаратора. Данный бит актуален только при установленном бите AWDSGL

00000 — канал 0

00001 — канал 1

10001 — канал 17.

 

 

Второй регистр управления

 

Назначение битов:

TSVREFE (Temperature sensor and VREFINT enable): включает датчик температуры и источник опорного напряжения (ИОН), при условии если они есть в АЦП

0 — датчик температуры и ИОН отключены

1 — датчик температуры и ИОН включены.

SWSTART (Start conversion of regular channels): запуск преобразования регулярных каналов. Этот бит устанавливается программно перед началом запуска преобразования и сбрасывается аппаратно, как только начнётся преобразование. Запускает преобразование регулярных каналов, если SWSTART выбран в качестве события запуска битами EXTSEL[2:0]

1 — запуск преобразования регулярных каналов

0 — бит аппаратно сброшен перед началом преобразования.

JSWSTART (Start conversion of injected channels): запуск преобразования инжектированных каналов. Этот бит устанавливается программно перед началом запуска преобразования и сбрасывается аппаратно, как только начнётся преобразование. Запускает преобразование инжектированных каналов, если JSWSTART выбран в качестве события запуска битами JEXTSEL[2:0]

1 — запуск преобразования регулярных каналов

0 — бит аппаратно сброшен перед началом преобразования.

EXTTRIG (External trigger conversion mode for regular channels): разрешение внешнего триггера, используемого для запуска преобразования регулярной группы каналов

0 — запуск внешним сигналом запрещён

1 — запуск внешним сигналом разрешён.

EXTSEL[2:0] (External event select for regular group): с помощью данного поля выбирается внешнее событие, используемое для запуска начала преобразования регулярной группы каналов. Поле актуально при установленном бите EXTTRIG

Для ADC1 и ADC2 используются следующие события:

000 — Timer1 CC1

001 — Timer1 CC2

010 — Timer1 CC3

011 — Timer1 CC4

100 — Timer 3 TRGO

101 — Timer4 CC4

110 — EXTI line 11/TIM8_TRGO event (TIM8_TRGO доступен только в контроллерах high-density and XLdensity)

111 — SWSTART.

Для ADC3 (если есть) используются следующие события:

000 — Timer3 CC1

001 — Timer2 CC3

010 — Timer1 CC3

011 — Timer8 CC1

100 — TIM8 TRGO

101 — Timer5 CC1

110 — Timer5 CC3

111 — SWSTART.

JEXTTRIG (External trigger conversion mode for injected channels): разрешение внешнего триггера, используемого для запуска преобразования инжектированной группы каналов

0 — запуск внешним сигналом запрещён

1 — запуск внешним сигналом разрешён.

JEXTSEL[2:0] (External event select for injected group): с помощью данного поля выбирается внешнее событие, используемое для запуска начала преобразования инжектированной группы каналов. Поле актуально при установленном бите JEXTTRIG

Для ADC1 и ADC2 используются следующие события:

000 — Timer1 TRGO

001 — Timer1 CC4

010 — Timer2 TRGO

011 — Timer12CC1

100 — Timer 3 CC4

101 — Timer4 TRGO

110 — EXTI line 15/TIM8_CC4 event (TIM8_CC4 доступен только в контроллерах high-density and XLdensity)

111 — SWSTART.

Для ADC3 (если есть) используются следующие события:

000 — Timer1 TRGO

001 — Timer1 CC4

010 — Timer4 CC3

011 — Timer8 CC2

100 — TIM8 CC4

101 — Timer5 TRGO

110 — Timer5 CC4

111 — SWSTART.

ALIGN (Data alignment): бит выравнивания результата в 16 битах регистра.

0 — выравнивание по правому краю

1 — выравнивание по левому краю.

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

DMA (Direct memory access mode): данный бит разрешает работу с DMA

0 — режим DMA выключен

1 — режим DMA включен.

RSTCAL (Reset calibration): бит сброса калибровки АЦП. Данный бит устанавливается программно, а сбрасывается аппаратно по окончанию сброса значений калибровки

0 — сброс значений калибровки АЦП завершен

1 — сброс значений калибровки АЦП.

CAL (A/D Calibration): бит запуска калибровки АЦП. Данный бит устанавливается программно при запуске калибровки, а сбрасывается аппаратно по окончанию процесса калибровки

0 — процесс калибровки АЦП завершен

1 — идёт калибровка АЦП.

CONT (Continuous conversion): бит включения непрерывного преобразования

0 — одиночный режим

1 — непрерывный режим.

ADON (A/D converter ON / OFF): бит разрешение работы АЦП

0 — работа АЦП запрещена, АЦП переходит в режим пониженного энергопотребления

1 — работа АЦП разрешена.

 

В 3-разрядных битовых полях, организованных для каждого канала, следующих двух регистров задаётся количество тактов между выборками

 

Настройка битовых полей SMPx[2:0] (Channel x Sample time selection).

В зависимости от комбинаций битов в данных полях мы получим следующие интервалы между выборками

0001,5 цикла

0017,5 цикла

01013,5 цикла

011 28,5 цикла

10041,5 цикла

10155,5 цикла

11071,5 цикла

111239,5 цикла.

Так как преобразование длится минимум 12,5 цикла, то минимальный период выборок составит 12,5 + 1,5 = 14 циклов.

 

В следующих трёх регистрах — SQR1 — SQR3 мы настраиваем очерёдность сканирования регулярных каналов. Всё это актуально при установленном бите SCAN регистра CR1.

Самое первое битовое поле L[3:0], находящееся в самом первом регистре содержит количество каналов в последовательности для сканирования, а в остальных полях SQx[4:0], имеющихся для каждого номера в последовательности, содержится номер сканируемого канала в данном элементе очереди. После этого каналы сканируются от элемента последоватеьности 1 и далее

Количество преобразований в последовательности.

L[3:0] (Regular channel sequence length): Длина последовательности для сканирования

0001 преобразование

0012 преобразования

11116 преобразований.

 

Далее идут регистры, предназначенные для инжектированных каналов, с которыми мы лучше познакомимся, когда и будем работать с такими преобразованиями.

Поэтому останется у нас только один регистр — регистр данных регулярных преобразований.

В данный регистр записываются данные одного регулярного преобразования

Мы видим здесь 2 поля. Первое — DATA[15:0] — 16 бит данных преобразования, а ещё поле — ADC2DATA[15:0] — поле данных от второго АЦП, если у нас включен режим парной работы двух АЦП. То есть, в данном случае мы получим результат повышенной точности.

 

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

 

 

Биты SEXT — это знаковые биты, а биты D11-D0 — биты данных.

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

Результат в вольтах, кроме зависимости от результата из регистра, также будет зависеть от опорного напряжения. В нашем случае это будет напряжение питание.

Данный результат рассчитывается следующим образом: V = RAW x Vref / 4095.

 

В следующей части нашего урока мы настроим проект, проанализируем код инициализации ADC, напишем и испытаем код измерения напряжения с помощью ADC на практике.

 

 

Предыдущий урок Программирование МК STM32 Следующая часть

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM LL. ADC. Regular Once

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

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

*