Mikrokontroller programozás

Sziasztok! :grin:
Mivel láttam hogy igen széles körben kérnek segítséget a fórumon, én is megpróbálkozok, hátha valaki ki tud segíteni a bajból. :sweat_smile:

Egyetemi feladat, DC motor vezérlése PIC16F887 mikrokontrollerrel.

A motor fordulatszámát a kártyán levő potenciométerrel lehessen arányosan változtatni. A potméter középállásában a motor ne forogjon, az egyik szélső helyzetben teljes sebességgel forogjon előre, a másikban hátrafele. A motor a gomb minden szimpla megnyomásától számítva 60 másodpercig forogjon a potméteren éppen aktuálisan beállított sebességgel majd magától álljon le. (Lehessen változtatni a sebességet a 60s alatt is!) A gomb dupla megnyomásakor a motor azonnal álljon le. Az aktuális forgásirányt, illetve a kikapcsolt állapotot egy-egy LED is jelezze. Egy másik LED folyamatos, 2-5 darab felvillanással jelezze a potméteren beállított forgási sebességet. (A lassú forgást vagy álló helyzetet dupla felvillanásokkal, gyors forgást „5-ös” felvillanásokkal, köztes értékeket pedig arányosan jelezze!) A negyedik LED az eszköz működését folyamatos 5 Hz-es villogással jelezze. Az eszköz a bekapcsolás után folyamatosan, reszetelés nélkül is korlátlan ideig mutassa a fenti működést.

Mplabx, és Proteus programok használtával kellene a feladatot megoldani.

Előre is köszönöm a segítséget! :smile:

Szia!

Teljes kódot nem tudok neked szállítani idp hiányba. Rég volt hogy MPLab-bal dolgoztam PIC-kel, de annó annó én is programoztam ilyenen, ráadásul assemblyben. Ugyanúgy egyetemen, hasonló típusú feladatokkal.

Leírni se tudok mindent, csak felületesen a gondolatmenetem, de így is eléggé hossző lett a válaszom.

Első tanács: ne egybe edd meg az elefántot hanem szeletekbe. Ne egyszerre akard megírni az egészt hanem halad modulonként. Főleg ilyen komplex feladat esetén. Ha szükséges még jobban darabold fel, mint ahogy én feldaraboltam neked. Ha feldarabolod, akkor sok kis sikered lesz aminek eredményeképpen kevésbé akarod feladni mert valami márt működött :slight_smile:

Module 1 - Keljen életre a dolog

Gondolatmenet ügyileg a következőképpen oldalanám meg. Lenne egy timer ami mondjuk 100ms intevallumonként ér véget. Amikor leért, egy interrupton keresztül meglehetne hívni egy feldolgozó rutint, ami a következőt csinálja

Ez a rutin, beolvassa és elmenti az ADC értékét egy adott címre. Ezt az elmentett értéket aztán feldolgozhatod. Ha mondjuk 8 bites az ADC, akkor a digitális érték 0-255 között lesz. Ha nagyobb felbontású az ADC a PIC-en (nem néztem adatlapot), akkor nyílván más lesz, vagy sima jobbra shifteléssel lecsökkented 8 bitre. Ha 8 bites az ADC-d akkor a következők lesznek a fontos értékek:

  • 0-126 → A motor forog egyik irányba
  • 127 → A motor áll
  • 128-255 → A motor for másik irányba

De hogyan fog forogni a motor? Motort gondolom nem közvetklen hajtod meg PIC-ről, hanem valamiféle H-bridge IC-n keresztül vagy ilyesmi. Megnézed a H-bridge adatalapját mit hova kell kötnöd. A motor forgás irányát tulajdonképpen sima digitális kimenetekkel tudod állítani, ha megnézed az adatlapot látod hogy a motorn átfolyó áram irányát fordíotd meg velük, ez okozza a forgásváltást.

Attül függően hogy mi a poti értéke, tudod állítani ezeket a digitális pineket hogy merre forogojon. Ha középen van, akkor nem fog forogni, elméetlieg. Viszont az esélye, hogy potn be tudod állítani középre, eléggé kicsi ha figyelembe vesszük a poti hibáját meg az ADC hibáját is. Szóval én nem pont 127-re lőném be a megállást hanem mondjuk 120-130 közé, legyen kis threhsold hogy szemmel látható legyen az eredmény.

Module 2 - Szabályozzuk a motor sebességét

Mostani module-ban kiegészítjük az ADC értéket feldoölgozó rutint hogy a PWM-et is vezérelje.

Motor sebességének a szabályozása PWM-mel történhet. H-bridge IC-be megy be egy pin ahol a motor tápját adod meg ami a module 1-ben kostans volt. Na ide bekötsz egy tranzisztort a táp és a pin közé és a tranzisztor bázisára PWM jelet kötöd. Ezzel azt éred el hogy a 12V-ot ami megy a motorra tudod állítani.

