50 оттенков ПНЯ* АЦП и АЦП с вычислителем микроконтроллеров Microchip

  • ПНЯ — Периферия Независимая от Ядра в микроконтроллерах Microchip, известная так же как CIP — Core Independent Peripheral.

Предыдущие статьи [1] и [2] были посвящены таким частям (ПНЯ) Периферии Независимой от Ядра микроконтроллеров (МК) Microchip как конфигурируемым логическим ячейкам и портам ввода/вывода с новой полезной функцией ограничения тока.

Сейчас рассмотрим Аналого-Цифровой Преобразователь (АЦП) и в особенности новый АЦП с поствычислителем. Как вы наверное уже привыкли  новые особенности периферии могут помочь в реализации специфических функций и упростить код под PIC микроконтроллеры.

В отличие от предыдущих частей, в этой будет чуть больше теории и чуть меньше примеров.


  • Обзор возможностей АЦП
    • Триггер запуска
    • УВХ, CVD, Двойное преобразование
    • Поствычислитель, фильтрация, усреднение

  • Примеры конфигурирования
    • Автозапуск, фильтрация
    • Автозапуск, CVD, усреднение, прерывание по сравнению с порогами
    • Автозапуск, дифференциальный CVD, серия преобразований, усреднение

  • Итоги

АЦП с полной уверенностью можно назвать Периферией Независимой от Ядра, так как АЦП имеет вариант тактирования от встроенного RC-генератора и может выполнять преобразование в режиме сохранения энергии Sleep. Но этим независимость не ограничивается. Многие семейства PIC16F1xxx имеют АЦП с возможностью старта по событиям, а совсем новые семейства PIC16F188xx получили еще и поствычислитель.

Рассмотрим возможности АЦП на примере МК семейства PIC16F18855/75

АЦП контроллеров этого семейства имеет:


  • 8-и битный таймер предвыборки (Acquisition Timer)
  • Аппаратную поддержку Емкостного делителя напряжения (Capacitive Voltage Divider, CVD):
    • 8-и разрядный таймер предзаряда
    • Массив конденсаторов подстройки емкости УВХ
    • Выходной драйвер защитного кольца (Guard ring)

  • Автоматическое повторение операций и последовательностей (Automatic repeat and sequencing):
    • автоматизированное двойное преобразование для CVD
    • Два набора регистров результата (результат и предыдущий результат)
    • Триггер автопреобразования
    • Внутренний «ретриггер» (Internal retrigger)

  • Возможности вычислителя:
    • Усреднение и Фильтр Низких Частот
    • Сравнение с опорным значением
    • 2-х уровневое пороговое сравнение
    • Выбираемые прерывания

АЦП с поствычислителем состоит из нескольких блоков (рис. 1):


b5a8e27c0958495a80ef14f86ac6ff29.png

Рис. 1. Структура АЦП с вычислителем в семействе PIC16F18855.


Триггер запуска АЦП

Прошли те времена, когда для запуска измерения АЦП нужно было «вручную» установить бит. Теперь АЦП может запускаться ещё по следующим событиям:


  • внешний вход;
  • срабатывание таймеров (общего назначения и SMT — 24-х битных таймеров измерения сигналов);
  • выход модуля сравнения и ШИМ;
  • срабатывание компаратора;
  • изменение состояния входов настроенных как прерывание по изменению состояния;
  • выход логических ячеек;
  • чтение результата измерения АЦП;
  • изменение номера канала АЦП.


УВХ и CVD

Устройство выборки/хранения (УВХ) получило дополнительные возможности, в основном связанные с упрощением определения емкости подключенной ко входу АЦП. В первую очередь это помогает в создании интерфейсов с емкостными (сенсорными) кнопками.

Microchip предлагает определять емкость сенсора с помощью емкостного делителя напряжения (Capacitive Voltage Divider, CVD).

Суть метода сводится к следующему. На первом шаге (см.рис. 2) вход сенсора подключается к «земле» (его емкость разряжается), а канал АЦП к напряжению питания, емкость УВХ заряжается.
Затем вход сенсора подключается к УВХ АЦП, происходит перераспределения заряда между емкостью сенсора и емкостью УВХ. Затем производится измерение напряжения на емкости УВХ.


управление входом при CVD форма сигналов CVD
544f37cc90a742b79c4095ed79a023e7.png 99c61ccd94994f6b9d972880421fb325.png

