Fórum témák
» Több friss téma |
Cikkek » Autó belső világítás vezérlése PIC12F683 kontrollerrel Autó belső világítás vezérlése PIC12F683 kontrollerrel
Szerző: potyo, idő: Dec 9, 2008, Olvasva: 41465, Oldal olvasási idő: kb. 2 perc
A firmware-t a Hi-Tech cég C fordítójával készítettem. Az MPLAB telepítőjében is megtalálható úgynevezett Lite verzió is bőven elegendő a feladathoz. A forráskód elején elhelyezett VIL_IDO, HALV_IDO és BIZ_IDO nevű konstansokkal lehet az egyes be- és kikapcsolási időket az igényekhez beállítani. Az egész program időalapjául a Timer2 szolgál 1:4 arányú előosztóval beállítva, így a névlegesen 4MHz-es belső oszcillátorról 1024us időközönként csordul túl. Ez nem pontosan 1ms, de a feladathoz kellően pontos időalapot ad (meg a belső oszcillátor úgysem az a rettenetesen pontos időalap). Ugyanez a timer szolgál a PWM kimenet alapjául is, így a PWM frekvencia kb. 1kHz. Megszakítást nem használtam, mivel a programot olyanra írtam, hogy ne legyen olyan pontja, amelynek végrehajtása hosszú ideig tartana. Így elég a főprogram végtelen ciklusában ránézni a timer2 túlcsordulását jelző flag-re. Valamint ez így egy jó példa arra is, amit sokan nem értenek, hogy a timer és a megszakítás nem mereven egybefüggő dolgok. Az üzem közbeni mérések szerint még legrosszabb esetben is csak 33us ideig tart a timer2 túlcsordulása után a komplett rutin lefutása, tehát elvileg még alacsonyabb órajelről is lehetne járatni a kontrollert. De mivel "munka" közben az áramfelvétele így is csak kb. 600uA, amikor nem csinál semmit, akkor pedig úgyis SLEEP-ben van (ekkor a 2mA méréshatárú műszer nem mutatott áramfelvételt), ezért nem tartottam lényegesnek, hogy az órajelet a lehető legalacsonyabbra válasszam. A program alapvetően három blokkra osztható. Az első és a második blokk 1ms időnként futnak le, míg a harmadik blokk csak akkor fut le, ha a második blokk ezt jelzi. Az első blokk végzi a lámpa bekapcsolásához a PWM kitöltési tényezőjének állítását a szamlalo nevű változó alapján. A szamlalo nevű változó pillanatnyi értéke tartalmazza mindig, hogy még mennyi ideig lesz a lámpa bekapcsolva, beleértve a halványítást is. Amíg a számláló értéke nagyobb, mint amennyi idő alatt elhalványodik a lámpa, addig a PWM kitöltési tényezője 100%. Amikor a szamlalo a halványodási időtől kisebb lesz, akkor a kontroller elkezdi csökkenteni a kitöltési tényezőt. Itt egy kis trükköt alkalmaztam, mert az osztás nagyon sok utasításciklust igényelne, így viszont néhány ciklusban megvan a PWM beállítása azzal a kis kompromisszummal, hogy a halványodás ideje mindenféleképpen 255ms egész számú többszöröse. A c segédváltozó értéke mindig annyiról indul, ahányszorosa a halványodási idő ms-ban mérve a 255-nek. Amikor a c értéke nullára ért, akkor egyel csökkentem a kitöltési tényezőt, és visszaállítom c kezdőértékét. Így a több mint 1000 utasításciklust tartalmazó osztás helyett kb. 6 utasításból áll a PWM kitöltési tényezőjének beállítása. Ha a számláló 100-tól kisebb, akkor fixen nullázzuk a kitöltési tényezőt, tehát kikapcsoljuk a lámpát. Ha a szamlalo nullára csökkent, akkor engedélyezzük a bemenetek számára, hogy változáskor bebillentésék a megszakításjelző flaget, majd SLEEP-be küldjük a kontrollert. Ha változás jelentkezik valamelyik bemeneten, akkor a kontroller felébred SLEEP-ből, 90-et ír a szamlalo nevű változóba, és pergésmentesíti a bemeneteket, majd reagál a bemeneten bekövetkezett változásra. A 90-nek semmi konkrét lényege nincs, az a lényeg, hogy kisebb legyen, mint ami alatt már fixen nullázzuk a PWM kitöltési tényezőjét (100), hogy biztosan ne villanjon fel a lámpa, de nagyobb legyen, mint ahányszor megnézzük a bemeneteket, mielőtt stabilnak vesszük azokat (50). A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |