- Что такое сигнал ШИМ?
- ШИМ с использованием PIC16F877A:
- Программирование PIC для генерации сигналов PWM:
- Схема и тестирование:
- Работа с оборудованием:
Это наш 10-й учебник по изучению микроконтроллеров PIC с использованием MPLAB и XC8. До сих пор мы рассмотрели множество базовых руководств, таких как мигание светодиода с помощью PIC, таймеры в PIC, сопряжение с ЖК-дисплеем, сопряжение с 7-сегментным интерфейсом, ADC с использованием PIC и т. Д. Если вы абсолютный новичок, посетите полный список руководств по PIC здесь и начать учиться.
В этом руководстве мы узнаем, как сгенерировать сигналы ШИМ с помощью PIC PIC16F877A. В нашем микроконтроллере PIC есть специальный модуль под названием Compare Capture module (CCP), который можно использовать для генерации сигналов ШИМ. Здесь мы сгенерируем ШИМ 5 кГц с переменной скважностью от 0% до 100%. Чтобы изменить рабочий цикл, мы используем потенциометр, поэтому рекомендуется изучить учебник по АЦП, прежде чем начинать с ШИМ. Модуль PWM также использует таймеры для установки своей частоты, поэтому заранее узнайте, как использовать таймеры. Далее, в этом уроке мы будем использовать RC-цепь и светодиод для преобразования значений ШИМ в аналоговое напряжение и использовать его для затемнения светодиодного света.
Что такое сигнал ШИМ?
Широтно-импульсная модуляция (ШИМ) - это цифровой сигнал, который чаще всего используется в схемах управления. Этот сигнал устанавливается на высокий (5 В) и низкий (0 В) в заранее определенные время и скорость. Время, в течение которого сигнал остается на высоком уровне, называется «временем включения», а время, в течение которого сигнал остается низким, называется «временем выключения». Ниже описаны два важных параметра ШИМ:
Рабочий цикл ШИМ:
Процент времени, в течение которого сигнал ШИМ остается ВЫСОКИМ (по времени), называется рабочим циклом. Если сигнал всегда включен, это 100% рабочий цикл, а если он всегда выключен, это 0% рабочего цикла.
Рабочий цикл = время включения / (время включения + время выключения)
Частота ШИМ:
Частота сигнала ШИМ определяет, насколько быстро ШИМ завершает один период. Один период полностью включает и выключает сигнал ШИМ, как показано на рисунке выше. В нашем руководстве мы установим частоту 5 кГц.
ШИМ с использованием PIC16F877A:
Сигналы PWM могут быть сгенерированы в нашем микроконтроллере PIC с помощью модуля CCP (Compare Capture PWM). Разрешение нашего ШИМ-сигнала составляет 10 бит, то есть для значения 0 будет коэффициент заполнения 0%, а для значения 1024 (2 ^ 10) будет коэффициент заполнения 100%. В нашем PIC MCU есть два модуля CCP (CCP1 и CCP2), это означает, что мы можем генерировать два сигнала ШИМ на двух разных выводах (вывод 17 и 16) одновременно, в нашем руководстве мы используем CCP1 для генерации сигналов ШИМ на выводе 17.
Следующие регистры используются для генерации сигналов ШИМ с помощью нашего микроконтроллера PIC:
- CCP1CON (контрольный регистр CCP1)
- T2CON (Регистр управления таймером 2)
- PR2 (Регистр периода модулей таймера 2)
- CCPR1L (низкий регистр CCP 1)
Программирование PIC для генерации сигналов PWM:
В нашей программе мы будем считывать аналоговое напряжение 0-5 В с потенциометра и отображать его на 0-1024 с помощью нашего модуля АЦП. Затем мы генерируем сигнал ШИМ с частотой 5000 Гц и изменяем его рабочий цикл в зависимости от входного аналогового напряжения. То есть 0-1024 будет преобразован в рабочий цикл 0% -100%. В этом руководстве предполагается, что вы уже научились использовать ADC в PIC, если нет, прочтите его отсюда, потому что мы пропустим подробности об этом в этом руководстве.
Итак, когда биты конфигурации установлены и программа написана для чтения аналогового значения, мы можем продолжить ШИМ.
При настройке модуля CCP для работы с ШИМ необходимо предпринять следующие шаги:
- Установите период ШИМ, записав в регистр PR2.
- Установите рабочий цикл ШИМ, записав в регистр CCPR1L и биты CCP1CON <5: 4>.
- Сделайте вывод CCP1 выходом, сбросив бит TRISC <2>.
- Установите значение предварительного масштабирования TMR2 и включите Timer2, записав в T2CON.
- Настройте модуль CCP1 для работы с ШИМ.
В этой программе есть две важные функции для генерации сигналов ШИМ. Одна из них - функция PWM_Initialize (), которая инициализирует регистры, необходимые для настройки модуля ШИМ, а затем устанавливает частоту, с которой должен работать ШИМ, другая функция - функция PWM_Duty (), которая устанавливает рабочий цикл сигнала ШИМ в необходимые регистры.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Установка формул PR2 с помощью таблицы данных // Заставляет ШИМ работать с частотой 5 кГц CCP1M3 = 1; CCP1M2 = 1; // Настраиваем модуль CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Настраиваем модуль таймера TRISC2 = 0; // делаем вывод порта на C как вывод}
Вышеупомянутая функция является функцией инициализации ШИМ, в этой функции модуль CCP1 настроен на использование ШИМ, устанавливая бит CCP1M3 и CCP1M2 в высокий уровень.
Предварительный делитель модуля таймера устанавливается установкой бита T2CKPS0 в высокий уровень, а T2CKPS1 в низкий, бит TMR2ON устанавливается для запуска таймера.
Теперь нам нужно установить частоту сигнала ШИМ. Значение частоты должно быть записано в регистр PR2. Желаемую частоту можно установить с помощью следующих формул
Период ШИМ = * 4 * TOSC * (предварительное масштабирование TMR2)
Перестановка этих формул для получения PR2 даст
PR2 = (Период / (4 * Tosc * TMR2 Prescale)) - 1
Мы знаем, что Period = (1 / PWM_freq) и Tosc = (1 / _XTAL_FREQ). Следовательно…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
После того, как частота установлена, эту функцию не нужно вызывать снова, пока нам не понадобится снова изменить частоту. В нашем руководстве я назначил PWM_freq = 5000; так что мы можем получить рабочую частоту 5 кГц для нашего сигнала ШИМ.
Теперь давайте установим рабочий цикл ШИМ с помощью функции ниже
PWM_Duty (unsigned int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // При уменьшении // обязанности = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = долг & 1; // Сохраняем 1-й бит CCP1Y = duty & 2; // Сохраняем 0-й бит CCPR1L = duty >> 2; // Сохраняем 8-й бит напоминания}}
Наш сигнал PWM имеет 10-битное разрешение, поэтому это значение не может быть сохранено в одном регистре, поскольку наш PIC имеет только 8-битные линии данных. Таким образом, мы должны использовать два других бита CCP1CON <5: 4> (CCP1X и CCP1Y), чтобы сохранить последние два LSB, а затем сохранить оставшиеся 8 бит в регистре CCPR1L.
Продолжительность рабочего цикла ШИМ может быть рассчитана с помощью следующих формул:
Рабочий цикл ШИМ = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Предварительное масштабное значение TMR2)
Перестановка этих формул для получения значений CCPR1L и CCP1CON даст:
CCPRIL: CCP1Con <5: 4> = Рабочий цикл ШИМ / (Предварительное значение Tosc * TMR2)
Значение нашего АЦП будет 0-1024, нам нужно, чтобы оно было в диапазоне 0% -100%, следовательно, рабочий цикл PWM = 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));
Вы можете проверить полную программу в разделе «Код» ниже вместе с подробным видео.
Схема и тестирование:
Как обычно, давайте проверим вывод с помощью моделирования Proteus. Принципиальная схема показана ниже.
Подключите потенциометр к 7- му выводу, чтобы подать напряжение 0-5. Модуль CCP1 имеет вывод 17 (RC2), здесь будет генерироваться ШИМ, который можно проверить с помощью цифрового осциллографа. Далее, чтобы преобразовать это в переменное напряжение, мы использовали RC-фильтр и светодиод для проверки выхода без осциллографа.
Что такое RC-фильтр?
RC - фильтр или фильтр низких частот представляет собой простой контур с двумя пассивными элементами, а именно резистор и конденсатор. Эти два компонента используются для фильтрации частоты нашего ШИМ-сигнала и превращения его в переменное постоянное напряжение.
Если мы исследуем схему, то при подаче переменного напряжения на вход R конденсатор C начнет заряжаться. Теперь, в зависимости от номинала конденсатора, конденсатору потребуется некоторое время, чтобы полностью зарядиться, после зарядки он будет блокировать постоянный ток (помните, что конденсаторы блокируют постоянный ток, но допускают переменный ток), поэтому входное постоянное напряжение будет появляться на выходе. Высокочастотный ШИМ (сигнал переменного тока) будет заземлен через конденсатор. Таким образом, на конденсаторе получается чистый постоянный ток. Было установлено, что для этого проекта подходят значения 1000 Ом и 1 мкФ. Расчет значений R и C включает анализ схемы с использованием передаточной функции, что выходит за рамки данного руководства.
Выходные данные программы можно проверить с помощью цифрового осциллографа, как показано ниже, измените потенциометр, и рабочий цикл ШИМ должен измениться. Мы также можем заметить выходное напряжение RC-цепи с помощью вольтметра. Если все работает должным образом, мы можем продолжить работу с оборудованием. Далее проверьте видео в конце для полного процесса.
Работа с оборудованием:
Аппаратная установка проекта очень проста, мы просто собираемся повторно использовать нашу плату PIC Perf, показанную ниже.
Нам также понадобится потенциометр для подачи аналогового напряжения. Я подключил несколько концевых проводов к моему горшку (показано ниже), чтобы мы могли напрямую подключить их к плате PIC Perf.
Наконец, чтобы проверить выход, нам нужна RC-схема и светодиод, чтобы увидеть, как работает сигнал PWM, я просто использовал небольшую перфорированную плату и припаял RC-схему и светодиод (для управления яркостью), как показано ниже.
Мы можем использовать простые соединительные провода «мама-мама» и подключать их в соответствии со схемой, показанной выше. Как только соединение будет выполнено, загрузите программу в PIC с помощью нашего pickit3, и вы сможете получить переменное напряжение на основе входа вашего потенциометра. Переменный выход здесь используется для управления яркостью светодиода.
Я использовал свой мультиметр для измерения переменных выходных сигналов, мы также можем заметить, что яркость светодиода меняется для разных уровней напряжения.
Вот и все, что мы запрограммировали для считывания аналогового напряжения с POT и преобразования в сигналы PWM, которые, в свою очередь, были преобразованы в переменное напряжение с помощью RC-фильтра, и результат проверяется с помощью нашего оборудования. Если у вас есть сомнения или вы где-то застряли, воспользуйтесь разделом комментариев ниже, мы будем рады помочь вам. Полный рабочий работает в видео.
Также ознакомьтесь с нашими другими руководствами по ШИМ на других микроконтроллерах:
- Учебное пособие по Raspberry Pi PWM
- ШИМ с Arduino Due
- Светодиодный диммер на базе Arduino с использованием ШИМ
- Power LED Dimmer с использованием микроконтроллера ATmega32