- Необходимые материалы
- АЦП на STM8S103F3P6
- Принципиальная схема для считывания значений АЦП на STM8S и отображения на ЖК-дисплее
- Библиотека АЦП для STM8S103F3P6
- Программа STM8S для считывания аналогового напряжения и отображения на ЖК-дисплее
- Считывание аналогового напряжения с двух потенциометров с помощью STM8S
Если вы являетесь постоянным читателем, который следит за нашими учебными пособиями по микроконтроллерам STM8S, вы должны знать, что в нашем последнем руководстве мы узнали, как связать ЖК-дисплей 16x2 с модулями STM8. Теперь, переходя к этому руководству, мы узнаем, как использовать функцию ADC на нашем микроконтроллере STM8S103F3P6. АЦП - это очень полезное периферийное устройство микроконтроллера, которое часто используется встроенными программистами для измерения единиц, которые находятся в постоянном изменении, таких как переменное напряжение, ток, температура, влажность и т. Д.
Как мы знаем, «мы живем в аналоговом мире с цифровыми устройствами», что означает, что все вокруг нас, например скорость ветра, сила света, температура, и все, с чем мы имеем дело, например скорость, скорость, давление и т. Д., Является аналоговым по своей природе. Но наши микроконтроллеры и микропроцессоры являются цифровыми устройствами, и они не смогут измерять эти параметры без важного периферийного устройства, называемого аналого-цифровыми преобразователями (АЦП). Итак, в этой статье давайте узнаем, как использовать ADC на микроконтроллере STM8S с компилятором COMIC C.
Необходимые материалы
В этой статье мы будем считывать два аналоговых значения напряжения с двух потенциометров и отображать его значение АЦП на ЖК-дисплее 16x2. Для этого нам потребуются следующие компоненты.
- STM8S103F3P6 Совет по развитию
- Программатор ST-Link V2
- ЖК-дисплей 16x2
- Потенциометры
- Соединительные провода
- Резистор 1к
АЦП на STM8S103F3P6
Существует много типов АЦП, и каждый микроконтроллер имеет свои собственные характеристики. На STM8S103F3P6 у нас есть АЦП с 5 каналами и 10-разрядным разрешением; с 10-битным разрешением мы сможем измерить цифровое значение от 0 до 1024, а 5-канальный АЦП показывает, что у нас есть 5 контактов на микроконтроллере, который может поддерживать АЦП, эти 5 контактов выделены на рисунке ниже.
Как вы можете видеть, все эти пять контактов (AIN2, AIN3, AIN4, AIN5 и AIN6) мультиплексированы с другими периферийными устройствами, что означает, что помимо работы в качестве вывода ADC, эти выводы также могут использоваться для выполнения других коммуникаций, например, выводы 2 и 3 (AIN5 и AIN 6) могут использоваться не только для АЦП, но также могут использоваться для последовательной связи и функций GPIO. Обратите внимание, что невозможно будет использовать один и тот же вывод для всех трех целей, поэтому, если мы будем использовать эти два вывода для АЦП, мы не сможем выполнять последовательную связь. Другие важные характеристики АЦП для STM8S103P36 можно найти в таблице ниже, взятой из таблицы данных.
В приведенной выше таблице Vdd представляет рабочее напряжение, а Vss представляет собой землю. Итак, в нашем случае на нашей плате для разработки у нас есть микроконтроллер, работающий от 3,3 В, вы можете проверить принципиальную схему платы для разработки в начале работы с учебником STM8S. При 3,3 В в качестве рабочего напряжения тактовая частота АЦП может быть установлена от 1 до 4 МГц, а диапазон напряжения преобразования - от 0 до 3,3 В. Это означает, что наш 10-битный АЦП будет читать 0, когда предоставляется 0 В (Vss), и будет читать максимум 1024, когда предоставляется 3,3 В (Vdd). Мы можем легко изменить это значение 0-5 В, изменив при необходимости рабочее напряжение микроконтроллера.
Принципиальная схема для считывания значений АЦП на STM8S и отображения на ЖК-дисплее
Полная принципиальная схема, используемая в этом проекте, приведена ниже, она очень похожа на руководство по ЖК-дисплею STM8S, которое мы обсуждали ранее.
Как видите, единственными дополнительными компонентами, помимо ЖК-дисплея, являются два потенциометра POT_1 и POT_2 . Эти потенциометры подключены к портам PC4 и PD6, которые являются контактами ANI2 и ANI6, как обсуждалось ранее на изображении выводов.
Потенциометры подключены таким образом, что, когда мы его изменяем, мы получаем 0-5 В на наших аналоговых выводах. Мы запрограммируем наш контроллер на считывание этого аналогового напряжения в цифровом значении (от 0 до 1024) и отображение его на ЖК-экране. Затем мы также рассчитаем эквивалентное значение напряжения и отобразим его на ЖК-дисплее, помните, что наш контроллер питается от 3,3 В, поэтому даже если мы подадим 5 В на вывод АЦП, он сможет читать только от 0 до 3,3 В..
После подключения мое оборудование выглядит так, как показано ниже. Вы можете увидеть два потенциометра справа и программатор ST-link слева.
Библиотека АЦП для STM8S103F3P6
Для программирования функций ADC на STM8S мы будем использовать компилятор Cosmic C вместе с библиотеками SPL. Но для упрощения процессов я сделал еще один файл заголовка, который можно найти на GitHub по ссылке ниже.
Библиотека АЦП для STM8S103F3P6
Если вы знаете, что делаете, вы можете создать файл заголовка, используя приведенный выше код, и добавить его в каталог «включаемые файлы» на странице вашего проекта. В противном случае следуйте инструкциям по началу работы с руководством по STM8S, чтобы узнать, как настроить среду программирования и компилятор. Когда ваша установка будет готова, ваша IDE должна иметь следующие файлы заголовков, по крайней мере, те, которые обведены красным.
Приведенный выше заголовочный файл состоит из функции ADC_Read () . Эта функция может быть вызвана в вашей основной программе для получения значения АЦП на любом выводе. Например, ADC_Read (AN2) вернет значение АЦП на выводе AN2 в качестве результата. Функция показана ниже.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ВКЛЮЧИТЬ); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); результат = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Как видите, мы можем передать в эту функцию восемь параметров, и это определяет, как настроен АЦП. В коде нашей библиотеки, приведенном выше, мы установили непрерывный режим преобразования, а затем получили номер канала, переданный параметром. Затем мы должны установить частоту процессора нашего контроллера, по умолчанию (если вы не подключили внешний кристалл), ваш STM8S будет работать с внутренним генератором 16 МГц. Итак, мы упомянули « ADC1_PRESSEL_FCPU_D18 » как значение предварительного масштабирования. Внутри этой функции мы используем другие методы, определенные в заголовочном файле SPL stm8s_adc1.h . Мы начинаем с деинициализации контактов АЦП, а затем с ADC1_Init () для инициализации периферийного устройства АЦП. Определение этой функции из руководства пользователя SPL показано ниже.
Затем мы устанавливаем внешний триггер с помощью таймера и отключаем внешний триггер, поскольку мы не будем его здесь использовать. Затем у нас есть выравнивание, установленное вправо, и последние два параметра используются для установки триггера Шмитта, но мы отключим его для этого урока. Короче говоря, наш АЦП будет работать в режиме непрерывного преобразования на необходимом выводе АЦП с отключенным внешним триггером и триггером Шмитта. Вы можете проверить таблицу, если вам нужна дополнительная информация о том, как использовать внешний триггер или параметр триггера Шмитта, мы не будем обсуждать это в этом руководстве.
Программа STM8S для считывания аналогового напряжения и отображения на ЖК-дисплее
Полный код, используемый в файле main.c, можно найти внизу этой страницы. После добавления необходимых файлов заголовков и исходных файлов вы сможете напрямую скомпилировать основной файл. Объяснение кода в основном файле выглядит следующим образом. Я не буду объяснять программу ЖК-дисплея STM8S, поскольку мы уже обсуждали это в предыдущем уроке.
Целью кода будет считывание значений АЦП с двух выводов и преобразование их в значение напряжения. Мы также будем отображать как значение АЦП, так и значение напряжения на ЖК-дисплее. Итак, я использовал функцию LCD_Print Var, которая принимает переменную в целочисленном формате и преобразует ее в символ для отображения на ЖК-дисплее. Мы использовали операторы простого модуля (%) и деления (/), чтобы получить каждую цифру из переменной и вставить такие переменные, как d1, d2, d3 и d4, как показано ниже. Затем мы можем использовать функцию LCD_Print_Char для отображения этих символов на ЖК-дисплее.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Затем под основной функцией объявлены четыре переменные. Два из них используются для сохранения значения АЦП (от 0 до 1024), а два других используются для получения фактического значения напряжения.
беззнаковое int ADC_value_1 = 0; беззнаковый int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Затем мы должны подготовить контакты GPIO и конфигурацию часов для считывания аналогового напряжения. Здесь мы будем считывать аналоговое напряжение с контактов AIN2 и AIN6, которые являются контактами PC4 и PD6 соответственно. Мы должны определить этот вывод в плавающем состоянии, как показано ниже. Мы также включим тактовую периферию для АЦП.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ВКЛЮЧИТЬ); // Включение периферийных часов для ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Теперь, когда контакты готовы, нам нужно войти в бесконечный цикл while, чтобы прочитать аналоговое напряжение. Поскольку у нас есть файл заголовка, мы можем легко прочитать аналоговое напряжение с контактов AIN2 и AIN 6, используя следующие строки.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Следующим шагом является преобразование этого показания АЦП (от 0 до 1023) в аналоговое напряжение. Таким образом, мы можем отобразить точное значение напряжения, подаваемое на контакты AIN2 и AIN6. Формулы для расчета аналогового напряжения могут быть представлены следующим образом:
Аналоговое напряжение = показание АЦП * (3300/1023)
В нашем случае на контроллерах STM8S103F3 у нас есть АЦП с 10-битным разрешением, поэтому мы использовали 1023 (2 ^ 10) . Также в нашей разработке контроллер питает 3,3 В, что составляет 3300, поэтому мы разделили 3300 на 1023 в приведенных выше формулах. Примерно 3300/1023 даст нам 3,226, поэтому в нашей программе у нас есть следующие строки для измерения фактического напряжения АЦП с использованием напряжения АЦП.
ADC_voltage_1 = ADC_value_1 * (3,226); // (3300/1023 = ~ 3.226) преобразовываем значение АЦП 1 в 0 в 3300 мВ ADC_voltage_2 = ADC_value_2 * (3.226); // преобразовываем значение АЦП 1 в 0 в 3300 мВ
Оставшаяся часть кода используется только для отображения этих четырех значений на ЖК-экране. У нас также есть задержка в 500 мс, поэтому ЖК-дисплей обновляется каждые 500 мс. Вы можете уменьшить это количество, если вам нужны более быстрые обновления.
Считывание аналогового напряжения с двух потенциометров с помощью STM8S
Скомпилируйте код и загрузите его на свою доску разработки. Если вы получите какую-либо ошибку компиляции, убедитесь, что вы добавили все файлы заголовков и исходные файлы, как обсуждалось ранее. После загрузки кода вы должны увидеть небольшое приветственное сообщение «ADC on STM8S», а затем вы должны увидеть экран ниже.
Значения D1 и D2 указывают значение АЦП с выводов Ain2 и AIN6 соответственно. С правой стороны у нас также отображаются эквивалентные значения напряжения. Это значение должно быть равно напряжению на контактах AIN2 и AIN6 соответственно. Мы можем проверить то же самое с помощью мультиметра, мы также можем изменить потенциометры, чтобы проверить, изменяется ли значение напряжения соответственно.
Полную работу также можно посмотреть на видео ниже. Надеюсь, вам понравился урок и вы узнали что-то полезное, если у вас есть какие-либо вопросы, оставьте их в разделе комментариев ниже. Вы также можете использовать наши форумы, чтобы начать обсуждение или задать другие технические вопросы.