- Що таке ШІМ-сигнал?
- ШІМ за допомогою PIC16F877A:
- Програмування PIC для генерації ШІМ-сигналів:
- Схеми та тестування:
- Робота над обладнанням:
Це наш 10-й підручник з вивчення мікроконтролерів PIC за допомогою MPLAB та XC8. До цього часу ми розглянули багато основних навчальних посібників, таких як світлодіодне блимання за допомогою PIC, таймери в PIC, взаємодія РК, взаємодія 7-сегментних, АЦП за допомогою PIC тощо. Якщо ви абсолютно новачок, відвідайте повний перелік підручників з PIC тут і розпочати навчання.
У цьому підручнику ми дізнаємося, як генерувати ШІМ-сигнали за допомогою PIC PIC16F877A. Наш PIC MCU має спеціальний модуль, який називається Порівняти модуль захоплення (CCP), який можна використовувати для генерації ШІМ-сигналів. Тут ми генеруємо ШІМ 5 кГц зі змінним робочим циклом від 0% до 100%. Щоб змінити робочий цикл, ми використовуємо потенціометр, тому перед початком роботи з ШІМ рекомендується вивчити підручник з АЦП. Модуль ШІМ також використовує таймери для встановлення частоти, отже, заздалегідь навчіться використовувати таймери тут. Далі, у цьому підручнику ми використовуватимемо RC-схему та світлодіод для перетворення значень ШІМ в аналогову напругу та використовуватимемо їх для затемнення світлодіодного світла.
Що таке ШІМ-сигнал?
Широтно-імпульсна модуляція (ШІМ) - це цифровий сигнал, який найчастіше використовується в схемі управління. Цей сигнал встановлюється високим (5v) і низьким (0v) заздалегідь визначеним часом і швидкістю. Час, протягом якого сигнал залишається високим, називається "вчасно", а час, протягом якого сигнал залишається низьким, називається "часом вимкнення". Існує два важливі параметри ШІМ, про які йдеться нижче:
Робочий цикл ШІМ:
Відсоток часу, протягом якого сигнал ШІМ залишається ВИСОКИМ (у часі), називається робочим циклом. Якщо сигнал завжди ввімкнений, він знаходиться у 100% робочому циклі, а якщо він завжди вимкнений, це 0% робочого циклу.
Цикл роботи = час включення / (час включення + час вимкнення)
Частота ШІМ:
Частота ШІМ-сигналу визначає, наскільки швидко ШІМ завершує один період. Один Період завершено УВІМКНЕННЯ та ВИМКНЕННЯ сигналу ШІМ, як показано на малюнку вище. У нашому посібнику ми встановимо частоту 5 кГц.
ШІМ за допомогою PIC16F877A:
ШІМ-сигнали можуть генеруватися в нашому мікроконтролері PIC за допомогою модуля CCP (Порівняння захоплення ШІМ). Роздільна здатність нашого ШІМ-сигналу 10-бітна, тобто для значення 0 буде робочий цикл 0%, а для значення 1024 (2 ^ 10) буде робочий цикл 100%. У нашому MCU PIC є два модулі CCP (CCP1 та CCP2), це означає, що ми можемо генерувати два ШІМ-сигнали на двох різних висновках (виводи 17 та 16) одночасно, у нашому навчальному посібнику ми використовуємо CCP1 для генерації ШІМ-сигналів на висновку 17.
Наступні регістри використовуються для генерації ШІМ-сигналів за допомогою нашого мікроконтролера PIC:
- CCP1CON (контрольний реєстр CCP1)
- T2CON (реєстр управління таймером 2)
- PR2 (Реєстр періоду модулів таймера 2)
- CCPR1L (Реєстр CCP 1 низький)
Програмування PIC для генерації ШІМ-сигналів:
У нашій програмі ми зчитуємо аналогову напругу 0-5v з потенціометра і відображаємо його до 0-1024 за допомогою нашого модуля АЦП. Потім ми генеруємо ШІМ-сигнал з частотою 5000 Гц і змінюємо його робочий цикл на основі вхідної аналогової напруги. Тобто 0-1024 буде перетворено на 0% -100% робочого циклу. Цей підручник передбачає, що ви вже навчились використовувати АЦП у 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 за допомогою таблиці даних // Змушує ШІМ працювати в 5KHZ 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 / (ШІМ_частота * 4 * TMR2PRESCALE)) - 1;
Після встановлення частоти цю функцію не потрібно буде викликати знову, якщо і поки нам не доведеться знову змінювати частоту. У нашому підручнику я призначив PWM_freq = 5000; щоб ми могли отримати робочу частоту 5 кГц для нашого ШІМ-сигналу.
Тепер встановимо робочий цикл ШІМ за допомогою наведеної нижче функції
PWM_Duty (без підписання int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // На зменшення // мита = (((плаваючий) мита / 1023) * (1 / ШІМ_часто)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = мито & 1; // Зберігаємо 1-й біт CCP1Y = duty & 2; // Зберігаємо 0-й біт CCPR1L = duty >> 2; // Зберігаємо 8-бітовий модуль}}
Наш ШІМ-сигнал має 10-бітову роздільну здатність, отже це значення не може зберігатися в одному регістрі, оскільки наш ПІК має лише 8-бітові лінії даних. Отже, ми використовуємо інші два біти CCP1CON <5: 4> (CCP1X та CCP1Y) для зберігання двох останніх LSB, а потім зберігаємо решту 8 бітів у Реєстрі CCPR1L.
Час робочого циклу ШІМ можна розрахувати, використовуючи наведені нижче формули:
ШІМ робочого циклу = (CCPRIL: CCP1CON <5: 4>) * Tosc * (значення масштабу TMR2)
Перестановка цих формул для отримання значення CCPR1L та CCP1CON дасть:
CCPRIL: CCP1Con <5: 4> = ШІМ робочого циклу / (значення Tosc * TMR2 Prescale)
Значення нашого АЦП буде 0-1024, нам потрібно, щоб воно становило 0% -100%, отже, ШІМ робочого циклу = мито / 1023. Далі, щоб перетворити цей робочий цикл у проміжок часу, ми повинні помножити його на період (1 / PWM_freq)
Ми також знаємо, що Tosc = (1 / PWM_freq), отже..
Мито = (((плаваюче) мито / 1023) * (1 / ШІМ_часто)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Вирішення наведеного рівняння дасть нам:
Мито = ((плаваючий) мито / 1023) * (_XTAL_FREQ / (ШІМ_freq * TMR2PRESCALE));
Ви можете перевірити повну програму в розділі коду нижче разом із докладним відео.
Схеми та тестування:
Як завжди, давайте перевіримо результат, використовуючи моделювання Proteus. Принципова схема показана нижче.
Підключіть потенціометр до 7- го виводу, щоб подати напругу 0-5. Модуль CCP1 має висновок 17 (RC2), тут буде сформовано ШІМ, який можна перевірити за допомогою цифрового осцилографа. Далі для перетворення цього у змінну напругу ми використали RC-фільтр та світлодіод для перевірки вихідного сигналу без розмаху.
Що таке RC-фільтр?
RC - фільтр або фільтр низьких частот являє собою простий контур з двома пасивними елементами, а саме резистор і конденсатор. Ці два компоненти використовуються для фільтрації частоти нашого ШІМ-сигналу та надання йому змінної напруги постійного струму.
Якщо ми розглянемо схему, коли на вхід R подається змінна напруга, конденсатор С почне заряджатися. Тепер, виходячи із значення конденсатора, конденсатору знадобиться деякий час, щоб повністю зарядитися, після заряджання він заблокує постійний струм (пам’ятайте, що конденсатори блокують постійний струм, але дозволяють змінний струм), отже, вхідна напруга постійного струму з’явиться на виході. Високочастотна ШІМ (сигнал змінного струму) буде заземлена через конденсатор. Таким чином, через конденсатор виходить чистий постійний струм. Значення 1000 Ом та 1 мкФ було визнано відповідним для цього проекту. Обчислення значень R і C передбачає аналіз схеми за допомогою передавальної функції, що виходить за межі даного посібника.
Вихід програми можна перевірити за допомогою цифрового осцилографа, як показано нижче, змінюйте потенціометр і робочий цикл ШІМ повинен змінитися. Ми також можемо помітити вихідну напругу схеми RC за допомогою вольтметра. Якщо все працює належним чином, ми можемо продовжувати роботу з нашим обладнанням. Потім перевірте відео в кінці для повного процесу.
Робота над обладнанням:
Апаратне налаштування проекту дуже просте, ми просто збираємося повторно використовувати нашу плату PIC Perf, показану нижче.
Нам також знадобиться потенціометр для подачі аналогової напруги, я приєднав кілька жіночих кінцевих проводів до свого горщика (показано нижче), щоб ми могли безпосередньо підключити їх до плати PIC Perf.
Нарешті, для перевірки виходу нам потрібні RC-схема і світлодіод, щоб побачити, як працює сигнал ШІМ, я просто використав невелику плату перф і припаяв RC-схему та світлодіод (для управління яскравістю) до неї, як показано нижче
Ми можемо використовувати прості з'єднувальні дроти від жінки до жінки та з'єднувати їх відповідно до наведених вище схем. Після підключення завантажте програму на PIC, використовуючи наш pickit3, і ви зможете отримати змінну напругу на основі входу вашого потенціометра. Змінний вихід використовується для управління яскравістю світлодіода тут.
Я використовував мультиметр для вимірювання змінних виходів, ми також можемо помітити яскравість світлодіода, що змінюється для різних рівнів напруги.
Це все, що ми запрограмували зчитувати аналогову напругу з POT і перетворювати в ШІМ-сигнали, які в свою чергу перетворювались на змінну напругу за допомогою RC-фільтра, а результат перевірявся за допомогою нашого обладнання. Якщо у вас є якісь сумніви або ви десь застрягли, будь ласка, скористайтеся розділом коментарів нижче, ми будемо раді вам допомогти. Повний робочий працює в відео.
Також перевірте наші інші підручники з ШІМ на інших мікроконтролерах:
- Підручник з ШІМ Raspberry Pi
- ШІМ з Arduino Due
- Світлодіодний диммер на основі Arduino з використанням ШІМ
- Індикатор живлення за допомогою мікроконтролера ATmega32