Применение модуля захвата, сравнения, ШИМ в контроллерах Microchip
Фирма Microchip продолжает разработку и производство передовых продуктов, предоставляющих пользователю большую функциональность, гибкость и надежность. Микроконтроллеры PICmicro используются во многих приборах повседневного спроса — от стиральных машин и автомобильной техники до медицинских приборов. Модуль сравнения, захвата и ШИМ (ССР), который присутствует во многих микроконтроллерах Microchip, используется в основном для измерения и формирования импульсных сигналов. Расширенный модуль ССР (enhanced CCP — ECCP), имеющийся во многих новых микроконтроллерах, предоставляет дополнительные возможности для формирования широтно-импульсной модуляции (ШИМ). Модуль ЕССР обеспечивает поддержку управления мостовыми и полумостовыми схемами управления, программируемое время задержки переключения (для предотвращения протекания сквозных токов через внешние силовые ключи, связанного с их разным временем переключения) и возможность автоматического выключения ШИМ при аварийных ситуациях. Модули ССР и ЕССР имеют широкие области применения. Эта статья описывает основные принципы использования данных модулей в каждом режиме, а также «нестандартные» варианты использования в практических решениях.
Модуль захвата (capture)
В режиме захвата 16-битное значение таймера (Timer 1) захватывается в регистр CCPRxH:CCPRxL при каждом событии на входе CCPx. Событие для захвата задается в регистре CCPxCON<3:0>:
- каждый спад входного сигнала;
- каждый фронт входного сигнала;
- каждый 4-й фронт входного сигнала;
- каждый 16-й фронт входного сигнала.
Модуль захвата используется для измерения длительности между двумя событиями, например периода, длительности импульса, скважности и т. п.
Пример 1. Измерение периода дискретного сигнала (рис. 1).
- Конфигурируем управляющие биты CCPxM3:CCPxM0 (CCPxCON<3:0>) на захват по каждому фронту входного сигнала.
- Конфигурируем предделитель Timer1 так, чтобы не происходило переполнение таймера за измеряемое время.
- Разрешаем прерывание от CCP (бит CCPxIE).
- При возникновении прерывания:
- вычитаем сохраненное время (t1) из захваченного значения времени (t2) и сохраняем результат периода Т;
- сохраняем захваченное время t2.

Пример 2. Измерение периода с усреднением результата (рис. 2).
Усреднение результата измерений часто требуется при зашумленном входном сигнале. Модуль ССР в PIC-контроллерах Microchip позволяет выполнить усреднение с минимальными программными издержками.
- Конфигурируем управляющие биты CCPxM3:CCPxM0 (CCPxCON<3:0>) на захват по каждому 16-му фронту входного сигнала.
- Конфигурируем предделитель Timer1 так, чтобы не происходило переполнение таймера за измеряемое время.

- Разрешаем прерывание от CCP (бит CCPxIE).
- При возникновении прерывания:
- вычитаем сохраненное время (t1) из захваченного значения времени (t2) и сохраняем результат 16 периодов (168Т);
- сохраняем захваченное время t2;
- сдвигаем полученный результат на 4 шага вправо (деление на 16) — получаем усредненный результат за 16 периодов.
Пример 3. Измерение длительности импульса (рис. 3).
- Конфигурируем управляющие биты CCPxM3:CCPxM0 (CCPxCON<3:0>) на захват по каждому фронту входного сигнала.
- Конфигурируем предделитель Timer1 так, чтобы не происходило переполнение таймера за время измеряемого импульса.
- Разрешаем прерывание от CCP (бит CCPxIE).
- При возникновении прерывания сохраняем захваченное значение таймера (t1) и переконфигурируем захват по спаду импульса.
- При следующем прерывании вычитаем из t1 новое захваченное значение. Результат будет соответствовать длительности импульса.

Пример 4. Измерение скважности импульсов (рис. 4).
Типичный пример, где требуется такого рода измерение — это измерение ускорения. Цифровые акселерометры обычно имеют выходной сигнал со скважностью, пропорциональной ускорению движения прибора. Скважность можно измерять по следующему алгоритму.
- Конфигурируем управляющие биты CCPxM3:CCPxM0 (CCPxCON<3:0>) на захват по каждому фронту входного сигнала.
- Конфигурируем предделитель таймера 1 так, чтобы не происходило переполнение таймера за время TMAX (максимально возможная длительность периода).
- Разрешаем прерывание от CCP (бит CCPxIE).
- При возникновении прерывания сохраняем захваченное значение таймера (t1) и переконфигурируем захват по спаду импульса.
- При следующем прерывании вычитаем из t1 новое захваченное значение t2. Этот результат будет соответствовать длительности импульса (W).

- Переконфигурируем модуль ССР на захват по следующему фронту импульса.
- При возникновении прерывания вычитаем из t1 новое захваченное значение t3. Этот результат будет соответствовать периоду (Т).
- Разделить значение T на W — получим значение скважности.
- Повторять пп. 4–8 для получения следующих значений скважности.
Пример 5. Измерение скорости вращения энкодера.
Скорость вращения энкодера может быть измерена разными способами. Два наиболее часто встречающихся типа датчиков в энкодерах — это оптический сенсор и датчики Холла. Оптические энкодеры используют инфракрасный светодиод и датчик, а также колесо с прорезями, модулирующими световой поток (рис. 5). Другой тип использует чувствительные к магнитному полю датчики Холла, с помощью которых можно определять положение магнитов в электромоторе или постоянных магнитов, закрепленных на вращающемся объекте (рис. 6). Такой датчик выдает один или несколько импульсов на один оборот объекта. На рис. 7 показаны временные диаграммы при разных скоростях вращения. При увеличении скорости вращения период импульсов и их длительность становятся меньше. Период и длительность импульса пропорциональны скорости вращения. Для получения большей разрешающей способности лучше использовать датчики с несколькими импульсами на 1 оборот. Описание измерения периода для определения скорости вращения энкодера см. в примере 1, а метод усреднения измерений периода — в примере 2.



