Использование широтно-импульсной модуляции (ШИМ) в микроконтроллерах PIC


Мы продолжаем серию обучающих статей про основы работы с микроконтроллерами PIC. Ранее на нашем сайте мы уже рассмотрели основы работы с данными микроконтроллерами, использование в них АЦП, подключение к ним ЖК дисплея и семисегментного индикатора и др. В этой же статье мы рассмотрим использование широтно-импульсной модуляции (ШИМ, в англ. PWM) в микроконтроллерах PIC.

Внешний вид проекта для демонстрации возможностей ШИМ в микроконтроллерах PIC

Микроконтроллеры PIC имеют специальный модуль CCP (Compare Capture module – модуль сравнения и захвата), который можно использовать для формирования ШИМ сигналов. В нашем проекте мы будем формировать ШИМ сигнал с частотой 5 кГц с переменным коэффициентом заполнения от 0% до 100%. Изменять коэффициент заполнения ШИМ мы будем с помощью потенциометра – более подробно про работу с ним вы можете прочитать в статье про использование АЦП в микроконтроллерах PIC. Также рекомендуем прочитать статью и про использование таймеров в микроконтроллерах PIC – в нашем случае мы будем использовать таймер для установки частоты ШИМ сигнала. Далее мы будем использовать RC-цепь для преобразования цифрового сигнала в аналоговый, чтобы потом использовать его для управления яркостью свечения светодиода, то есть, фактически, сделаем самодельный диммер на основе микроконтроллера PIC.

Ранее на нашем сайте мы рассматривали использование ШИМ в следующих микроконтроллерах (платах):

Что такое ШИМ сигнал

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

Внешний вид ШИМ сигнала при различных коэффициентах заполнения показан на следующих рисунке.

ШИМ с коэффициентом заполнения 50%

ШИМ с коэффициентом заполнения 10%

ШИМ с коэффициентом заполнения 90%

Важным параметром ШИМ сигнала является его коэффициент заполнения (скважность, в англ. - duty cycle). Коэффициент заполнения ШИМ сигнала представляет собой процент времени, в течение которого сигнал имеет высокий уровень (HIGH, ON). Если ШИМ сигнал всегда находится в состоянии HIGH, то его коэффициент заполнения равен 100%, а если ШИМ сигнал всегда находится в состоянии LOW, то его коэффициент заполнения равен 0%.

ШИМ в микроконтроллере PIC16F877A

ШИМ сигнал в микроконтроллере PIC16F877A может быть сформирован с помощью модуля CCP (модуль сравнения и захвата). Разрешение ШИМ сигнала у нас составляет 10 бит, поэтому значению 0 будет соответствовать коэффициент заполнения 0%, а значению 1024 (2^10) – коэффициент заполнения 100%. В микроконтроллерах PIC есть два модуля CCP – CCP1 и CCP2, что означает что мы можем одновременно формировать два различных ШИМ сигнала на двух разных контактах (CCP1 и CCP2). В нашем проекте мы будем использовать модуль CCP1 для формирования ШИМ сигнала на контакте 17.

Для формирования ШИМ сигнала нам потребуются следующие специальные регистры микроконтроллера PIC:

  1. CCP1CON (CCP1 control Register).
  2. T2CON (Timer 2 Control Register).
  3. PR2 (Timer 2 modules Period Register).
  4. CCPR1L (CCP Register 1 Low).

Программирование микроконтроллера PIC для формирования ШИМ сигнала

В нашем проекте мы будем считывать аналоговое значение 0-5v с потенциометра и преобразовывать его в диапазон 0-1024 с помощью модуля АЦП. Затем мы будем формировать ШИМ сигнал с частотой 5000 Гц и коэффициентом заполнения на основе считанного аналогового значения. Таким образом, диапазон 0-1024 с выхода АЦП будет преобразован в диапазон 0%-100% коэффициента заполнения. Начало нашей программы будет такое же, как и в статье про использование АЦП в микроконтроллере PIC.

