[i] Работа с блоком контроллера захвата на МК К1986ВК01GI в режимах захвата и ШИМ

ID статьи: 27702
Дата последнего изменения: 17.10.2022 16:02:22
В микроконтроллере К1986ВК01GI был реализован отдельный блок для того, чтобы иметь возможность фиксировать отдельные события, происходящие в микроконтроллере, и делать это с высокой точностью, что важно в отказоустойчивом оборудовании.

Блок имеет название "Модуль захвата", а также следующие особенности и функции:

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

Внизу статьи расположен небольшой проект для IDE Keil (написан на базе официального установочного пака для IDE Keil под микроконтроллер К1986ВК01GI), затрагивающий основные положения при работе с контроллером захвата, которые разбираются как в комментариях по коду, так и будут рассмотрены далее в этой статье.

Принцип работы контроллера захвата в режимах захвата и ШИМ и его инициализация

В микроконтроллере реализовано четыре независимых модуля контроллера захвата CAP0, CAP1, CAP2 и CAP3. Каждый из модулей использует один вывод. В силу большого количества возможных функций работы отдельного взятого вывода, работать с каждым блоком можно с разных выводов, что реализовано во внутренней логике работы микроконтроллера. Наглядно продемонстрировано на рисунке 1:


Рисунок 1 - Таблица соответствия выводов и различных функций

Из рисунка 1 в выделенной красной области можно видеть, что для 13 функции каждого вывода реализована работа с модулем захвата. Например, работать с модулем захвата CAP0 можно как на выводе PB11, так и на выводе PB12.

Перед конфигурацией выводов нужно определить режим работы: захват событий или ШИМ. Если выбран режим захвата, то используемый вывод должен работать как вход, а если ШИМ, то как выход. 

Контроллер захвата имеет в себе следующие регистры, отдельные из них есть необходимость прокомментировать:
  1. TSCTR - это 32-х разрядный счётчик.
  2. CTRPHS - регистр со значением для синхронизации счёта таймера в каждом из четырех независимых блоков захвата CAP0-CAP3.
  3. Регистры CAP1-CAP4, которые важно не путать с названиями четырех независимых блоков захвата в микроконтроллере CAP0-CAP3. Они выполняют функцию ячеек памяти захваченного значения, если используется режим захвата, и настройку периода и значения для сравнения, если применяется режим ШИМ. По логике работы все четыре регистра напоминают замкнутый сдвиговый регистр.
  4. Регистры управления и мониторинга. К ним относятся регистры ECCTL1, ECCTL2, ECEINT, ECFLG, ECCLR и ECFRC. 
В самом начале работы важно подать тактирование на блок в регистрах CAPx_CLK, где х - номер используемого независимого модуля.

Далее, в одном из регистров управления ECCTL2, в девятом бите CAP/APWM нужно установить режим работы модуля. Логический "0" выставлен по умолчанию и позволяет работать с блоком в режиме захвата, если же выставлена логическая "1", то блок будет работать в режиме ШИМ.

Режим захвата

Для возможности работы в режиме захвата нужно выставить восьмой бит CAPLDEN в регистре управления ECCTL1, который разрешает загружать регистры CAP1-4 по событию захвата, а также запустить счёт 32-х разрядного счётчика в регистре TSCTR, запуск производить записью логического "0" в регистре ECCTL2, бит под номером четыре с названием TSCTRSTOP, так как по умолчанию бит имеет значение логической "1", что указывает на то, что счётчик не работает.

По этим настройкам уже можно наблюдать работу блока. Теперь при приходе абсолютно любого фронта на используемый вывод будет произведена запись значения из регистра TSCTR в регистры CAP1-4, причем запись будет производиться последовательно, то есть сначала запись будет произведена в регистр CAP1, затем в CAP2, как только запись была произведена в регистр CAP4, далее, со следующим фронтом, запись снова будет произведена в регистр CAP1. Такая работа, где запись идёт во все четыре регистра CAP1-4 наблюдается потому, что по умолчанию блок работает в непрерывном режиме. Но можно настроить режим одиночного захвата, и это можно сделать записью логической "1" в нулевой бит CONT/ONESHT регистра ECCTL2.

