- Какво е ШИМ сигнал?
- ШИМ с използване на PIC16F877A:
- Програмиране на PIC за генериране на ШИМ сигнали:
- Схеми и тестване:
- Работа върху хардуер:
Това е нашият 10-и урок за обучение на PIC микроконтролери, използващи MPLAB и XC8. Досега сме обхванали много основни уроци като LED мигане с PIC, таймери в PIC, свързване на LCD, свързване на 7 сегмента, ADC с използване на PIC и др. Ако сте абсолютно начинаещ, моля, посетете пълния списък с PIC уроци тук и започнете да учите.
В този урок ще научим как да генерираме ШИМ сигнали, използвайки PIC PIC16F877A. Нашият PIC MCU има специален модул, наречен Сравни модул за улавяне (CCP), който може да се използва за генериране на ШИМ сигнали. Тук ще генерираме ШИМ от 5 kHz с променлив работен цикъл от 0% до 100%. За да променим работния цикъл, използваме потенциометър, затова се препоръчва да научите ADC урок, преди да започнете с ШИМ. PWM модулът също използва таймери, за да зададе своята честота, следователно научете как да използвате таймерите предварително тук. Освен това, в този урок ще използваме RC верига и светодиод, за да преобразуваме стойностите на ШИМ в аналогово напрежение и да ги използваме за затъмняване на LED светлината.
Какво е ШИМ сигнал?
Модулация на широчината на импулса (PWM) е цифров сигнал, който се използва най-често в схемите за управление. Този сигнал се задава високо (5v) и ниско (0v) за предварително зададено време и скорост. Времето, през което сигналът остава висок, се нарича „on time“, а времето, през което сигналът остава нисък, се нарича „off time“. Има два важни параметъра за ШИМ, както е обсъдено по-долу:
Работен цикъл на ШИМ:
Процентът от времето, през което ШИМ сигналът остава ВИСОКИ (навреме) се нарича работен цикъл. Ако сигналът винаги е включен, той е в 100% работен цикъл и ако винаги е изключен, това е 0% работен цикъл.
Работен цикъл = Време за включване / (Време за включване + Време за изключване)
Честота на ШИМ:
Честотата на PWM сигнал определя колко бързо PWM завършва един период. Един период е завършен и изключен на ШИМ сигнал, както е показано на горната фигура. В нашия урок ще зададем честота от 5KHz.
ШИМ с използване на PIC16F877A:
PWM сигнали могат да се генерират в нашия PIC микроконтролер с помощта на модула CCP (Compare Capture PWM). Разделителната способност на нашия ШИМ сигнал е 10-битова, т.е. за стойност 0 ще има коефициент на запълване 0%, а за стойност 1024 (2 ^ 10) ще има работен цикъл 100%. В нашия PIC MCU има два CCP модула (CCP1 и CCP2), това означава, че можем да генерираме два PWM сигнала на два различни пина (pin 17 и 16) едновременно, в нашия урок ние използваме CCP1 за генериране на PWM сигнали на pin 17.
Следните регистри се използват за генериране на ШИМ сигнали с помощта на нашия PIC MCU:
- CCP1CON (CCP1 контролен регистър)
- T2CON (контролен регистър на таймера 2)
- PR2 (Регистър на периода на модули с таймер 2)
- CCPR1L (Регистър на CCP 1 Нисък)
Програмиране на PIC за генериране на ШИМ сигнали:
В нашата програма ще прочетем аналогово напрежение 0-5v от потенциометъра и ще го картографираме на 0-1024 с помощта на нашия ADC модул. След това генерираме ШИМ сигнал с честота 5000Hz и променяме неговия работен цикъл въз основа на входното аналогово напрежение. Това е 0-1024 ще бъде преобразувано в 0% -100% работен цикъл. Този урок предполага, че вече сте се научили да използвате ADC в PIC, ако не, прочетете го от тук, защото ще пропуснем подробности за него в този урок.
И така, след като конфигурационните битове са зададени и програмата е написана за четене на аналогова стойност, можем да продължим с ШИМ.
При конфигуриране на модула CCP за работа с ШИМ трябва да се предприемат следните стъпки:
- Задайте периода на ШИМ, като напишете в регистъра PR2.
- Задайте PWM работен цикъл, като запишете в регистъра CCPR1L и CCP1CON <5: 4> бита.
- Направете CCP1 щифт изход, като изчистите бита TRISC <2>.
- Задайте TMR2 предскалирана стойност и активирайте Timer2, като напишете в T2CON.
- Конфигурирайте модула CCP1 за работа с ШИМ.
В тази програма има две важни функции за генериране на ШИМ сигнали. Едната е функцията PWM_Initialize (), която ще инициализира регистрите, необходими за настройка на PWM модула и след това ще зададе честотата, на която трябва да работи PWM, другата функция е функцията PWM_Duty (), която ще зададе работния цикъл на PWM сигнала в необходимите регистри.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Задаване на формули PR2 с помощта на лист с данни // Прави PWM да работи в 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Конфигуриране на модула CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Конфигуриране на таймерния модул TRISC2 = 0; // направете порт щифт на C като изход}
Горната функция е функцията за инициализиране на PWM, в тази функция Модулът CCP1 е настроен да използва PWM, като прави бита CCP1M3 и CCP1M2 като висок.
Предскалерът на модула на таймера се настройва, като битът T2CKPS0 е толкова висок, а T2CKPS1 като нисък, битът TMR2ON е настроен да стартира таймера.
Сега трябва да зададем честотата на ШИМ сигнала. Стойността на честотата трябва да бъде записана в регистъра PR2. Желаната честота може да бъде зададена с помощта на формулите по-долу
PWM Период = * 4 * TOSC * (TMR2 Prescale Value)
Пренареждането на тези формули, за да се получи 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 KHz работна честота за нашия ШИМ сигнал.
Сега нека зададем работния цикъл на ШИМ, като използваме функцията по-долу
PWM_Duty (неподписано int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // При намаляване // мито = (((плаващо) мито / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = мито & 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 Стойност на скалата)
Стойността на нашия ADC ще бъде 0-1024, трябва да бъде в 0% -100%, следователно, ШИМ дежурен цикъл = мито / 1023. Освен това, за да преобразуваме този работен цикъл в период от време, трябва да го умножим с периода (1 / PWM_freq)
Също така знаем, че Tosc = (1 / PWM_freq), следователно..
Мито = (((плаващо) мито / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Решаването на горното уравнение ще ни даде:
Мито = ((плаващо) мито / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Можете да проверите пълната програма в раздела Код по-долу заедно с подробното видео.
Схеми и тестване:
Както обикновено, нека проверим резултата, използвайки симулация на Proteus. В електрическата схема е показана по-долу.
Свържете потенциометър към 7 -ми щифт, за да подадете напрежение от 0-5. Модулът CCP1 е с щифт 17 (RC2), тук ще се генерира ШИМ, който може да бъде проверен с помощта на цифровия осцилоскоп. Освен това, за да преобразуваме това в променливо напрежение , използвахме RC-филтър и светодиод за проверка на изхода без обхват.
Какво е RC-филтър?
Един RC филтър или филтър с ниска е проста схема с две пасивни елементи, а именно резистор и кондензатор. Тези два компонента се използват за филтриране на честотата на нашия ШИМ сигнал и превръщането му в променливо постояннотоково напрежение.
Ако изследваме веригата, когато към входа на R се приложи променливо напрежение, кондензаторът C ще започне да се зарежда. Сега въз основа на стойността на кондензатора, кондензаторът ще отнеме известно време, за да се зареди напълно, след като се зареди, той ще блокира постояннотоковия ток (не забравяйте, че кондензаторите блокират постоянен ток, но позволява променлив ток), следователно входното постояннотоково напрежение ще се появи през изхода. Високочестотният ШИМ (AC сигнал) ще бъде заземен през кондензатора. По този начин се получава чист постоянен ток през кондензатора. Стойността от 1000Ohm и 1uf беше установена за подходяща за този проект. Изчисляването на стойностите на R и C включва анализ на веригата с помощта на трансферна функция, което е извън обхвата на този урок.
Изходът на програмата може да бъде проверен с помощта на цифровия осцилоскоп, както е показано по-долу, променяйте потенциометъра и работният цикъл на ШИМ трябва да се промени. Също така можем да забележим изходното напрежение на RC веригата с помощта на волтметъра. Ако всичко работи както се очаква, можем да продължим с нашия хардуер. Допълнително проверете видеото в края за пълен процес.
Работа върху хардуер:
Хардуерната настройка на проекта е много проста, ние просто ще използваме повторно нашата PIC Perf платка, показана по-долу.
Ще ни е необходим и потенциометър за захранване на аналоговото напрежение, прикрепил съм няколко женски крайни проводника към гърнето си (показано по-долу), за да можем директно да ги свържем към PIC Perf платката.
И накрая, за да проверим изхода, се нуждаем от RC верига и светодиод, за да видим как работи PWM сигналът, просто използвах малка перфектна платка и спойках RC веригата и LED (за контрол на яркостта), както е показано по-долу
Можем да използваме прости женски към женски свързващи проводници и да ги свързваме съгласно схемите, показани по-горе. След като свързването свърши, качете програмата на PIC с помощта на нашия pickit3 и ще можете да получите променливо напрежение въз основа на входа на вашия потенциометър. Променливият изход се използва за управление на яркостта на светодиода тук.
Използвах мултиметъра си за измерване на променливите изходи, можем също така да забележим, че яркостта на светодиода се променя за различни нива на напрежение.
Това е, което сме програмирали да отчита аналоговото напрежение от POT и да преобразува в PWM сигнали, които от своя страна са преобразувани в променливо напрежение с помощта на RC филтър и резултатът се проверява с помощта на нашия хардуер. Ако имате някакви съмнения или се забиете някъде, любезно използвайте раздела за коментари по-долу, ще се радваме да ви помогнем. В пълно функциониране работи във видеото.
Проверете и другите ни уроци за ШИМ на други микроконтролери:
- Урок за PWM на Raspberry Pi
- ШИМ с Arduino Due
- LED димер, базиран на Arduino, използващ ШИМ
- Захранващ LED димер с помощта на микроконтролер ATmega32