- Сравнение АЦП в Arduino и STM32F103C8
- АЦП в STM32
- Как аналоговый сигнал преобразуется в цифровой формат
- Контакты АЦП в STM32F103C8T6
- Необходимые компоненты
- Принципиальная схема и пояснения
- Программирование STM32 для чтения значений АЦП
Одной общей функцией, которая используется почти во всех встроенных приложениях, является модуль АЦП (аналого-цифровой преобразователь). Эти аналого-цифровые преобразователи могут считывать напряжение с аналоговых датчиков, таких как датчик температуры, датчик наклона, датчик тока, датчик Flex и многое другое. Итак, в этом руководстве мы узнаем, как использовать АЦП в STM32F103C8 для считывания аналоговых напряжений с помощью Energia IDE. Мы подключим небольшой потенциометр к плате STM32 Blue Pill и подадим переменное напряжение на аналоговый вывод, считываем напряжение и отображаем его на ЖК-экране 16x2.
Сравнение АЦП в Arduino и STM32F103C8
На плате Arduino он содержит 6 каналов (8 каналов на Mini и Nano, 16 на Mega) 10-разрядный АЦП с диапазоном входного напряжения 0–5 В. Это означает, что он преобразует входные напряжения от 0 до 5 вольт в целочисленные значения от 0 до 1023. Теперь в случае STM32F103C8 у нас есть 10 каналов, 12-битный АЦП с входным диапазоном 0–3,3 В. Он преобразует входные напряжения от 0 до 3,3 вольт в целочисленные значения от 0 до 4095.
АЦП в STM32
Встроенный в микроконтроллеры STM32 АЦП использует принцип SAR (регистр последовательного приближения), по которому преобразование выполняется в несколько этапов. Количество шагов преобразования равно количеству бит в преобразователе АЦП. Каждый шаг управляется часами АЦП. Каждый тактовый сигнал АЦП производит один бит от результата до вывода. Внутренняя конструкция АЦП основана на методе переключаемых конденсаторов. Если вы новичок в STM32, ознакомьтесь с нашим руководством по началу работы с STM32.
12-битное разрешение
Этот АЦП представляет собой 10-канальный 12-битный АЦП. Здесь термин «10 каналов» означает, что имеется 10 выводов АЦП, с помощью которых мы можем измерять аналоговое напряжение. Термин «12 бит» означает разрешение АЦП. 12 бит означает 2 в степени десяти (2 12), что составляет 4096. Это количество шагов выборки для нашего АЦП, поэтому диапазон наших значений АЦП будет от 0 до 4095. Значение будет увеличиваться от 0 до 4095 на основе значения напряжения на шаг, которое можно рассчитать по формуле
НАПРЯЖЕНИЕ / STEP = Опорное напряжение / 4096 = (3,3 / 4096 = 8.056mV) за единицу.
Как аналоговый сигнал преобразуется в цифровой формат
Поскольку компьютеры хранят и обрабатывают только двоичные / цифровые значения (единицы и нули). Таким образом, аналоговые сигналы, такие как выходной сигнал датчика в вольтах, должны быть преобразованы в цифровые значения для обработки, и преобразование должно быть точным. Когда аналоговое входное напряжение подается на STM32 на его аналоговых входах, аналоговое значение считывается и сохраняется в целочисленной переменной.. Это сохраненное аналоговое значение (0–3,3 В) преобразуется в целые числа (0–4096) по следующей формуле:
Входное напряжение = (ADC Value / Разрешение АЦП) * опорного напряжения
Разрешение = 4096
Ссылка = 3,3 В
Контакты АЦП в STM32F103C8T6
В STM32 имеется 10 аналоговых выводов от PA0 до PB1.
Также проверьте, как использовать АЦП в других микроконтроллерах:
- Как использовать АЦП в Arduino Uno?
- Взаимодействие ADC0808 с микроконтроллером 8051
- Использование модуля АЦП микроконтроллера PIC
- Учебник Raspberry Pi ADC
- Как использовать АЦП в MSP430G2 - Измерение аналогового напряжения
Необходимые компоненты
- STM32F103C8
- ЖК-дисплей 16 * 2
- Потенциометр 100к
- Макетная плата
- Соединительные провода
Принципиальная схема и пояснения
Схема подключения ЖК-дисплея 16 * 2 и аналогового входа к плате STM32F103C8T6 показана ниже.
Подключения, которые выполняются для ЖК-дисплея, приведены ниже:
ЖК-вывод Нет |
Имя вывода ЖК-дисплея |
Имя контакта STM32 |
1 |
Земля (Gnd) |
Земля (G) |
2 |
VCC |
5В |
3 |
VEE |
Штифт от центра потенциометра |
4 |
Выбрать регистр (RS) |
PB11 |
5 |
Чтение / запись (RW) |
Земля (G) |
6 |
Включить (EN) |
PB10 |
7 |
Бит данных 0 (DB0) |
Нет соединения (NC) |
8 |
Бит данных 1 (DB1) |
Нет соединения (NC) |
9 |
Бит данных 2 (DB2) |
Нет соединения (NC) |
10 |
Бит данных 3 (DB3) |
Нет соединения (NC) |
11 |
Бит данных 4 (DB4) |
PB0 |
12 |
Бит данных 5 (DB5) |
PB1 |
13 |
Бит данных 6 (DB6) |
PC13 |
14 |
Бит данных 7 (DB7) |
PC14 |
15 |
Светодиод Положительный |
5В |
16 |
Светодиод отрицательный |
Земля (G) |
Подключения выполняются согласно приведенной выше таблице. В цепи присутствуют два потенциометра, первый из которых используется для делителя напряжения, который может использоваться для изменения напряжения и обеспечения аналогового ввода для STM32. Левый контакт этого потенциометра получает входное положительное напряжение от STM32 (3,3 В), а правый контакт подключен к земле, центральный контакт потенциометра подключен к контакту аналогового входа (PA7) STM32. Другой потенциометр используется для изменения контрастности ЖК-дисплея. Источником питания для STM32 является источник питания USB от ПК или ноутбука.
Программирование STM32 для чтения значений АЦП
В нашем предыдущем руководстве мы узнали о программировании платы STM32F103C8T6 с использованием порта USB. Так что нам сейчас не нужен программист FTDI. Просто подключите его к ПК через USB-порт STM32 и начните программировать с помощью ARDUINO IDE. Программировать STM32 в ARDUINO IDE для считывания аналогового напряжения очень просто. Это то же самое, что и плата Arduino. Нет необходимости менять контакты перемычки STM32.
В этой программе будет считываться аналоговое значение и вычисляться напряжение с этим значением, а затем отображаться как аналоговые, так и цифровые значения на ЖК-экране.
Сначала определите контакты ЖК-дисплея. Они определяют, к какому выводу STM32 подключены выводы ЖК-дисплея. Вы можете изменить в соответствии с вашими требованиями.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // указываем имена контактов, к которым подключен ЖК-дисплей
Затем мы включаем файл заголовка для ЖК-дисплея. Это вызывает библиотеку, которая содержит код того, как STM32 должен взаимодействовать с ЖК-дисплеем. Также убедитесь, что функция Liquid Crystal вызывается с именами контактов, которые мы только что определили выше.
#включают
Внутри функции setup () мы просто даем вводное сообщение, которое будет отображаться на ЖК-экране. Вы можете узнать о взаимодействии ЖК-дисплея с STM32.
lcd.begin (16, 2); // Мы используем ЖК-дисплей 16 * 2 lcd.clear (); // Очистить экран lcd.setCursor (0, 0); // В первой строке первый столбец lcd.prin t ("CIRCUITDIGEST"); // Распечатать это lcd.setCursor (0, 1); // Во второй строке первый столбец n lcd.print ("STM32F103C8"); // Печать Тхи сек задержки (2000); // ждем два секунды lcd.clear (); // Очистить экран lcd.setCursor (0, 0); // В первой строке первый столбец lcd.print ("USING ADC IN"); // Распечатать это lcd.setCursor (0,1); // В первом столбце второй строки lcd.print ("STM32F103C8"); // Распечатать эту задержку (2000); // ждем два секунды lcd.clear (); // Очистить экран
Наконец, внутри нашей функции бесконечного цикла () мы начинаем считывать аналоговое напряжение, подаваемое на вывод PA7 с потенциометра. Как мы уже обсуждали, микроконтроллер является цифровым устройством и не может напрямую считывать уровень напряжения. Используя метод SAR, уровень напряжения отображается от 0 до 4096. Эти значения называются значениями АЦП, чтобы получить это значение АЦП, просто используйте следующую строку
int val = аналоговое чтение (A7); // считываем значение АЦП с вывода PA 7
Здесь функция analogRead () используется для чтения аналогового значения вывода. Наконец, мы сохраняем это значение в переменной с именем « val ». Тип этой переменной - целочисленный, потому что мы получим только значения от 0 до 4096, которые будут сохранены в этой переменной.
Следующим шагом будет вычисление значения напряжения из значения АЦП. Для этого у нас есть следующие формулы
Напряжение = (АЦП Значение / АЦП Разрешение) * Ссылка Трансформат е
В нашем случае мы уже знаем, что разрешение АЦП нашего микроконтроллера составляет 4096. Значение АЦП также находится в предыдущей строке и хранит переменную с именем val. Опорное напряжение равно напряжению, при котором микроконтроллер работает. Когда плата STM32 питание через кабель USB, то рабочее напряжение 3.3V. Вы также можете измерить рабочее напряжение, используя мультиметр на контакте Vcc и заземлении на плате. Таким образом, приведенная выше формула подходит для нашего случая, как показано ниже.
плавающее напряжение = (float (val) / 4096) * 3.3; // формулы для преобразования значения АЦП в напряжение e
Возможно, вас смущает строка float (val). Это используется для преобразования переменной «val» из типа данных int в тип данных «float». Это преобразование необходимо, потому что, только если мы получим результат val / 4096 в формате float, мы сможем умножить его на 3,3. Если значение получено в виде целого числа, оно всегда будет 0, и результат также будет нулевым. После того, как мы вычислили значение и напряжение АЦП, все, что осталось, это отобразить результат на ЖК-экране, что можно сделать, используя следующие строки
lcd.setCursor (0, 0); // установить курсор в столбец 0, строку 0 lcd.print ("ADC Val:"); lcd.print (val); // Отображаем значение АЦП lcd.setCursor (0, 1); // установить курсор в столбец 0, строка 1 lcd.print ("Voltage:"); lcd.print (напряжение); // Отображение напряжения
Полный код и демонстрационное видео приведены ниже.