Чтобы произвести фиксацию значения по срезу в регистрах CAP1-4, необходимо установить логическую "1" в регистре ECCTL1 в поля CAPxPOL, где x - номер регистра для фиксирования значения CAP1-4. Например, если будет записана логическая "1" в нулевой бит регистра ECCTL1, то когда произойдет очередная запись в регистр CAP1, то она будет выполнена уже не по фронту пришедшего сигнала, а по срезу.

По факту фиксации значения в каждом из регистров CAP1-4 могут быть разрешены прерывания по соответствующим событиям CEVT1-4. То есть, при захвате значения в регистре CAP1 возникнет прерывание по событию CEVT1, которое можно разрешить записью логической "1" в первый бит регистра ECEINT. По аналогии для других значений регистров CAP. Дополнительно разрешены прерывания по другим событиям, но наибольшее практическое применение имеют прерывания, вызванные записью в регистры CAP1-4.

Режим ШИМ + рассмотрение синхронизации

Если девятый бит регистра управления ECCTL2 выставлен в логическую "1", то последующая настройка выполняется гораздо проще, нежели работа ведётся в режиме захвата, так как теперь работать блок будет в ружиме ШИМ.

Теперь регистры CAP1-4 выполняют другое назначение, о чем было сказано при рассмотрении регистров блока. CAP1 и CAP2 выступают в качестве регистров периода и сравнения, соответственно, регистры CAP3 и CAP4 являются дублирующими регистрами для CAP1 и CAP2. Запись регистров CAP1-4 можно производить непосредственно программным способом.

В проекте для IDE Keil, который прикреплен к статье, для режима ШИМ приводится следующая настройка (опущена настройка порта для вывода ШИМ):

MDR_CAP3 -> ECCTL2 = 1 << 9; // Настройка блока захвата CAP3 в режим ШИМ
MDR_CAP3 -> CAP1 = 100; // Период
MDR_CAP3 -> CAP2 = 20; // Значение сравнения для вывода ШИМ
MDR_CAP3 -> CAP3 = 100; // Дублирование периода
MDR_CAP3 -> CAP4 = 20; // Дублирование значения сравнения для вывода ШИМ

Фрагмент кода 1

В таком случае на сконфигурированном выводе будет наблюдаться следующая осциллограмма, которая продемонстрирована на рисунке 2:


Рисунок 2 - Осциллограмма работы блока захвата в режиме ШИМ

Сигнал с рисунка 2 можно инвертировать. Достаточно записать в десятый бит APWMPOL регистра ECCTL2 логическую "1", тогда коэффициент заполнения будет инвертирован, сменится полярность сигнала.

Важно упомянуть возможность синхронизации блоков контроллера захвата. 

Применение данной функции полезно при работе с двигателями, когда необходимо синхронизировать их работу. Синхронизация возможна, когда работа контроллера ведётся в режиме ШИМ. В каждом независимом блоке CAP0-3 есть регистр фазы, называемый CTRPHS. В этот регистр можно программно записывать значения. Записью логической "1" в пятый бит SYNCI_EN регистра ECCTL2 разрешается загрузка регистра счётчика TSCTR значениями из регистра CTRPHS по событиям ВНЕШНЕЙ или ПРОГРАММНОЙ синхронизации.

Если речь идёт о внешних событиях (аппаратная обработка), то необходимо настроить биты шесть и семь SYNCO_SEL регистра ECCTL2, где выбирается источник выходного сигнала синхронизации.

Программно же синхронизацию можно производить записью логической "1" в восьмой бит SWSYNC регистра ECCTL2, что сразу же приведет к записи регистра TSCTR счётчика значениями регистра CTRPHS

Примечания ко вложенному проекту

Проект позволяет протестировать блок контроллера захвата в микроконтроллере К1986ВК01GI. Комментарии по коду позволяют разобраться с работой блока в полном объеме. Для тестирования использовалась отладочная плата третьей версии для микроконтроллера К1986ВК01GI. 

Важно отметить следующие вещи:

Наблюдать работу модуля в режиме захвата можно в режиме отладки IDE Keil при использовании стандартного файла .SFR. Режим захвата в проекте работает с модулем CAP0, адреса которого расположены с 0x40098000. Значение регистра TSCTR естественным образом будет изменяться, так как это 32-х разрядный счётчик.




Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55