3DOF boll på plattan med stängd Loop stegmotorer (12 / 13 steg)
Steg 12: Kontrollmetoder
Stegmotorer drivs normalt på ett absolut sätt där mängden steg skickas till motorn spåras för att fastställa motorisk rörelse. Detta förfarande har två oönskade kvaliteter. Det mest uppenbara är förlorade steg. Om motorn stöter på en belastning som är tillräcklig för att stop-motion, är den verkliga positionen förlorad, som befallde stegen inte längre matchar motors placering. Mindre uppenbara problemet producerar och räkna motor steg när du använder microstepping vid höga hastigheter. En typisk stegmotor har 200 steg för en fullständig revolution. Detta kan översättas till 6400 steg för en fullständig revolution om använder 32 mikrosteg styrenheter. När igång motorerna vid 300 varv, behövs en produktion på 32000 steg per sekund per motor. Kör tre motorer skulle resultera i nästan 200K logik ändringar per sekund. Gör denna nivå av realtidshantering på en 16MHz 8-bitars mikrokontroller lämnar inget utrymme för andra uppgifter.
Lösningen är att avlasta den steg generationen att hårdvara nivå timers och jämföra register när du använder pulsgivare på motorerna att direkt mäta rörelse. Ett slutet kretslopp kan sedan ställas in med indatavärdet som representerar skillnaden mellan en önskad motor vinkel och den uppmätta vinkeln från kodaren. Utdata från den kontrollerar kretsar skulle ställa motorns varvtal. Nödvändiga puls tåget genereras från tre 16-bitars hårdvara timers med tre jämför register. Timers är inställda med ingen pre skalning producerar en räkna antalet 16 MHz som återställer när räkningen motsvarar jämför registrerar. En motsvarande utgångsstiftet ska växlas på lamptimer, generera ett puls tåg behövs för att flytta stegmotor. Frekvensen av puls tåget bestäms av storleken på Jämför registret och bestämmer VARVTALET på motorn. Skalade utdata från stepper motor kontrollerar kretsar kan nu matas in jämför registret ange motor RPM. Med den här metoden sker alla stepper motor signal generation på hårdvara nivå lämnar mikrokontroller fri för andra aktiviteter.
En proportionell-derivat (PD) kontrollerar kretsar genomförs för att uppnå krampa bollen positionering. En integrerad komponent var lagt till, men inte behövs. Proportionell benämna i den kontrollerar kretsar är helt enkelt skillnaden mellan befallde och den uppmätta ball plats multiplicerat med en proportionell vinst. Proportionell termen resultat i smidig förflyttning av platta vinkeln, som förändringar i bollen plats normalt leda till ett stort antal. Detta är inte sant när beräkningen av en enkel först beställer härledda dx ≈ [x(i) − x(i−1)] /h som bollen rörelse mellan mätningar är liten med relativt stora buller. Beteendet kan förbättras genom att öka tiden mellan mätningar men systemets responstid blir då stor. Lösningen är att använda mer av bollar historia att bättre förutse den aktuella hastigheten. En bra approximation för bollar är konstant acceleration som den plattan vinkel inte ändrar rabiat. Ett andra beställa exakt stencil med bara förbi mätningar för att förutsäga nuvarande derivatan önskas. Schablonen bör ha bra buller avvisande och tid svar beteende. Pavel Holoborodko har publicerat en lista över stenciler för en dubbelsidig härledda uppskattning som en 16 punkt stencil valdes. Den resulterande derivatan är betydligt smidigare än det enkla fallet bibehållen god systemets svarstid.
Både proportionell och derivat komponenter adderas så att den proportionella delen lutar plattan för att påskynda bollen mot ange platsen och komponenten härledda lutar plattan för att bromsa klumpa ihop förslaget. Omfattningen av varje värde kan ställas in genom att justera vinst värden tills systemet är kritiskt dämpad.
Plattformen vinklar som representerar X- och Y tilt behöver omvandlas till de tre stepper motor vinklarna. X- och Y-axeln är projiceras på tre motoriska axeln att bestämma relativ kontroll korrigeringskoefficienter. Denna metod är bara en uppskattning av önskat beteende men fungerar som behövs.
Konsekvent kod utförande priser behövs. Detta uppnås genom användning av en avbrott rutin som utlöser varje 1ms bort av Timer0. Code execution flaggor aktiveras i rutinen avbrott som gör att olika delar av koden för att köra.