Ha a PWM-ed 8 bites, akkor 0-nál áll nem kap tápot, 255-nél full gőzzel megy. Ide tudod bemapelni a ADC-ből kapod értéked. De arra figyelj hogy ADC-ből ne közvetlen írd az értéket PWM-be, mert így fura lesz.

Ugye ADC-nél egyik irányba forog 0-126, ezt fel kell map-elni 0-255, tehát 0 lesz a 0 és 126 lesz a 255. Lényegében 2-vel valü szorzás (shifetlés). Másik irányba forgás értékét 128-255, szintén fel kell mapelni 0-255 tartmoányba, azaz az értékből kivonsz 128-at és uyganúgy mapeled mint a másik irányt.

És így már annyival előrébb vagy a module 1-hez kéepst (ahol csak az irányt vezérelted), hogy már sebességet is vezérled.

Module 3 - Indító gomb

Ha ezzel eddig megvagy akkor már nagyon sokat tanultál és jó a progress-ed :slight_smile: A következő hogy a motor akkor fog forogjon 10 percig ha megnoymják a gombot.

Először kell egy új változó, aminek az értéke mondjuk alapból 0, nevezzük el START_BYTE-nak. Az ADC-t kezelő rutinhoz (timer interrupt) tedd be az elejére, hogy az 0, akkor ne csináljon semmit, simán lépjen ki / térjen vissza.

Ezen felül a program fő részében egy TICK_COUNTER változó értéke legyen 255.

Gomb kezelését javaslom hogy egy interupttal old meg a digitális bementen. Ha megnyomják a bekapcsoló gombot, akkor a következő történjen:

  • Állítsa a START_BYTE értékét 1-re
  • Beállít TICK_COUNTER-t nullára
  • Indítson el egy másik timert timert (ha jól láttam a PIC-edben 2 timer van), ami mondjuk 500ms-os intervalummal fut. 1 perc az ugye 6000ms, azaz 120 tick lesz 1 perc. Erre a timerre legyen egy interrupt, ami egy incrementálja a TICK_COUNTER értékét. Ha a TICK_COUNTER elérte a 120-as értékt akkor a PWM jelet vegye le 0-ra, és a START_BYTE értéke legyen 0

Module 4 - Dupla nyomásra kikapcs

Mondjuk hogy az számítson dupla kattintásnak ha 500ms-on belül megnymják a gombot. A gomboz rendelt digitális bementen lévő interrupt függvényt tudjuk módosítani. Ha a gomb megnyomásakor a TICK_COUNTER értéke nulla, akkor az dupla kattintás volt. Erre be tudod lőni a PWM-re a nullát, erre leáll a motor, a START_BYTE-ot beállítani 0-ra és a TICK_COUNTER értéket pedig 255re.

Fontos megjegyzeni, hogy a valóságban a gombok nem mindig jók. Főleg demo board-okon szokott gagyi lenni. Ekkor előfordulhat hogy te egyszer nyomod mega gombot de többször adja ki a magas jelet érintkezési hibák miatt. Ezt sima számolgatással ki tudod védeni ha szeretnéd, de itt nem részletezem.

Module 5 - Villogjon a LED

És elértünk oda hogy pörög a motor 2 irányba, sebeséggel szabályozva. Gomb nyomásra indul, 60 másodpercig fut és dupla gomb nyomásra megáll. Királyság!

Visziont nem értem ezt a villogós dolgot. Mit jelentsen hogy “2-5 felvilanással jelezze”? Mármint min belül? 10 másodpercen belül villanyom ennyiszer vagy hogy?

Megjegyzés, ha ez az a tantárgy és tanár amire és akire gondolok

Feladat eléggé húzosnak tűnik. Amit még tudok tanácsolni, hogy ha ez az a tantárgy aminek MSZP a rövidítése és Nagy A. nevű tanár úr tartja, hogy járj be következő félévben az órákra, ne unatkozz szemmel láthatóan és akkor nem ad ilyen feldatot. Ha ez az a tantárgy, nálunk annó azoknak adott ilyet akiket egy félévben látott vagy egyszer és akkor se voltak nagyon toppon :smiley:

3 Likes

Szia! :smiley:
Nemrég leadtam a feladatom, és sikeres lett. Elképesztően sokat segített a kifejtésed. Sokszor eltértem tőle, mert más ötletem támadt, de a logikáját megértettem a dolognak ennek köszönhetően, és meg tudtam csinálni működőre a dolgot! :smiley:

Igen, az a tárgy, az a tanár. :'D Annyi örömöm van, hogy random lettek kiosztva a feladatok, szóval talán nem utálatból kaptam ezt :smiley: .

2 Likes

This topic was automatically closed 8 hours after the last reply. New replies are no longer allowed.