Когда биты конфигурации микроконтроллера установлены и написана часть программы для считывания аналогового значения с помощью АЦП, далее мы можем перейти к процессу формирования ШИМ сигнала.

Для этого необходимо сконфигурировать модуль CCP и выполнить следующую последовательность шагов:

  1. Установить период ШИМ сигнала с помощью регистра PR2.
  2. Установить коэффициент заполнения ШИМ сигнала с помощью регистра CCPR1L и битов <5:4> регистра CCP1CON.
  3. Установить режим работы контакта CCP1 на вывод данных с помощью очистки бита TRISC<2>.
  4. Установить значение предделителя TMR2 и разрешить (enable) работу Timer2 с помощью регистра T2CON.
  5. Сконфигурировать модуль CCP1 для работы с ШИМ.

В нашей программе будет две основные функции для работы с ШИМ сигналами. Первой из них будет PWM_Initialize(), в которой мы будем инициализировать все регистры, необходимые для настройки модуля формирования ШИМ сигнала, и устанавливать частоту ШИМ сигнала. Во второй функции, PWM_Duty(), мы будем устанавливать коэффициент заполнения (duty cycle) ШИМ сигнала, конфигурируя необходимые регистры.

В представленной функции производится настройка модуля CCP1 для работы с ШИМ сигналом при помощи установки битов CCP1M3 и CCP1M2 в состояние high.

Структура регистра CCP1CON в микроконтроллере PIC

Предделитель модуля таймера настраивается при помощи установки бита T2CKPS0 в состояние high, а бита T2CKPS1 – в состояние low. Бит TMR2ON устанавливается для начала работы таймера.

Структура регистра T2CON в микроконтроллере PIC

Теперь нам необходимо установить частоту ШИМ сигнала. Значение этой частоты должно быть записано в регистр PR2. Необходимое значение частоты ШИМ сигнала определяется по следующей формуле:

PWM Period = [(PR2) + 1] * 4 * TOSC * (TMR2 Prescale Value)

Выражая из этой формулы PR2, получаем:

PR2 = (Period / (4 * Tosc * TMR2 Prescale )) - 1

Мы знаем что Period = (1/PWM_freq) и Tosc = (1/_XTAL_FREQ), следовательно, получаем:

PR2 = (_XTAL_FREQ/ (PWM_freq*4*TMR2PRESCALE)) – 1;

Когда частота ШИМ сигнала будет установлена нам не нужно будет снова вызывать эту функцию до тех пор пока нам не понадобится снова сменить данную частоту. В нашем проекте мы использовали частоту ШИМ сигнала равную 5 кГц (PWM_freq = 5000).

Функция для задания коэффициента заполнения ШИМ сигнала будет выглядеть следующим образом:

Наш ШИМ сигнал имеет разрешение 10 бит, поэтому его значение не может поместиться в один регистр поскольку наш микроконтроллер 8-битный. Поэтому нам необходимо использовать два бита регистра  CCP1CON<5:4> (CCP1X и CCP1Y) чтобы хранить два младших бита (LSB), а оставшиеся 8 бит хранить в регистре CCPR1L.

Коэффициент заполнения ШИМ сигнала можно определить по следующей формуле:

PWM Duty Cycle = (CCPRIL:CCP1CON<5:4>) * Tosc * (TMR2 Prescale Value)

Выражая из этой формулы значения для CCPR1L и CCP1CON получим:

CCPRIL:CCP1Con<5:4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)

Значение с выхода АЦП лежит в диапазоне 0-1024, а диапазон коэффициента заполнения лежит в пределах 0..1 (0%-100%), поэтому чтобы его получить необходимо значение с выхода АЦП разделить на 1023 (PWM Duty Cycle = duty/1023). Далее, чтобы преобразовать полученное значение коэффициента заполнения в период времени необходимо умножить его на период колебания (1/ PWM_freq). Также мы знаем что Tosc = (1/PWM_freq). В итоге получаем:

Duty = ( ( (float)duty/1023) * (1/PWM_freq) ) / ( (1/_XTAL_FREQ) * TMR2PRESCALE);

