Stap 5: Details van software: snelheid, controle- en andere basisfuncties
Aangezien het is een soort van een zeer eenvoudige coöperatie moet "real-time Operating systeem ," elke routine worden uitgevoerd in de kortst mogelijke tijd, het systeem vrijmaken om te zorgen voor de zeer frequente interrupts.
Er zijn geen "wachten" en geen vertraging in de code. Wanneer mogelijk interrupts worden gebruikt, in het bijzonder voor langzame bewerkingen zoals het zenden of ontvangen van tekenreeksen. UART mededeling neemt de advantege van de DMA-mogelijkheden van de dsPIC33F op te slaan van de CPU-tijd doen alle 'vuile' werk in hardware.
Randapparatuur gebruikt op dsPIC33FJ128MC802:
-QEIs voor het berekenen van het reisde pad.
-Input Capture (IC) snelheid te berekenen.
-A/D converters te lezen motor stroom.
-Verbeterde PWMs te rijden van de motoren.
-UARTs om te communiceren met de buitenwereld
QEI modules worden gebruikt om te weten hoeveel de wielen hebben reisde en in welke richting. Deze waarde is algebraïsch gecumuleerd in een variabele elke 1ms en verzonden naar de functies van de toezichthouder op haar verzoek. Nadat de waarde wordt verzonden, worden de variabelen worden gereset.
Snelheid wordt gemeten aan de elke encoder pulse zoals hieronder beschreven. Elke 1ms het berekent de gemiddelde snelheid met gemiddeld monsters, PID algoritme uitvoert, en corrigeert de motorsnelheid dienovereenkomstig aan het resultaat, PWM taakcyclus wijzigen. Zie voor een gedetailleerde beschrijving van de C30 PID bibliotheektoepassing, Microchip codevoorbeeld: CE019 - met behulp van proportioneel integrale afgeleide (PID) controllers in Closed-loop controlesystemen. http://WW1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
Snelheid variaties van de motoren uitgevoerd soepel, versnellen of vertragen met een stijgende of dalende Schuine oprit, ter voorkoming van zware mechanische spanning en wiel ontsporing, die fouten in de odometry veroorzaken kan. Vertraging is sneller dan de versnelling te vermijden hobbels met obstakels tijdens het remmen.
IC , input capture modules worden gebruikt voor het meten van de tijd die is verstreken tussen twee pulsen gegenereerd door het coderingsprogramma, s wil zeggen wanneer de wielen voor een bekende vaste hoeveelheid ruimte (constante SPACE_ENC reisde ). Aangesloten parallel aan de QEA (intern naar de DSC dankzij de mogelijkheden van perifere Pin selecteren van de dsPIC33F), vangen ze verstreken tijd aan stijgende rand van signalen van de encoders. TIMER2 wordt gebruikt in de free-running modus. Bij elke interrupt IC TMR2 de huidige waarde is opgeslagen en de vorige waarde wordt afgetrokken van het; Dit is de periode van de pols. Vervolgens wordt de huidige waarde de vorige waarde, in afwachting van de volgende interrupt. TMR2 de vlag moet worden gecontroleerd om te weten als een overloop in the16-bits register gebeurd. Zo ja, is het verschil tussen 0xFFFF en in het vorige voorbeeld worden toegevoegd aan de huidige waarde. Monsters worden algebraïsch toegevoegd in IcPeriod variabele volgens _UPDN bits, om te bepalen ook de richting van de snelheid. Dit is een van de voorgestelde methoden in Microchip toepassing notitie AN545 .
De variabele IcIndx bevat het aantal monsters toegevoegd in IcPeriod .
Elke 1ms is de gemiddelde snelheid berekend als V ruimte/tijd =
waar ruimte = SPACE_ENC•IcIndx
(= ruimte bedekt met een encoder pulse • aantal pulsen)
en keer = TCY•IcPeriod
(= enkele TMR periode • sommatie van perioden is opgetreden).
Single_TMR_period = DL = 1/FCY (klokfrequentie).
Zo V=Kvel•(IcIndx/IcPeriod)
waar Kvel = SPACE_ENC•FCY snelheid in m/s hebben.
15 bits Kvel const verschuiving links (KvelLong = Kvel << 15 ) de snelheid is al berekend in de decimale indeling (ook als alleen integer variabelen worden gebruikt) klaar om te worden gebruikt in routine van PID. Zie "descrEng.txt" bestand in MPLAB-project voor een meer gedetailleerde beschrijving.
A/D converters continu meten motoren huidige, tijdwaarden op te slaan in de 16 posities ADCBUF buffers. Buffers zitten vol, een interrupt optreedt als een gemiddelde waarde wordt berekend ongeveer elke 1ms.
UARTs worden gebruikt om opdrachten van buiten te ontvangen en voor het terugsturen van de resultaten van de metingen. Het communicatie gedeelte van het programma wordt uitgevoerd als een statusmachine. Status variabelen worden gebruikt voor het uitvoeren van acties in de juiste volgorde. Erg makkelijk en snel onderbreken Service Routines (ISR) krijgen of elke één byte van of naar een buffer, en instellen van de juiste vlaggen te laten de juiste functie moet worden uitgevoerd.
Als elke vorm van fout optreedt tijdens het ontvangen van de UART (, controlesom, parsing fouten), de variabele status is ingesteld op een negatief getal en de rode led wordt gevoed omhoog te communiceren extern deze schuld voorwaarde. Zie "descrEng.txt" bestand in MPLAB-project voor een volledige lijst van mogelijke fouten.
Het protocol dat wordt gebruikt voor de handdruk fysieke laag onafhankelijk is, en kan worden gebruikt met de I2C of RS485 bus zo goed te communiceren.
De eerste laag wordt gecontroleerd door dsPIC peripheral interface. Frame of overschrijding fouten (UART) of botsingen (I2C) worden gedetecteerd door de hardware, de juiste vlag instelt.
De tweede laag wordt afgehandeld door ISR routines. Ze vullen de RX-buffer met de bytes dat is ontvangen van de interfaces. Ze detecteren ook bufferoverloop en opdracht overschreden.
UartRx of UartRx2 functies beheren de derde laag . Zoals reeds beschreven fungeren (Zie ook stroomschema's) deze routines als een statusmachine, krijgen van bytes van de buffer en decoderen de opdrachtreeks.
De bytes worden uitgewisseld tussen de tweede en derde lagen (ISR en UartRx functie) via een circulaire buffer. ISR een byte ontvangt, slaat deze op in een matrix en een pointer naar de matrix, verhoogd als de muisaanwijzer bereikt het einde van de array dat het opnieuw wordt opgestart naar het begin. De functie UartRx heeft zijn eigen pointer naar het lezen van dezelfde array, verhoogd (in een circulaire veel te) zodra de byte in de huidige status van de RX is gedecodeerd. Belangrijkste lus roept de functie van de UartRx wanneer de aanwijzer "in" "out" aanwijzer verschilt.
Elk commando-pakket bestaat uit:
0 - header @
1 - ASCII ID 0-9
2 - Cmd A-Z ASCII
3 - CmdLen-N 1-MAX_RX_BUFF = aantal navolgende bytes (controlesom inbegrepen)
4 - data...
...
N-1-gegevens
N - checksum 0-255 verkregen door gewoon te tellen in een 8 bits variabele, alle bytes componeren het bericht (controlesom zelf uitgesloten).
Deze laag controleert timeout checksum fouten, alsmede packet consistentie (juiste header, juiste lengte). Als alles ok is hierdoor Parser routine (vierde laag ) om het bericht te decoderen en de vereiste actie uitvoeren. Deze routine stelt u de vlag van het juiste fout als de code van de bericht ontvangen is niet bekend.
TMR1 genereert een 1000 Hz timing klok - de hartslag van het programma. Op elke TMR1 de interrupt, interne timers worden bijgewerkt, de watchdog is uitgeschakeld en een vlag is ingesteld op het inschakelen van de functie waarin u wordt gevraagd de waarde reisde ruimte. Elke 10ms "All_Parameters_Ask"-functie (snelheid, positie, huidige) is ingeschakeld.