Файл для работы с модулем PWM (ШИМ)

May 25, 2014 by admin Комментировать »

Для управления моторами используются встроенные в микроконтроллер модули PWM Ранее, когда программа создавалась в MicroC, мы использовали встроенные в эту программу библиотечные компоненты В компиляторе SDCC нет таких компонентов, хотя есть много полезного В примере с программой «помигать светодиодами» мы уже столкнулись с необходимостью создать функцию паузы, задержки Если и не очень элегантно, но достаточно понятно,   мы   эту   функцию   создали   Теперь   постараемся   разобраться,   как   повторить   это

«достижение» в отношении встроенного модуля PWM

Начать  я предлагаю  с чтения  справки  к микроконтроллеру  PIC16F887, обратившись  к разделу Enhanced Capture/Compare/PWM (CCP1):

Модуль Enhanced Capture/Compare/PWM – это периферия, которая позволяет пользователю обращаться к времени и управлять разными событиями В режиме Capture периферия позволяет оценивать длительность событий Этот режим позволяет пользователю переключать внешние события, когда предопределённый интервал времени истекает Режим PWM может генерировать модулирующий импульсный сигнал с меняющейся частотой и скважностью

Далее показан регистр CCP1CON:

Рис 481 Название битов регистра CCP1CON И назначение его битов:

Биты 7-6

P1M<1:0>: Биты конфигурации выхода PWM Если CCP1M<3:2> = 00, 01, 10:

xx = P1A назначен как Capture/Compare вход P1B, P1C, P1D назначены как выводы порта Если CCP1M<3:2> = 11:

00 = Единичный выход P1A модулирован P1B, P1C, P1D назначены как выводы порта

01 = Прямой полномостовой выход P1D модулирован P1A активен P1B, P1C не активны

10 = Полумостовой выход P1A, P1B модулированы с мёртвой зоной управления P1C, P1D выводы порта

11 = Инверсный полномостовой выход P1B модулирован P1C активен P1A, P1D не активны

Биты 5-4

DC1B<1:0>: длительности PWM минимально значимые биты Режим захвата (Capture):

Не используются

Режим сравнения (Compare): Не используются

Режим PWM:

Эти биты – два LSbs (биты младшего байта) длительности PWM (duty cycle) Восемь MSbs (биты старшего байта) находятся в CCPR1L

Биты 3-0

CCP1M<3:0>: Биты выбора режима ECCP

0000 = Capture/Compare/PWM выключено (сброс ECCP модуля)

0001 = Не используется (зарезервировано)

0010 = Режим сравнения (Compare), переключает соответствующий выход (CCP1IF бит установлен)

0011 = Не используется (зарезервировано)

0100 = Режим захвата (Capture), каждый спадающий фронт

0101 = Режим захвата, каждый нарастающий фронт

0110 = Режим захвата, каждый 4й нарастающий фронт

0111 = Режим сравнения, каждый 16й нарастающий фронт

1000 = Режим сравнения (Compare), устанавливает соответствующий выход (бит CCP1IF установлен)

1001 = Режим сравнения, очищает соответствующий выход (бит CCP1IF установлен)

1010 = Режим сравнения, генерация соответствующего программного прерывания (CCP1IF установлен, вывод CCP1 не меняется)

1011 = Режим сравнения, переключается специальное событие (бит CCP1IF установлен CCP1 сбрасывает TMR1 или TMR2)

1100 = Режим PWM P1A, P1C активный высокий уровень P1B, P1D активный высокий уровень 1101 = Режим PWM P1A, P1C активный высокий уровень P1B, P1D активный низкий уровень 1110 = Режим PWM P1A, P1C активный низкий уровень P1B, P1D активный высокий уровень 1111 = Режим PWM P1A, P1C активный низкий уровень P1B, P1D активный низкий уровень

Регистр CCP2CON:

Рис 482 Название битов регистра CCP2CON Назначение битов регистра:

Биты 7-6 Не поддерживаются: читаются как «0»

Биты 5-4

DC2B<1:0>: длительности PWM минимально значимые биты Режим захвата (Capture):

Не используются

Режим сравнения (Compare): Не используются

Режим PWM:

Эти биты – два младших бита LSbs длительности PWM (duty cycle) Восемь MSbs находятся в CCPR2L

Биты 3-0

CCP2M<3:0>: Биты выбора режима CCP2

0000 = Capture/Compare/PWM выключено (сброс модуля CCP2) 0001 = Не используется (зарезервировано)

0010 = Не используется (зарезервировано) 0011 = Не используется (зарезервировано)

0100 = Режим захвата (Capture), каждый спадающий фронт 0101 = Режим захвата, каждый нарастающий фронт

0110 = Режим захвата, каждый 4й нарастающий фронт 0111 = Режим захвата, каждый 16й нарастающий фронт

1000 = Режим сравнения (Compare), устанавливает соответствующий выход (бит CCP2IF установлен) 1001 = Режим сравнения, очищает соответствующий выход (бит CCP2IF установлен)

1010 = Режим сравнения, генерируется программное соответствующее прерывание (бит CCP2IF установлен, CCP2 вывод не меняется)

1011 = Режим сравнения, переключает специальное событие (бит CCP2IF установлен, TMR1 сбрасывается и преобразование A/D начинается, если разрешено в модуле ADC Вывод CCP2 не меняется)

11xx = Режим PWM

И дальше следуют пояснения по режимам захвата, сравнения и того режима, который интересует нас сейчас, режима PWM

Режим PWM