Упрощая данное выражение получим:

Duty = ( (float)duty/1023) * (_XTAL_FREQ / (PWM_freq*TMR2PRESCALE));

Полностью код программы нашего проекта приведен в конце статьи.

Схема проекта

Схема для демонстрации возможностей ШИМ в микроконтроллерах PIC представлена на следующем рисунке.

Схема для демонстрации возможностей ШИМ в микроконтроллерах PICПотенциометр в представленной схеме подключен к контакту 7 микроконтроллера PIC. Модуль CCP1 находится на контакте 17 (RC2), поэтому для проверки формируемого на нем ШИМ сигнала подключим к нему осциллограф. Также для преобразования цифрового значения в напряжения в аналоговое мы используем RC-фильтр. Светодиод используется для индикации подачи сигнала на осциллограф.

Что такое RC-фильтр

RC-фильтр – это фильтр нижних частот (ФНЧ), состоящий из двух пассивных элементов: резистора и конденсатора. Они используются для фильтрации нашего ШИМ сигнала и тем самым делают его похожим на обычный аналоговый сигнал, изменяющийся по уровню.

Если мы посмотрим на схему RC-фильтра мы увидим что когда переменное напряжение подается на резистор R, конденсатор C начнет заряжаться. Когда конденсатор полностью зарядится он блокирует протекание постоянного тока. Следовательно в этот момент времени напряжение, приложенное ко входу схемы, появится на ее выходе. Высокие частоты ШИМ сигнала будут заземлены с помощью конденсатора. Для данного проекта в схеме RC-фильтра мы использовали резистор сопротивлением 1000 Ом и конденсатор емкостью 1 мкФ.

Схема RC-фильтра

Работу схемы мы проверили в симуляторе Proteus с помощью цифрового осциллографа как показано на рисунке ниже. Вращая ручку потенциометра вы должны заметить как изменяется коэффициент заполнения ШИМ сигнала. Также напряжение на выходе RC-фильтра можно измерить с помощью вольтметра. Когда в Proteus все заработает так, как надо, можно приступать к сборке проекта в "железе". Более подробно эти процессы вы можете посмотреть на видео, приведенном в конце статьи.

Проверка работы схемы проекта в симуляторе Proteus

Тестирование работы проекта

Внешний вид собранной на перфорированной плате конструкции нашего проекта приведен на следующем рисунке.

Внешний вид собранной конструкции проекта

Также, чтобы подавать на вход микроконтроллера PIC аналоговое значение напряжения, мы подключили к нему потенциометр как показано на следующих рисунках.

Внешний вид потенциометра для нашего проекта Подключение потенциометра к микроконтроллеру PIC

И, наконец, чтобы проверить работу схемы, мы использовали RC-фильтр и светодиод (чтобы контролировать его яркость свечения), которые мы спаяли на отдельной маленькой перфорированной плате.

Внешний вид платы с RC-фильтром и светодиодом

Можно использовать обычные соединительные провода типа "мама-мама" чтобы соединить вместе отдельные части схемы. После того как аппаратная часть схемы будет готова, вы можете загрузить программу в микроконтроллер PIC с помощью программатора pickit3 и приступить к тестированию работы проекта. Вы должны заметить как с вращением ручки потенциометра изменяется яркость свечения светодиода.

Также для измерения напряжения на выходе схемы можно использовать мультиметр как показано на следующем рисунке.

Тестирование работы проекта с помощью мультиметраИсходный код программы

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 606 просмотров

Комментарии

Использование широтно-импульсной модуляции (ШИМ) в микроконтроллерах PIC — 2 комментария

  1. У вас тут ошибка:
    CCP1X = duty & 1; //сохраняем 1-й бит
    CCP1Y = duty & 2; //сохраняем 0-й бит

    правильно так:
    CCP1X = duty>>1 & 1; //сохраняем 1-й бит
    CCP1Y = duty & 1; //сохраняем 0-й бит

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *