STM8L-Аналого-Цифровой Преобразователь (АЦП)
Сегодня кратенько о модуле АЦП. Плюс полный проект с примером.
В отличии от STM32, в микроконтроллерах серии STM8L модуль АЦП более простой, но в то же время более “продвинутый”, чем например AVR-ках.
Модуль АЦП Кратенько рассмотрим что же “может” АЦП:
- разрешение 12, 10, 8, 6-бит
- режимы одиночного и циклического преобразования
- возможность подключения к встроенному ИОН и датчику температуры
- время преобразования до 1 мкс, при тактовой частоте МК 16 МГц
- возможность установки времени преобразования
- аналоговый сторожевой триггер (не уверен в правильности интерпретирования “analog watchdog”)
- возможность работы с контроллером DMA
- и это ещё не все, читайте в документации RM0031.
Функциональная схема модуля АЦП:
Для начала работы с АЦП необходимо:
- разрешить тактирование модуля
- сконфигурировать необходимый режим работы
Максимальная частота для модуля АЦП составляет 16 МГц, при частоте системной шины 16 МГц. Я опять пропустил модуль тактирования, так как после сброса микроконтроллер работает от встроенного RC генератора частотой 16 МГц, с коэффициентом деления 8, т.е. на частоте 2 МГц, чего более чем достаточно на данном этапе.
Разрешим тактирование модуля:
CLK->PCKENR2 |= CLK_PCKENR2_ADC1;
Начать я думаю можно с простого режима однократного преобразования одного канала (точнее канал то у нас всегда один, так как физически у нас одно АЦП с мультиплексором).
Определившись с линией ввода-вывода необходимо её сконфигурировать, я выбрал линию PA6:
Однако после этого необходимо отключить триггер Шмитта, в регистре ADC_TRIGR (ADC trigger disable) для соответствующей линии, в моем случае это нулевой вход мультиплексора:
Вход выбран и настроен, можно перейти к настройке режима работы АЦП.
По умолчанию разрешена работа АЦП с блоком ПДП (DMA), пока он нам не нужен отключим его:
Модуль АЦП может последовательно преобразовывать несколько каналов, нам пока нужен лишь один канал:
Зададимся временем преобразования (48 тактов):
Осталось только выбрать разрешение (8-бит), режим однократного преобразования и включить АЦП:
Для запуска преобразований достаточно программного запуска:
После подождать окончания преобразования:
и считать полученный результат:
Ну вот и всё ;)
Примечание. На форуме попадалось высказывание что АЦП не очень хорошее в связи со встроенным ИОН, и результат “пляшет” очень сильно. У меня результат такой при 6,8,10 битах иногда переключается последний разряд, при 12 битах +-2 единицы. Это без фильтрации 50 Гц, и длинных проводках до переменного резистора (номинал 50 кОм (импортный, в наш ряд не попадает)).
Тестовый проект
На основе рассмотренного выше примера работы с АЦП, я написал маленький пример. Напряжение на вход АЦП подаю с делителя напряжения (аналогично примеру с STM32), результат преобразования вывожу на два индикатора. Подключение индикаторов прописано в файле main.h:
Задержка реализована простым программным циклом:
Основной цикл:
[download id="32"]
comments powered by Disqus