В  режиме  PWM  генерируется  широтно-импульсный  сигнал  на  выводах  CCPx  Длительность импульса, период и разрешение определяются следующими регистрами:

•      PR2

•      T2CON

•      CCPRxL

•      CCPxCON

В режиме широтно-импульсной модуляции (PWM) модуль CCP производит до 10-битового разрешения PWM выхода на выводы CCPx Поскольку выводы CCPx мультиплексированы с защёлкой данных порта, TRIS для этих выводов должен быть очищен для разрешения использования выводов, как выходов драйвера CCPx

Следующие страницы, где приведены диаграмма формирования ШИМ и схема устройства этого модуля, я надеюсь, вы прочтёте, а я хочу привести раздел с описание того, как начать формирование ШИМ:

Задание PWM операций

Следующие шаги должны быть выполнены при конфигурировании CCP модуля для выполнения PWM операций:

1         Запретите использовать выводы PWM (CCPx) выходов драйверов как входы, установив связанные с ними биты TRIS

2         Установите период PWM загрузкой PR2 регистра

3         Сконфигурируйте    CPP    модуль    для    режима    PWM    загрузкой    CCPxCON    регистра соответствующими значениями

4         Задайте  длительность  импульса  PWM  загрузкой  CCPRxL  регистра  и  DCxB<1:0>  битов регистра CCPxCON

5         Сконфигурируйте и запустите Timer2:

·                Очистите флаг прерывания TMR2IF регистра PIR1

·                Установите   значение   предделителя   Timer2   загрузкой   T2CKPS   битов   регистра T2CON

·                Разрешите работу Timer2, установив бит TMR2ON регистра T2CON

6         Разрешите выход PWM после того, как начался новый цикл PWM:

·                Дождитесь переполнения Timer2 (бит TMR2IF регистра PIR1 установлен)

·                Разрешите выход драйверов выводов CCPx очисткой связанных с ними битов TRIS Что было упущено мною в этом описании Регистры PR2, PIR1 и T2CON Найдём и приведём ниже формат этих регистров

Рис 483 Биты регистров PIR1 и T2CON

Регистр PR2 полностью служит для записи значения

Напомню, как подключаются двигатели (для них мы и используем PWM) в ROBOPICA:

Рис 484 Подключение двигателей робота ROBOPICA

Не мудрствую лукаво, следуя рекомендованным шагам, попробуем получить сигнал PWM

Проделаем все шаги для одного двигателя, подключённого к RD0 и RD1, вывод RC2 – выход ССР1, для программы:

#include <pic16f887h> typedef unsigned int word

word at 0x2007 CONFIG1 = 0x2FF2 // первое слово конфигурации void main()

{

TRISC2 = 1

PR2 = 0xFF      // период

CCP1CON = 0x3C  // двоичное 00111100 CCPR1L =0x10    // длительность

PIR1 &amp= 0xFD    // очистка флага

T2CON = 1       // предделитель таймера TMR2ON = 1      // разрешение работы таймера while (TMR2IF == 0)

TRISC2 = 0

while(1)

{

}

}

Оттранслируем программу, и посмотрим на результат работы этой программы (на макетной плате или в программе)

Рис 485 Работа пробной программы

Прежде, чем двигаться дальше, давайте посмотрим, как влияет изменение параметров на характер импульсных сигналов В первую очередь разберёмся  с младшими  битами  LSbs, назначение которых мне не совсем ясно Если их обнулить, то в регистр CCP1CON следует записать число (шестнадцатеричное) 0x0C Посмотрим, изменится ли, и как, если да, импульс на выходе RC2

Рис 486 Вид импульсов после замены младших битов

Влияние этих двух битов пока оценить трудно Вернём их единичное значение и изменим содержимое регистра CCPR1L, я сразу задам, скажем, 0xFF

Рис 487 Продолжение эксперимента с изменением значения регистра  CCPR1L

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

То есть:

PR2 = 10  // период CCPR1L =5 // длительность

Рис 488 Проверка программы с заданными параметрами длительности и периода

Период и длительность, заданные в десятичном виде, соответствуют этим значениям в микросекундах Таким образом, максимальный период в этом случае 255 мкс

Если такая частота велика для управления двигателем, то, что мы можем сделать, чтобы уменьшить частоту

У нас есть регистр, в котором задаётся режим деления частоты, предделитель таймера Увеличим значение в этом регистре до 3:

T2CON = 3       // предделитель таймера

Напомню, что два младших бита определяют режим работы предделителя

Рис 489 Работа программы с изменённым параметром предделителя

Что ж, частота около 1 кГц Кстати, звук, который может издавать робот, это сигнал с частотой около 2 кГц

И ещё одно, о чём я забыл упомянуть Регистр ANSEL, который имеет старший байт ANSELH В этом регистре производится переключение портов с аналогового входа на цифровой ввод-вывод

Если вы посмотрите программу ROBOPIC’а, то увидите такие строки:

ANSELHF0=0 // RB1 ==> Цифровой Ввод/Вывод ANSELHF2=0 // RB2 ==> Цифровой Ввод/Вывод

В SDCC можно использовать, как мы делали с любым портом, имя соответствующего бита:

ANS8 = 0 // RB1 ==> Цифровой Ввод/Вывод ANS10 = 0 // RB2 ==> Цифровой Ввод/Вывод

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

Устройство витков выходе генератора импульсов микросхемы мощности нагрузки напряжение напряжения питания приемника пример провода работы радоэлектроника сигнал сигнала сигналов сопротивление схема теория транзистора транзисторов управления усиления усилитель усилителя устройства частоты