Рис. 2. Диаграммы поясняющие измерение емкости с помощью емкостного делителя напряжения.

При касании сенсора будет изменяться его емкость, а значит мы будем фиксировать разные установившиеся значения напряжения на емкости УВХ.
Для уменьшения влияния наведенных помех на сенсор и/или оператора, применяется дифференциальный CVD, состоящий из двух последовательных измерений с помощью CVD, но на второй стадии инвертируем заряды на сенсоре и УВХ (сенсор заряжаем до напряжения питания, а емкость УВХ разряжаем, см. рис. 3).


3a69b991f0dc46009a709d7dcabd8abe.png

Рис. 3. Диаграмма сигналов при дифференциальном CVD.

Подробно про емкостные сенсоры, метод дифференциального CVD и управление защитным проводником можно почитать по ссылке [2].

Новый АЦП с поствычислителем для поддержки и автоматизации CVD имеет следующие функции:


  • таймер предзаряда (precharge)
  • управление последовательностью заряда (нужной полярности), запуск измерения;
  • подключение дополнительных внутренних емкостей к УВХ;
  • два последовательных измерения;
  • вычисление разницы между двумя измеренными значениями;
  • управление драйвером «защитным кольцом» (guard ring).

Таким образом, АЦП в автоматическом режиме может выполнить дифференциальный CVD и предоставить нам готовый результат.


Функции поствычислителя

Поствычислитель осуществляет несколько функций.


Фильтрация

Модуль АЦП может работать в одном из пяти режимов:

Базовый режим. В этом режиме АЦП может производить одно или два измерения, после каждого может выставляться флаг прерывания.

Накопление. По каждому измерению результат суммируется с аккумулятором и инкрементируется счетчик измерений.

Усреднение. По каждому измерению результат суммируется с аккумулятором и инкрементируется счетчик измерений. По достижению заданного числа повторений результат делится и попадает в модуль сравнения, а следующее измерение сбросит счетчик в 1 и значение аккумулятора замениться на результат первого измерения.

Усреднение очередью. По запуску АЦП происходит очистка аккумулятора и счетчика измерений и производится серия измерений заданное число раз, после чего результат делится и поступает в модуль сравнения.

Фильтр Нижних частот. Каждое измеренное значение проходит через ФНЧ. По завершению заданного числа измерений результат попадает в модуль сравнения.


Вычисление ошибки

По завершению каждого вычисления результат фиксируется до окончания следующего измерения. Так же вычисляется разница между:


  • текущим и предыдущим измерением (первая производная от одиночного измерения);
  • двумя результатами в режиме измерения CVD (вычисляется дифференциальный CVD);
  • текущим результатом и константой (setpoint);
  • текущим результатом и фильтрованным значением;
  • текущим и предыдущим фильтрованными значениями (первая производная фильтрованного результата);
  • фильтрованным значением и константой (setpoint).

Если вычислять разницу не нужно, то можно выбрать вычисление разницы между константой равной нулю.


Сравнение с пороговыми значениями

Результат вычисления ошибки сравнивается с верхним и нижним порогом. Дополнительно может формироваться прерывание если:


  • ошибка меньше чем нижний порог;
  • ошибка больше или равна нижнему порогу;
  • ошибка лежит между порогами;
  • ошибка за пределами порогов;
  • ошибка меньше или равна верхнему порогу;
  • ошибка больше верхнего порога;
  • формирование прерывания вне зависимости от результата сравнения с порогами (этот режим может быть полезен для фиксации самого факта сравнения, т.е. когда, например, нужно получить данные фильтрации/усреднения после N-измерений, а не прерывание после каждого измерения).


Примеры конфигурирования АЦП


Автозапуск, Фильтрация

Данный пример показывает конфигурацию АЦП в плагине Mplab Code Configurator (MCC) для выполнения следующих действий:


  • таймер Timer2 настроен на срабатывание раз в 1 мс;
  • АЦП запускается по срабатыванию таймера. АЦП осуществляет предвыборку и измерение, результат попадает в фильтр. После накопления 32-х фильтрованных измерений производится сдвиг на 5 бит (деление на 32) и выставляется запрос на прерывание.
    Программе нужно лишь по прерыванию считать из регистра полученное фильтрованное значение.


