- Шта је ПВМ сигнал?
- Програмирање ПИЦ-а за генерисање ПВМ-а на ГПИО пиновима
- Кружни дијаграм
- Симулација
- Постављање хардвера за управљање серво мотором помоћу ПИЦ микроконтролера
Генерација ПВМ сигнала је витални алат у сваком уграђеном арсеналу инжењера, врло су корисни за мноштво апликација као што је контрола положаја серво мотора, пребацивање неколико електронских интегрисаних ИЦ-а у претвараче / претвараче, па чак и за једноставну контролу осветљености ЛЕД. У ПИЦ микроконтролерима ПВМ сигнали се могу генерисати помоћу упоређивања, хватања и ПВМ (ЦЦП) модула постављањем потребних Регистра, већ смо научили како то да урадимо у ПИЦ ПВМ водичу. Али постоји један значајан недостатак код те методе.
ПИЦ16Ф877А може генерисати ПВМ сигнала само на пинова РЦ1 и РЦ2, ако користимо КПК модула. Али могли бисмо наићи на ситуације у којима нам треба више пинова да бисмо имали ПВМ функционалност. На пример, у мом случају желим да контролишем 6 РЦ серво мотора за свој пројекат роботске руке за који је ЦЦП модул безнадежан. У овим сценаријима можемо програмирати ГПИО пинове за производњу ПВМ сигнала помоћу модула тајмера. На овај начин можемо генерирати што више ПВМ сигнала било којим потребним пином. Постоје и друга хардверска хаковања попут употребе мултиплексера ИЦ, али зашто улагати у хардвер кад се то исто може постићи програмирањем. Тако ћемо у овом упутству научити како претворити ПИЦ ГПИО пин у ПВМ пин и како бисмо га тестирали симулираћемо га на протеусу дигиталним осцилоскопом, а такођеконтролишите положај серво мотора помоћу ПВМ сигнала и промените његов радни циклус променом потенциометра.
Шта је ПВМ сигнал?
Пре него што уђемо у детаље, разјаснимо мало шта су ПВМ сигнали. Модулација ширине импулса (ПВМ) је дигитални сигнал који се најчешће користи у управљачким круговима. Овај сигнал је постављен на високу (5в) и ниску (0в) у унапред дефинисаном времену и брзини. Време током којег сигнал остаје висок назива се „он тиме“, а време током којег сигнал остаје низак се назива „време искључења“. Постоје два важна параметра за ПВМ о којима се говори у наставку:
Радни циклус ПВМ
Проценат времена у којем ПВМ сигнал остаје ВИСОК (на време) назива се радни циклус. Ако је сигнал увек УКЉУЧЕН, он је у 100% радном циклусу, а ако је увек искључен, то је 0% радног циклуса.
Радни циклус = Вријеме УКЉУЧЕЊА / (Вријеме УКЉУЧИВАЊА + Вријеме искључивања)
Назив променљиве |
Се односи на |
ПВМ_Фрекуенци |
Учесталост ПВМ сигнала |
Т_ТОТАЛ |
Укупно време потребно за један комплетни циклус ПВМ |
Т_ОН |
На време ПВМ сигнала |
Т_ОФФ |
Време искључења ПВМ сигнала |
Радни циклус |
Радни циклус ПВМ сигнала |
Па сад, хајде да израчунамо.
Ово су стандардне формуле где је фреквенција једноставно реципрочна времену. Вредност фреквенције мора да одлучи и постави корисник на основу захтева за пријаву.
Т_ТОТАЛ = (1 / фреквенција ПВМ)
Када корисник промени вредност радног циклуса, наш програм треба аутоматски прилагодити време Т_ОН и време Т_ОФФ у складу с тим. Дакле, горње формуле се могу користити за израчунавање Т_ОН на основу вредности Дути_Цицле и Т_ТОТАЛ.
Т_ОН = (Дути_Цицле * Т_ТОТАЛ) / 100
Будући да ће укупно време ПВМ сигнала за један пуни циклус бити збир времена и времена искључења. Можемо израчунати време искључења Т_ОФФ као што је приказано горе.
Т_ОФФ = Т_ТОТАЛ - Т_ОН
Имајући у виду ове формуле, можемо започети програмирање ПИЦ микроконтролера. Програм укључује ПИЦ тајмер модул и ПИЦ АДЦ модул да би креирао ПВМ сигнал заснован на променљивом радном циклусу према АДЦ вредности из ПОТ-а. Ако не користите ове модуле, препоручује се да прочитате одговарајући водич кликом на хипервезе.
Програмирање ПИЦ-а за генерисање ПВМ-а на ГПИО пиновима
Комплетан програм за овом упутству могу се наћи на дну сајта као и увијек. У овом одељку схватимо како је програм заправо написан. Као и сви програми, започињемо постављањем битова за конфигурацију. Користио сам опцију меморијских приказа да бих је подесио за мене.
// ЦОНФИГ #прагма цонфиг ФОСЦ = ХС // Битови за избор осцилатора (ХС осцилатор) #прагма цонфиг ВДТЕ = ОФФ // Бит Ватцхг Енабле бит (ВДТ дисаблед) #прагма цонфиг ПВРТЕ = ОФФ // Бит за омогућавање тајмера за укључивање (ПВРТ онемогућено) #прагма цонфиг БОРЕН = ОН // Бровн-оут Ресет Енабле бит (омогућен БОР) #прагма цонфиг ЛВП = ОФФ // Бит за омогућавање серијског програмирања у кругу ниског напона (једно напајање) (РБ3 је дигитални И / О, ХВ на МЦЛР-у мора се користити за програмирање) #прагма цонфиг ЦПД = ОФФ // Бит заштите података ЕЕПРОМ меморијског кода (заштита ЕЕПРОМ података података искључена) #прагма цонфиг ВРТ = ОФФ // Фласх програмирање меморије Омогућавање битова (искључивање заштите; сва програмска меморија може бити уписана на ЕЕЦОН контролу) #прагма цонфиг ЦП = ОФФ // Бит програма за заштиту меморијског кода Фласх програма (заштита кода искључена) // #прагма цонфиг наводи треба да претходе укључивању датотеке пројекта. // Користите набрајање пројеката уместо #дефине за ОН и ОФФ. #инцлуде
Затим спомињемо фреквенцију такта која се користи у хардверу, овде мој хардвер користи кристал од 20 МХз, а вредност можете унети у хардвер. Следи вредност фреквенције ПВМ сигнала. Будући да ми је овде циљ да контролишем хоби РЦ серво мотор који захтева ПВМ фреквенцију од 50Хз, поставио сам 0,05КХз као вредност фреквенције, што такође можете променити на основу захтева апликације.
#дефине _КСТАЛ_ФРЕК 20000000 #дефине ПВМ_Фрекуенци 0,05 // у КХз (50Хз)
Сада, када имамо вредност Фреквенције, можемо израчунати Т_ТОТАЛ користећи горе описане формуле. Резултат се зарони за 10 да би се добила вредност времена у милли секундама. У мом случају вредност Т_ТОТАЛ ће бити 2 мили секунде.
инт Т_ТОТАЛ = (1 / фреквенција ПВМ) / 10; // израчунавање укупног времена из фреквенције (у милли сек)) // 2мсец
Након тога, иницијализујемо АДЦ модуле за очитавање положаја потенциометра како је објашњено у нашем водичу за АДЦ ПИЦ. Даље имамо рутину услуге Интеррупт која ће се позивати сваки пут, тајмер се преплави, на то ћемо се вратити касније, за сада проверимо главну функцију.
Унутар главне функције конфигуришемо модул тајмера. Овде сам конфигурисао модул Тајмер да се прелива за сваких 0,1 мс. Вредност времена се може израчунати помоћу доњих формула
РегВалуе = 256 - ((Одлагање * Фосц) / (Пресцалар * 4)) кашњење у сек и Фосц у хз
У мом случају за кашњење од 0,0001 секунде (0,1мс) са преткаларом од 64 и Фосц од 20МХз, вредност мог регистра (ТМР0) треба да буде 248. Дакле, конфигурација изгледа овако
/ ***** Конфигурација порта за тајмер ****** / ОПТИОН_РЕГ = 0б00000101; // Тимер0 са спољном фреквенцијом и 64 као преткалар // Такође омогућава ПУЛЛ УПс ТМР0 = 248; // Учитавање временске вредности за 0,0001с; делаиВалуе може бити између 0-256 само ТМР0ИЕ = 1; // Омогући бит прекида тајмера у регистру ПИЕ1 ГИЕ = 1; // Омогући глобални прекид ПЕИЕ = 1; // Омогући периферни прекид / *********** ______ *********** /
Затим морамо подесити улазну и излазну конфигурацију. Овде користимо пин АН0 за читање АДЦ вредности и ПОРТД пинове за излаз ПВМ сигнала. Зато их покрените као излазне пинове и умањите их користећи доње редове кода.
/ ***** Конфигурација порта за И / О ****** / ТРИСД = 0к00; // упутите МЦУ да сви пинови на ПОРТ Д имају излаз ПОРТД = 0к00; // Иницијализујте све пинове на 0 / *********** ______ *********** /
Унутар Инфините док петље, морамо да израчуна вредност на време (Т_ОН) из радног циклуса. Време укључивања и радни циклус варирају у зависности од положаја ПОТ-а, па то понављамо унутар вхиле петље, као што је приказано доле. 0,0976 је вредност коју треба помножити са 1024 да би се добило 100, а за израчунавање Т_ОН помножили смо је са 10 да бисмо добили вредност у милли секунди.
вхиле (1) { ПОТ_вал = (АДЦ_Реад (0)); // Очитавање вредности ПОТ помоћу АДЦ Дути_цицле = (ПОТ_вал * 0.0976); // Мапа 0 до 1024 до 0 до 100 Т_ОН = ((Дути_цицле * Т_ТОТАЛ) * 10/100); // Израчунај време помоћу јединице формула у милли секунд __делаи_мс (100); }
Будући да је тајмер подешен на прекомјерни проток за сваких 0,1 мс, рутина ИСР услуге прекида тајмера биће позвана за сваких 0,1 мс. Унутар рутине услуге користимо променљиву која се зове цоунт и увећавамо је за сваких 0,1 мс. На овај начин можемо пратити време. Да бисте сазнали више о Прекидима у ПИЦ микроконтролеру, следите везе
иф (ТМР0ИФ == 1) // Ознака тајмера је покренута због преливања тајмера -> постављено на преливање за сваких 0,1 мс { ТМР0 = 248; // Учитавање тајмера Вредност ТМР0ИФ = 0; // Обриши број заставица прекида тајмера ++; // Кораци бројања за сваких 0,1 мс -> цоунт / 10 ће дати вредност броја у мс }
Напокон је време да пребаците ГПИО пин на основу вредности Т_ОН и Т_ОФФ. Имамо цоунт променљиву која води рачуна о времену у мили секунди. Дакле, користимо ту променљиву да бисмо проверили да ли је време краће од времена , ако је одговор да, онда ГПИО пин држимо укљученим, иначе га искључујемо и држимо искљученим док нови циклус не започне. То се може постићи упоређивањем са укупним временом једног ПВМ циклуса. Код за исто је приказан испод
иф (цоунт <= (Т_ОН)) // Ако је време мање од времена РД1 = 1; // Укључи ГПИО елсе РД1 = 0; // У супротном искључити ГПИО иф (цоунт> = (Т_ТОТАЛ * 10)) // Држите га искљученим док нови циклус не започне цоунт = 0;
Кружни дијаграм
Шема кола за генерисање ПВМ-а помоћу ГПИО пина ПИЦ микроконтролера је заиста једноставна, само напајте ПИЦ осцилатором и повежите потенциометар на пин АН0 и серво мотор на пин РД1, можемо користити ГПИО пин да добијемо ПВМ сигнал, изабрао сам РД1 само случајно. Потенциометар и серво мотор се напајају од 5 В, што је регулисано од 7805, као што је приказано доле на дијаграму кола.
Симулација
За симулацију пројекта користио сам свој софтвер протеус. Направите коло приказано доле и повежите код са вашом симулацијом и покрените га. Требали бисте добити ПВМ сигнал на РД1 ГПИО пину према нашем програму, а радни циклус ПВМ-а требало би да се контролише на основу положаја потенциометра. Доњи ГИФ показује како ПВМ сигнал и серво мотор реагују када се вредност АДЦ промени кроз потенциометар.
Постављање хардвера за управљање серво мотором помоћу ПИЦ микроконтролера
Моја комплетна поставка хардвера је приказана у наставку, за људе који прате моје водиче овај одбор би требао изгледати познато, то је иста плоча коју сам до сада користио у свим својим упутствима. Можете се упутити у ЛЕД водич који трепће ако вас занима како ја то градим. У супротном само следите горњу шему кола и све би требало да раде у реду.
Отпремите програм и промените потенциометар и требало би да видите како серво мења положај на основу положаја потенциометра. Комплетан радни пројекта је приказан на снимку датом на крају ове странице. Надам се да сте разумели пројекат и уживали сте у градњи, ако имате жеље, слободно их објавите на форуму и потрудићу се да одговорим.
Планирам да овај пројекат напредујем додавањем опција за управљање вишеструким серво моторима и на тај начин од њега градим роботску руку, слично Ардуино Роботиц Арм коју смо већ направили. Па до тада се видимо !!