Пример 6. Измерение периода аналогового сигнала.
Микроконтроллер со встроенным аналоговым компаратором и модулем CCP или ECCP может быть легко использован для измерения периода аналогового сигнала. На рис. 8 приведен пример схемы с использованием периферийных модулей контроллера PIC16F684. Резисторы R3 и R4 задают порог срабатывания компаратора. При пересечении входным сигналом уровня порога, выходной уровень напряжения компаратора переключается между 0 и 1. Резисторы R1 и R2 задают гистерезис для предотвращения «дребезга#» при равенстве порогового и входного напряжений. Рис. 9 демонстрирует эффект гистерезиса.
Модуль ССР конфигурируется в режим захвата для измерения периода на выходе компаратора.


Модуль сравнения (compare)
В режиме сравнения 16-разрядные значения регистра CCPRx сравниваются с состоянием таймера. При совпадении происходит прерывание и вывод контроллера CCPx:
- устанавливается в 1;
- устанавливается в 0;
- состояние не меняется;
- переключается конфигурация модуля.
Реакция вывода определяется битами управляющего регистра CCPxCON<3:0>.
Триггер специальных событий
Таймер 1 обычно не сбрасывается в 0 при возникновении прерывания от модуля CCP в режиме сравнения, кроме случая конфигурации модуля в режим Триггера специального события. В этом режиме, когда значения таймера и регистра CCPRx равны, формируется прерывание, таймер 1 очищается и автоматически запускается преобразование АЦП (если это разрешено).
Работа модуля в режиме сравнения подобна функции таймера в обычном секундомере. В случае секундомера определенное время загружается в часы и производится отсчет в обратном порядке с установленного времени до достижения нуля. Отличие работы таймера в режиме сравнения заключается в том, что время отсчитывается от нуля до установленного значения. Этот способ полезен для того, чтобы произвести определенные действия в точные интервалы времени. Обычный режим работы таймера может использоваться для исполнения тех же самых функций, однако в этом случае таймер нужно будет перезагружать каждый раз. Режим сравнения также может автоматически изменять состояние вывода CCPx.
Пример 7. Формирование модулирующих импульсов для различных форматов передачи данных.
Модуль ССР в режиме сравнения может использоваться для формирования различных форматов модуляции. На рис. 10–12 приведены различные варианты представления 0 и 1 в различных форматах передачи данных. Передача данных похожа на асинхронную передачу данных, содержащую СТАРТ-бит, восемь информационных бит и СТОП-бит. Время ТЕ является базовым временным элементом в каждом формате модуляции и задает скорость передачи данных. Триггер специального события может использоваться для формирования времени ТЕ. При возникновении прерывания от CCP подпрограмма обработки прерывания формирует требуемый формат передачи данных.



Пример 8. Формирование 16-разрядной ШИМ.
Обычно стандартные модули ШИМ имеют разрядность в 10 бит. Модуль ССР в режиме сравнения может использоваться для формирования ШИМ с 16-разрядной точностью. Для этого:
- Настраиваем модуль ССР на установку вывода ССРх в «0» в режиме сравнения.
- Разрешаем прерывание от Timer1.
- Записываем значение периода в Timer1 и его предделитель.
- Устанавливаем длительность импульса в регистр сравнения CCPRxL и CCPRxH.
- Устанавливаем выход ССРх в «1» при возникновении прерывания от переполнения Timer1. Следует заметить, что маленькие значения длительности импульса не могут быть сформированы из-за конечного времени обработки прерывания от Timer1. Это не сказывается на периоде формируемого сигнала, так как время выполнения прерывания от периода к периоду будет одинаковым.
Таймер Timer1 имеет четыре значения предделителя: 1:1, 1:2, 1:4 и 1:8. Возможная формируемая частота рассчитывается по формуле:

Для микроконтроллера, работающего на частоте FOSC = 20 МГц, значения частот FPWM будут составлять 76,3 Гц, 38,1 Гц, 19,1 Гц и 9,5 Гц.
Пример 9. Последовательное измерение с помощью АЦП.
Триггер специального события в режиме сравнения (при совпадении значения Timer1 и регистра сравнения CCPRxL и CCPRxH) может формировать периодические прерывания и дополнительно автоматически запускать измерения АЦП. Покажем на примере, как организовать последовательный опрос АЦП в четко определенные моменты времени.
Пример. Микроконтроллер PIC16F684 работает от внутреннего генератора, сконфигурированного на работу с частотой 8 МГц. Нужно последовательно опрашивать каналы АЦП и измерять входное напряжение на выводах RA0, RA1 и RA2 через каждые 30 мс.
Таймер 1 переполняется через время TOSC × 65536 × 4 × предделитель. Для предделителя 1:1 таймер переполнится через 32,8 мс. Значение регистра CCPR1 рассчитывается по формуле:

Модуль ЕССР должен быть сконфигурирован в режим триггера специального события. Этот режим формирует прерывание при совпадении значения Timer1 и регистра сравнения CCPRxL и CCPRxH. Для этого режима CCP1CONТ = ‘b00001011’. При возникновении прерывания таймер автоматически очистится и установит бит GO в регистре ADCON0 для запуска преобразования АЦП. Когда произойдет прерывание от модуля ECCP, нужно выбрать следующий вход АЦП с помощью регистра ADCON0.

