- Kas ir PWM signāls?
- PIC programmēšana PWM ģenerēšanai uz GPIO tapām
- Ķēdes shēma
- Simulācija
- Aparatūras iestatīšana servomotora kontrolei, izmantojot PIC mikrokontrolleru
PWM signālu ģenerēšana ir būtisks rīks katrā iegulto inženieru arsenālā, tie ir ļoti noderīgi daudzām lietojumprogrammām, piemēram, servomotora stāvokļa kontrolei, maz jaudas elektronisko IC pārveidotāju / invertoru pārslēgšanai un pat vienkāršai LED spilgtuma kontrolei. PIC mikrokontrolleros PWM signālus var ģenerēt, izmantojot salīdzināšanas, uztveršanas un PWM (CCP) moduļus, iestatot nepieciešamos reģistrus. Mēs to jau esam iemācījušies PIC PWM apmācībā. Bet šai metodei ir viens ievērojams trūkums.
PIC16F877A var radīt PWM signālu tikai tapām RC1 un RC2, ja mēs izmantojam ĶKP moduļus. Bet mēs varam saskarties ar situācijām, kad mums ir nepieciešamas vairāk piespraudes, lai būtu PWM funkcionalitāte. Piemēram, manā gadījumā es vēlos vadīt 6 RC servomotorus savam robotu roku projektam, kuram CCP modulis ir bezcerīgs. Šajos scenārijos mēs varam ieprogrammēt GPIO tapas PWM signālu ražošanai, izmantojot taimera moduļus. Tādā veidā mēs varam ģenerēt tik daudz PWM signālu ar jebkuru nepieciešamo tapu. Ir arī citi aparatūras uzlaušanas gadījumi, piemēram, multipleksētāja IC izmantošana, bet kāpēc ieguldīt aparatūrā, ja to pašu var sasniegt, programmējot. Tātad šajā apmācībā mēs uzzināsim, kā pārveidot PIC GPIO tapu par PWM tapu, un, lai to pārbaudītu, simulēsim to proteus ar digitālo osciloskopu, kā arīkontrolēt servomotora stāvokli, izmantojot PWM signālu, un mainīt tā darba ciklu, mainot potenciometru.
Kas ir PWM signāls?
Pirms mēs iedziļināmies detaļās, ļaujiet mums nedaudz papildināt, kādi ir PWM signāli. Pulsa platuma modulācija (PWM) ir ciparu signāls, ko visbiežāk izmanto vadības ķēdēs. Šis signāls ir iestatīts uz augstu (5v) un zemu (0v) iepriekš noteiktā laikā un ātrumā. Laiku, kurā signāls paliek augsts, sauc par “ieslēgšanas laiku” un laiku, kurā signāls paliek zems, - par izslēgšanas laiku. PWM ir divi svarīgi parametri, kas apspriesti turpmāk:
PWM darba cikls
Laika procentuālo daļu, kurā PWM signāls paliek AUGSTS (laikā), sauc par darba ciklu. Ja signāls vienmēr ir ieslēgts, tas ir 100% darba ciklā un, ja tas vienmēr ir izslēgts, tas ir 0% darba cikls.
Darba cikls = Ieslēgšanas laiks / (Ieslēgšanas laiks + Izslēgšanas laiks)
Mainīgā nosaukums |
Attiecas uz |
PWM_Frequency |
PWM signāla biežums |
T_TOTAL |
Kopējais laiks, kas vajadzīgs vienam pilnam PWM ciklam |
T_ON |
PWM signāla ieslēgšanas laiks |
T_OFF |
PWM signāla izslēgšanās laiks |
Cikls |
PWM signāla darbības cikls |
Tāpēc tagad darīsim matemātiku.
Šīs ir standarta formulas, kur frekvence ir vienkārši laika atgriezeniskā vērtība. Biežuma vērtība ir jāizlemj un jānosaka lietotājam, pamatojoties uz viņa / viņas lietojuma prasībām.
T_TOTAL = (1 / PWM_Frequency)
Kad lietotājs maina Duty cycle vērtību, mūsu programmai automātiski jāpielāgo T_ON laiks un T_OFF laiks atbilstoši tam. Tātad iepriekš minētās formulas var izmantot, lai aprēķinātu T_ON, pamatojoties uz Duty_Cycle un T_TOTAL vērtību.
T_ON = (Duty_Cycle * T_TOTAL) / 100
Tā kā PWM signāla kopējais laiks vienam pilnam ciklam būs ieslēgtā laika un izslēgtā laika summa. Mēs varam aprēķināt izslēgšanās laiku T_OFF, kā parādīts iepriekš.
T_OFF = T_TOTAL - T_ON
Paturot prātā šīs formulas, mēs varam sākt programmēt PIC mikrokontrolleru. Programma ietver PIC taimera moduli un PIC ADC moduli, lai izveidotu PWM signālu, kura pamatā ir mainīgs darba cikls atbilstoši ADC vērtībai no POT. Ja jūs vēl neesat lietojis šos moduļus, ieteicams izlasīt atbilstošo apmācību, noklikšķinot uz hipersaitēm.
PIC programmēšana PWM ģenerēšanai uz GPIO tapām
Pabeigta programma par šo pamācību var atrast apakšā mājas lapā, piemēram, vienmēr. Šajā sadaļā sapratīsim, kā programma faktiski tiek uzrakstīta. Tāpat kā visas programmas, mēs sākam ar konfigurācijas bitu iestatīšanu. Esmu izmantojis atmiņas skatu opciju, lai to iestatītu man.
// CONFIG #pragma config FOSC = HS // Oscilatora izvēles biti (HS oscilators) #pragma config WDTE = OFF // Sargsuņa taimera iespējošanas bits (WDT atspējots) #pragma config PWRTE = OFF // Ieslēgšanas taimera iespējošanas bits (PWRT) atspējots) #pragma config BOREN = IESLĒGTS / / Aizsargātais atiestatīšana Iespējot bitu (BOR iespējots) # Pragma config LVP = Izslēgts // Zemsprieguma (viena piegāde) ķēdes sērijveida programmēšanas iespējošanas bits (RB3 ir digitāla I / O Programmēšanai jāizmanto HV uz MCLR) #pragma config CPD = OFF // Data EEPROM atmiņas koda aizsardzības bits (datu EEPROM koda aizsardzība izslēgta) #pragma config WRT = OFF // Flash programmas atmiņas rakstīšana Iespējot bitus (Rakstīšanas aizsardzība off; visu programmas atmiņu var ierakstīt ar EECON kontroli) #pragma config CP = OFF // Flash programmas atmiņas koda aizsardzības bits (koda aizsardzība izslēgta) // #pragma config paziņojumiem vajadzētu būt pirms projekta faila iekļaušanas. // Ieslēgšanai un izslēgšanai izmantojiet projekta uzskaiti, nevis #define. # iekļaut
Tad mēs pieminam aparatūrā izmantoto pulksteņa frekvenci, šeit mana aparatūra izmanto 20MHz kristālu, vērtību varat ievadīt, pamatojoties uz aparatūru. Pēc tam seko PWM signāla frekvences vērtība. Tā kā mans mērķis šeit ir kontrolēt hobija RC servomotoru, kuram nepieciešama PWM frekvence 50Hz, kā frekvences vērtību esmu iestatījis 0,05KHz, to var arī mainīt, pamatojoties uz lietojumprogrammas prasībām.
#define _XTAL_FREQ 20000000 #define PWM_Frequency 0.05 // in KHz (50Hz)
Tagad, kad mums ir frekvences vērtība, mēs varam aprēķināt T_TOTAL, izmantojot iepriekš apspriestās formulas. Rezultāts tiek sadalīts ar 10, lai laika vērtību iegūtu mili sekundēs. Manā gadījumā T_TOTAL vērtība būs 2 mili sekundes.
int T_TOTAL = (1 / PWM_Frekvence) / 10; // aprēķiniet kopējo laiku no frekvences (mili sekundēs)) // 2ms
Pēc tam mēs inicializējam ADC moduļus potenciometra pozīcijas nolasīšanai, kā tas ir apspriests mūsu ADC PIC apmācībā. Tālāk mums ir pakalpojuma Pārtraukšanas kārtība, kas tiks izsaukta katru reizi. Taimeris pārpildās, pie kura mēs atgriezīsimies vēlāk, tagad pārbaudīsim galveno funkciju.
Galvenās funkcijas iekšpusē mēs konfigurējam taimera moduli. Šeit es esmu konfigurējis taimera moduli, lai tas pārpildītos ik pēc 0,1 ms. Laika vērtību var aprēķināt, izmantojot tālāk norādītās formulas
RegValue = 256 - ((aizkave * Fosc) / (Prescalar * 4)) aizkave sekundēs un Fosc hz
Manā gadījumā ar kavējumu 0,0001 sekunde (0,1 ms) ar preskalāru 64 un Fosc 20 MHz, mana reģistra vērtībai (TMR0) jābūt 248. Tātad konfigurācija izskatās šādi
/ ***** Taima taimera porta konfigurācija ****** / OPTION_REG = 0b00000101; // Taimeris0 ar ārējo frekvenci un 64 kā preskalāru // Iespējo arī PULL UPs TMR0 = 248; // Ielādējiet laika vērtību 0,0001 s; delayValue var būt no 0 līdz 255 tikai TMR0IE = 1; // Iespējot taimera pārtraukuma bitu PIE1 reģistrā GIE = 1; // Iespējot globālo pārtraukumu PEIE = 1; // Iespējot perifēro traucējumu / *********** ______ *********** /
Tad mums ir jāiestata ieejas un izejas konfigurācija. Šeit mēs izmantojam AN0 tapu ADC vērtības un PORTD tapu nolasīšanai, lai izvadītu PWM signālus. Tāpēc sāciet tos kā izejas tapas un padariet tos zemus, izmantojot tālāk norādītās koda rindas.
/ ***** I / O porta konfigurācija ****** / TRISD = 0x00; // Norādiet MCU, ka visas PORT D tapas tiek izvadītas PORTD = 0x00; // Inicializējiet visas tapas uz 0 / *********** ______ *********** /
Infinite while loop iekšpusē no darba cikla mums jāaprēķina laika vērtība (T_ON). Ieslēgšanas laiks un darba cikls mainās atkarībā no POT stāvokļa, tāpēc mēs to darām atkārtoti kamēr cilpa, kā parādīts zemāk. 0,0976 ir vērtība, kas jāreizina ar 1024, lai iegūtu 100, un, lai aprēķinātu T_ON, mēs to reizinājām ar 10, lai iegūtu vērtību mili sekundēs.
kamēr (1) { POT_val = (ADC_Read (0)); // Izlasiet POT vērtību, izmantojot ADC Duty_cycle = (POT_val * 0.0976); // Karte no 0 līdz 1024 līdz 0 līdz 100 T_ON = ((Duty_cycle * T_TOTAL) * 10/100); // Aprēķiniet ieslēgšanās laiku, izmantojot formulu vienību mili sekundēs __delay_ms (100); }
Tā kā taimeris ir iestatīts uz pārplūdi ik pēc 0,1 ms, ik pēc 0,1 ms tiek izsaukta taimera pārtraukuma pakalpojuma kārtība ISR. Pakalpojuma rutīnas iekšpusē mēs izmantojam mainīgo, ko sauc par skaitu, un palielinām to ik pēc 0,1 ms. Tādā veidā mēs varam izsekot f laiku. Lai uzzinātu vairāk par pārtraukumiem PIC mikrokontrollerī, sekojiet saitēm
ja (TMR0IF == 1) // Taimera karodziņš ir aktivizēts taimera pārpildes dēļ -> iestatīts uz pārplūdi ik pēc 0,1 ms { TMR0 = 248; // Ielādēt taimeri Vērtība TMR0IF = 0; // Notīrīt taimera pārtraukuma karodziņu skaitu ++; // Skaitījuma pieaugums par katru 0,1 ms -> skaits / 10 sniegs skaitījuma vērtību milisekundēs }
Visbeidzot, ir pienācis laiks mainīt GPIO tapu, pamatojoties uz T_ON un T_OFF vērtību. Mums ir skaitīšanas mainīgais, kas seko laikam mili sekundēs. Tātad, mēs izmantojam šo mainīgo, lai pārbaudītu, vai laiks ir mazāks nekā laikā , ja jā, tad mēs turam ieslēgtu GPIO tapu, mēs to izslēdzam un turam izslēgtu, līdz sākas jauns cikls. To var izdarīt, salīdzinot to ar viena PWM cikla kopējo laiku. Kods, lai izdarītu to pašu, ir parādīts zemāk
ja (skaits <= (T_ON)) // Ja laiks ir mazāks nekā laika RD1 = 1; // Ieslēdziet GPIO else RD1 = 0; // Cits izslēdziet GPIO, ja (skaits> = (T_TOTAL * 10)) // Turiet to izslēgtu, līdz sākas jauns cikls = 0;
Ķēdes shēma
Shēma PWM ģenerēšanai ar PIC mikrokontrollera GPIO tapu ir patiešām vienkārša, vienkārši ieslēdziet PIC ar oscilatoru un pievienojiet potenciometru, lai piestiprinātu AN0, bet servomotoru - RD1, mēs varam izmantot GPIO tapu, lai iegūtu PWM signālu, es esmu izvēlējies RD1 tikai nejauši. Gan potenciometru, gan servomotoru darbina 5 V, kuru regulē no 7805, kā parādīts zemāk ķēdes shēmā.
Simulācija
Lai modelētu projektu, es izmantoju savu proteus programmatūru. Izveidojiet zemāk redzamo shēmu un saistiet kodu ar savu simulāciju un palaidiet to. Jums vajadzētu saņemt PWM signālu uz RD1 GPIO tapas atbilstoši mūsu programmai, un PWM darbības ciklam jābūt kontrolētam, pamatojoties uz potenciometra pozīciju. Zemāk redzamais GIF parāda, kā PWM signāls un servomotors reaģē, mainot ADC vērtību caur potenciometru.
Aparatūras iestatīšana servomotora kontrolei, izmantojot PIC mikrokontrolleru
Mana pilnīgā aparatūras iestatīšana ir parādīta zemāk, cilvēkiem, kuri seko manām apmācībām, šai dēlim vajadzētu izskatīties pazīstami, tā ir tā pati dēlis, kuru esmu izmantojis visās līdz šim izmantotajās apmācībās. Ja vēlaties uzzināt, kā es to veidoju, varat uzzināt par mirgojošo LED apmācību. Pretējā gadījumā vienkārši izpildiet iepriekš minēto shēmu, un visiem vajadzētu darboties labi.
Augšupielādējiet programmu un mainiet potenciometru, un jums vajadzētu redzēt servo, kas maina pozīciju, pamatojoties uz potenciometra stāvokli. Pilnīga darba projekta ir redzams video dota beigās šo lapu. Ceru, ka sapratāt projektu un jums patika būvēt. Ja jums ir vēlmes, droši publicējiet tos forumā, un es centīšos darīt visu iespējamo, lai atbildētu.
Es plānoju virzīt šo projektu uz priekšu, pievienojot iespējas kontrolēt vairākus servomotorus un tādējādi no tā uzbūvējot robotu roku, līdzīgi kā mēs jau uzbūvējām Arduino robotu roku. Tātad, līdz tam redzēsit!