Использование АЦП в STM32F103C8 (STM32 Blue Pill)


В современных электронных устройствах широкое применение находят аналого-цифровые преобразователи (АЦП, в англ. ADC – Analog to Digital Converter). С помощью данных АЦП можно считывать значения напряжения с различных аналоговых датчиков: температуры, наклона, тока, изгиба и многих других. В данной статье мы рассмотрим использование АЦП в плате STM32F103C8, которая также называется STM32 Blue Pill ("синяя таблетка"). Мы подключим к плате STM32 Blue Pill небольшой потенциометр, напряжение с которого будем подавать на один из АЦП платы, измеренное значение напряжения мы будем выводить на экран ЖК дисплея 16х2.

Внешний вид проекта использования АЦП в STM32F103C8 (STM32 Blue Pill)

Ранее на нашем сайте мы рассматривали использование АЦП в следующих микроконтроллерах (микроконтроллерных платах):

Необходимые компоненты

  1. Плата разработки STM32F103C8T6 (STM32 Blue Pill) (купить на AliExpress).
  2. ЖК дисплей 16x2 (купить на AliExpress).
  3. Потенциометр 100 кОм (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Сравнение АЦП в платах Arduino и STM32F103C8

Плата Arduino содержит 6 каналов АЦП (8 каналов в платах Mini и Nano, 16 – в плате Mega). Каждый из этих АЦП имеет разрядность 10 бит и диапазон входных напряжений 0V–5V. То есть он преобразует входное напряжение в диапазоне от 0 до 5V в целое число в диапазоне от 0 до 1023. А в плате STM32F103C8 10 каналов АЦП с разрядностью 12 и диапазоном входных напряжений 0V-3.3V. То есть данные АЦП преобразуют входное напряжение в диапазоне от 0 до 3.3V в целое число в диапазоне от 0 до 4095.

АЦП в STM32

АЦП, применяемые в микроконтроллерах STM32, используют принцип SAR (successive approximation register – последовательный аппроксимирующий регистр), при котором преобразование выполняется за несколько шагов. Число этих шагов равно разрядности АЦП.

10 каналов АЦП в плате STM32F103C8 означает что мы имеем 10 контактов АЦП, на каждом из которых мы можем измерять аналоговое напряжение. 12 бит характеризуют разрядность АЦП, это означает что на выходе АЦП в зависимости от значения аналогового напряжения мы получаем целое число в диапазоне от 0 до 4095. Инкремент аналогового напряжения в зависимости от единичного приращения данного числа можно определить по следующей формуле:

Распиновка платы STM32 Blue Pill приведена на следующем рисунке.

Назначение контактов (распиновка) платы STM32F103C8 (Blue Pill)Как можно видеть, 10 аналоговых контактов в плате STM32 Blue Pill имеют обозначения от PA0 до PB1.

Каким образом аналоговый сигнал преобразуется в цифровой формат

Современные компьютеры могут хранить и обрабатывать только двоичные/цифровые значения (нули и единицы). Таким образом, аналоговые сигналы (например, с выхода датчиков) нам необходимо преобразовать в цифровые значения для последующей обработки, при этом данное преобразование должно быть по возможности как можно более точным. Когда на аналоговый вход STM32 поступает аналоговое напряжение, оно считывается и сохраняется в переменной целого типа (integer). Сохраненное аналоговое напряжение (0-3.3V) преобразуется в число целого типа (0-4096) в соответствии с формулой:

где Resolution (разрешение) = 4096, а Reference (опорное напряжение) = 3.3V.

Схема проекта

Схема для демонстрации возможностей АЦП в плате STM32 Blue Pill представлена на следующем рисунке.

Схема для демонстрации возможностей АЦП в плате STM32 Blue PillВ схеме необходимо сделать следующие соединения между платой STM32 Blue Pill и ЖК дисплеем 16х2.

№ контакта ЖК дисплея Обозначение контакта ЖК дисплея Контакт платы STM32
1 Ground (Gnd) Ground (G)
2 VCC 5V
3 VEE средний контакт потенциометра
4 Register Select (RS) PB11
5 Read/Write (RW) Ground (G)
6 Enable (EN) PB10
7 Data Bit 0 (DB0) No Connection (NC)
8 Data Bit 1 (DB1) No Connection (NC)
9 Data Bit 2 (DB2) No Connection (NC)
10 Data Bit 3 (DB3) No Connection (NC)
11 Data Bit 4 (DB4) PB0
12 Data Bit 5 (DB5) PB1
13 Data Bit 6 (DB6) PC13
14 Data Bit 7 (DB7) PC14
15 LED Positive 5V
16 LED Negative Ground (G)

В схеме у нас присутствуют два потенциометра. Первый из них выполняет роль делителя напряжения – с него изменяемое значения напряжения поступает на аналоговый вход платы STM32. Левый контакт данного потенциометра подключен к источнику положительного напряжения платы STM32 (3.3V), правый контакт подключен к земле платы, а центральный контакт – к аналоговому контакту PA7 платы STM32. Второй потенциометр в схеме используется для регулировки контрастности ЖК дисплея. Питание наша схема получает через порт USB от компьютера/ноутбука.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для платы STM32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В предыдущей статье на нашем сайте мы рассмотрели программирование платы STM32 Blue Pill через USB порт с помощью Arduino IDE, также ее можно запрограммировать с помощью FTDI программатора как описано в данной статье.

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

Сначала в программе укажем контакты платы STM32, к которой подключен ЖК дисплей. Вы можете изменить их по своему усмотрению, внеся соответствующие изменения в схему проекта.

Затем подключим библиотеку для работы с ЖК дисплеем – LiquidCrystal.h. Также инициализируем объект ЖК дисплея с помощью функции LiquidCrystal. Более подробно о подключении ЖК дисплея 16х2 к плате STM32 Blue Pill вы можете прочитать в этой статье.

Внутри функции setup() мы укажем тип ЖК дисплея (16х2), выведем на его экран приветственное сообщение и спустя 2 секунды очистим экран дисплея.

Внутри функции loop() мы начнем считывание аналогового напряжения с контакта PA7 платы, которое подается на него со среднего контакта потенциометра. Считывать аналоговое напряжение мы будем с помощью функции analogRead(), считанное значение напряжения мы будем сохранять в переменной “val”. Переменная “val” целого типа (integer), в нашем случае в нее будет записываться число в диапазоне от 0 до 4095 (поскольку у нас 12 битный АЦП).

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

ADC value мы считали в результате предыдущей команды, разрешение АЦП (ADC resolution) у нас равно 4096, рабочее напряжение (operating voltage) микроконтроллера у нас равно 3.3V – его можно измерить с помощью мультиметра, подключенного между контактами Vcc и ground платы. Таким образом, для нашей программы мы получаем следующую команду для получения значения аналогового напряжения:

У вас могут возникнуть вопросы по поводу команды float (val) – она нужна для преобразования значения переменной “val” из целого типа данных в вещественный (float). Нам необходимо это преобразование поскольку если мы будем делить целое значение переменной val на 4096 мы будем получать всегда 0. Предварительное преобразование (перед делением) данной переменной в вещественный тип позволяет избежать данной проблемы. Поскольку значение аналогового напряжения мы получили, нам остается только отобразить его на экране. Мы это сделаем с помощью следующих строк кода:

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
748 просмотров

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

Ваш адрес email не будет опубликован.