Модули АЦП (аналого-цифрового преобразования) в настоящее время находят широкое применение во многих проектах встраиваемой электроники. С их помощью осуществляется считывание информации от многих датчиков с аналоговым выходом: датчики температуры, датчики наклона, датчики изгиба, датчики тока и многих других. Поэтому в данной статье мы рассмотрим использование АЦП в MSP430G2 для считывания аналогового напряжения с помощью Energia IDE. Аналоговое напряжение на вход платы мы будем подавать с помощью потенциометра, измеренное значение напряжения будем отображать на экране ЖК дисплея 16х2.
Ранее на нашем сайте мы рассматривали использование АЦП в следующих микроконтроллерах (платах):
- в микроконтроллерах AVR;
- в микроконтроллерах PIC;
- в плате Arduino;
- в плате Raspberry Pi;
- в Raspberry Pi Pico на MicroPython;
- в плате STM32 Blue Pill.
Необходимые компоненты
- Плата MSP430G2 LaunchPad (купить на AliExpress).
- ЖК дисплей (купить на AliExpress).
- Потенциометр – 2 шт. (купить на AliExpress).
- Соединительные провода.
Принцип работы модуля АЦП
Микроконтроллер является цифровым устройством, поэтому он может понимать только цифровые значения: 0 или 1. Но в природе существует масса явлений, которые по своей сути являются аналоговыми: температура, влажность, скорость ветра и т.д. Для того чтобы считывать аналоговые значения от других устройств микроконтроллеры используют модули АЦП. Данные модули бывают различных типов, в нашей плате MSP430G2 используется 8-канальный 10-битный АЦП с последовательным приближением (аппроксимацией).
Принцип работы АЦП с последовательным приближением (SAR) основан на использовании компаратора и ряда логических преобразований. Он использует опорное напряжение (которое, в общем случае, может быть переменным) для сравнения его с напряжением на своем входе и разницу между ними сохраняет в наиболее значащих битах (Most significant bit, MSB). Скорость выполнения данных операций сравнения зависит от тактовой частоты, на которой работает микроконтроллер MSP.
Для считывания аналоговых значений в плате MSP430G2 могут использоваться 8 ее аналоговых контактов, поэтому ее АЦП является 8-канальным. 10 бит – это разрешение (разрешающая способность) АЦП нашей платы. Соответственно, число шагов (отсчетов), которыми может оперировать данный АЦП, равно 1024 (2 в десятой степени). Поэтому в зависимости от значения аналогового напряжения на входе на выходе АЦП формируется значение в диапазоне от 0 до 1023, которое для нашей платы можно рассчитать по следующей формуле:
Примечание: по умолчанию в Energia IDE опорное напряжение выставляется равным Vcc (~3v), но в коде программы вы можете изменить его вручную с помощью команды analogReference().
Схема проекта
Схема проекта для демонстрации использования АЦП в плате MSP430G2 представлена на следующем рисунке.
В предыдущей статье на нашем сайте мы рассмотрели подключение к плате MSP430G2 ЖК дисплея, в этой же статье мы добавили в схему кроме ЖК дисплей еще два потенциометра – один используется для регулировки контрастности ЖК дисплея, а второй – для подачи аналогового напряжения на модуль АЦП платы MSP430G2. Один из крайних контактов второго потенциометра подключен к Vcc, второй его крайний контакт подключен к земле, а средний контакт – к контакту P1.7 платы MSP430G2. Поэтому на вход контакта P1.7 можно будет подавать аналоговое напряжение в диапазоне от 0V (земля) до 3.5V (Vcc).
Внешний вид собранной конструкции проекта показан на следующем рисунке.
В Energia IDE нам необходимо знать какой аналоговый канал относится к контакту P1.7.Это можно посмотреть на следующей картинке.
Как можно видеть из представленного рисунка, контакт P1.7 расположен справа на нем и он соотносится с аналоговым каналом A7. Аналогичным образом можно посмотреть какие каналы АЦП относятся к другим контактам. В плате MSP430G2 можно использовать каналы с A0 по A7, в данном проекте мы использовали канал A7.
Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В данной программе мы будем считывать значение с выхода АЦП и на его основе рассчитывать значение аналогового напряжения, после чего отображать оба этих значения на экране ЖК дисплея.
Сначала в программе дадим осмысленные имена контактам платы MSP430G2, к которым подключен ЖК дисплей.
1 2 3 4 5 6 |
#define RS 2 #define EN 3 #define D4 4 #define D5 5 #define D6 6 #define D7 7 |
Далее в программе подключим заголовочный файл библиотеки для работы с ЖК дисплеем. Данная библиотека устанавливается вместе с Energia IDE по молчанию, поэтому вам не нужно беспокоиться о ее дополнительной установке. Затем объявим объект для работы с ЖК дисплеем, в качестве параметров передадим ему имена контактов, к которым подключен дисплей.
1 2 |
#include <LiquidCrystal.h> //This librarey is insatlled by default along with IDE LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD |
Внутри функции setup() мы покажем приветственное сообщение на экране ЖК дисплея.
1 2 3 4 5 |
lcd.begin(16, 2); //We are using a 16*2 LCD display lcd.setCursor (0,0); //Place the cursor at 1st row 1st column lcd.print("MSP430G2553"); //Display a intro message lcd.setCursor(0, 1); // set the cursor to 1st column 2nd row lcd.print("-CircuitDigest"); //Display a intro message |
И, наконец, внутри функции loop() мы начнем считывание значения напряжения с контакта A7. На выходе АЦП данное значение напряжения преобразуется в число в диапазоне от 0 до 1023. Для считывания значения с выхода АЦП используем следующую команду:
1 |
int val = analogRead(A7); // read the ADC value from pin A7 |
С помощью приведенной функции analogRead() производится считывание аналогового значения с канала A7, который соответствует физическому контакту P1.7. Затем мы сохраняем считанное значение в переменной “val”. Это переменная целого типа потому что нам нужно будет хранить число в диапазоне от 0 до 1024.
На следующем шаге мы на основе этого считанного значения с выхода АЦП будем рассчитывать значение аналогового напряжения на его входе по следующей формуле:
1 |
Voltage = (ADC Value / ADC Resolution) * Reference Voltage |
В нашем случае мы знаем что разрешение нашего АЦП равно 1024. Значение с выхода АЦП (ADC value) мы считали ранее. Значение опорного напряжения (reference voltage) равно напряжению, на котором работает микроконтроллер. Когда плата MSP430 получает питание по кабелю USB рабочее напряжение для нее составляет 3.6V. Вы можете непосредственным образом измерить значение этого напряжения между контактами Vcc и землей с помощью мультиметра. Поэтому для расчета значения аналогового напряжения в нашем случае формула принимает вид:
1 |
float voltage = (float(val)/1024) * 3.6; //formulae to convert the ADC value to voltage |
Вас в представленной команде может смутить слово float. Здесь оно используется для преобразования значения переменного целого типа “val” в вещественный тип данных (“float”). Если бы мы использовали переменную целого типа, то в результате вычисления значения по приведенной формуле мы всегда бы получали 0.
Теперь, когда нам известны значения и на входе, и на выходе АЦП, мы можем отобразить их на экране ЖК дисплея.
1 2 3 4 5 6 |
lcd.setCursor(0, 0); // set the cursor to column 0, line 0 lcd.print("ADC Val:"); lcd.print(val); //Display ADC value lcd.setCursor(0, 1); // set the cursor to column 0, line 1 lcd.print("Voltage:"); lcd.print(voltage); //Display voltage |
В данном случае мы отображаем значение с выхода АЦП на первой строке дисплея, а рассчитанное значение аналогового напряжения – на его второй строке. Затем мы будем использовать задержку в 100 мс, после которой будем очищать экран ЖК дисплея. Таким образом, отображаемые значения на экране ЖК дисплея будут обновляться каждые 100 мс.
Тестирование работы проекта
Проект мы решили собрать с помощью макетной платы. После сборки аппаратной части проекта и загрузки программы в плату MSP430 с помощью Energia IDE вы на экране ЖК дисплея должны увидеть приветственное сообщение. Если вы его не видите, то с помощью потенциометра отрегулируйте контрастность ЖК дисплея. Также попробуйте нажать кнопку сброса. Если все работает так, как надо, вы должны увидеть примерно следующую картину:
После этого вращайте ручку потенциометра и вы должны увидеть как изменяются значения на экране ЖК дисплея. Для проверки корректности работы проекта вы можете также с помощью мультиметра измерять значение напряжения между центральным контактом потенциометра и общим проводом схемы (землей). Напряжение на экране мультиметра должно примерно соответствовать напряжению, отображаемому на экране ЖК дисплея как показано на следующем рисунке.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/* * Reading Analog Voltage with MSP430 using Energia */ #define RS 2 #define EN 3 #define D4 4 #define D5 5 #define D6 6 #define D7 7 #include <LiquidCrystal.h> //This librarey is insatlled by default along with IDE LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); //Let the librarey know how we have connected the LCD void setup() { lcd.begin(16, 2); // мы используем ЖК дисплей 16*2 lcd.setCursor (0,0); //перемещаем курсор в 1-й столбец 1-й строки lcd.print("MSP430G2553"); //отображаем первую строку приветственного сообщения lcd.setCursor(0, 1); // перемещаем курсор в 1-й столбец 2-й строки lcd.print("-CircuitDigest"); // отображаем вторую строку приветственного сообщения delay(2000); //задержка в 2 секунды lcd.clear(); //очищаем экран дисплея } void loop() { int val = analogRead(A7); // считываем значение с выхода АЦП с контакта A7 Voltage = (ADC Value / ADC Resolution) * Reference Voltage float voltage = (float(val)/1024) * 3.6; //рассчитываем значение аналогового напряжения lcd.setCursor(0, 0); // перемещаем курсор в 1-й столбец 1-й строки lcd.print("ADC Val:"); lcd.print(val); //отображаем значение на выходе АЦП lcd.setCursor(0, 1); // перемещаем курсор в 1-й столбец 2-й строки lcd.print("Voltage:"); lcd.print(voltage); //отображаем значение аналогового напряжения } |