1dd537127aba46a9af9b4fb1c17dd2e8.png

Рис. 4. Настройки АЦП с вычислителем.


4ccb00f1db3f476e80c62c22d8c8a21e.png

Рис. 5. Считывание «сырых» и фильтрованных данных с АЦП.


Автозапуск, CVD, усреднение, прерывание по сравнению с порогами

За основу этого примера взята реализация «быстрое создание емкостного сенсора» из microchip.wikidot.com [5].

Выбрана следующая конфигурация:


  • таймер Timer2 настроен на срабатывание раз в 10 мс
  • АЦП запускается по срабатыванию таймера Timer 2. АЦП производит измерения методом CVD и вычисляет среднее значение 32-х измерений. После выполнения 32-х измерений и накопления результата выполняется деление на 32 (сдвиг на 5) и если итоговое значение лежит вне пороговых значений, то формируется запрос на прерывание, таким образом сообщается о «касании» и «отпускании» сенсорной кнопки (на самом деле в данном примере прерывание формируется каждый раз, так как кнопка либо нажата, либо нет и не имеет промежуточных состояний))


6c4af7fc65354f088ee497f3cdcc46ac.png

Рис. 6. Настройки АЦП для CVD.


7d6822ba29684d188a39ab67f9db8c00.png

Рис. 7. Реакция на касание сенсорной кнопки при одиночном CVD.

Настройка порога нам может дать прерывание не по каждому измерению/серии измерений с фильтрацией, а по касанию «кнопки».


Автозапуск, дифференциальный CVD, серия преобразований, усреднение

В данном примере используется следующая конфигурация периферии:


  • таймер Timer2 настроен на срабатывание раз в 10 мс
  • АЦП запускается по срабатыванию таймера (см.рис 8, п.1). АЦП производит последовательные измерения методом дифференциального CVD (п.2) с изменением полярности (п.3), вычисляет производную (разницу между 2-я CVD) (п.4), АЦП настроен на вычисление среднего значения (п.5) 32-х измерений (п.6). После выполнения 32-х пар измерений и накопления результата выполняется деление на 32 (п.7) и запрос на прерывание (п.8), последовательные измерения останавливаются (п.9) до следующего срабатывания триггера запуска (Timer2)


0fe1047a0e774e67b2a2e6f177be6060.png

Рис. 8. Настройки АЦП для варианта дифференциального CVD.


4a94f3411e5245f7a12ffea9b56bf5d1.png

Рис. 9, Диаграмма на входе сенсора с дифференциальным CVD


a6b03007e556425ea020f54f419d7003.png

Рис. 10. Реакция на касание сенсорной кнопки при дифференциальном CVD

Из сравнения CVD (рис. 7) и дифференциального CVD (рис. 10) видно, что второй отличается более «чистым» сигналом с большей амплитудой.

Вся описанная последовательность действий выполняется полностью автоматически и независимо от ядра — в это время МК может выполнять какие-то другие действия или находиться в режиме микропотребления Sleep. По прерыванию остается считать усредненное значение результата измерений.


Итоги

Мы рассмотрели еще одну часть Периферии Независимой от Ядра — АЦП с вычислителем в микроконтроллерах Microchip. Некоторые возможности, например запуск по триггеру, или CVD присутствуют во многих семействах PIC16F1xxx, но новая «фича» — ADCC (АЦП с вычислителем), появилась в семействе PIC16F188xx (PIC16F18855 и др.).

Периферия независимая от ядра интересна сама по себе, но наибольшую пользу может принести возможность синтеза функциональных блоков, т.е. совместное использование нескольких периферийных модулей для решения конкретных задач. В этом случае тактовая частота, быстродействие и разрядность ядра уходят на второй план — аппаратная часть выполняет специализированные функции, а ядро занимается программной поддержкой изделия.

P.S.
Вопрос к читателям. Стоит ли выкладывать исходники к примерам под какую-то конкретную (дешевую) демо-плату или из описаний и так все понятно и примеры кода не нужны?

Литература:


  1. Конфигурируемые Логические Ячейки в PIC контроллерах
  2. 50 оттенков ПНЯ. Порты ввода/вывода
  3. Технология mTouch. Создание емкостных клавиатур, сенсоров и экранов.
  4. PIC16(L)F18855/75 Data Sheet. www.microchip.com

© Geektimes