Stap 5: Dus wat is het punt dan?
Het moet vrij duidelijk dat schrijven rechtstreeks naar de registers ruimte in uw geheugen chip besparen kunt. De verkorte schets ook kost minder tijd om uit te voeren, gewoon omdat er geen bibliotheken voor elke functie-aanroep opzoeken. Voor de overgrote meerderheid van de toepassingen hoeft dit niet echt gebruik omdat veel ruimte of tijd elimineren van een functie zoals pinMode() zullen niet opslaan in een complexe schets. In sommige toepassingen verwerkingstijd is echter een grote zorg, en inkorten van de hoeveelheid verspilde tijd in de bibliotheekbestanden zorgt voor meer klokcycli beschikbaar te zijn voor andere dingen. Wat ik bedoel met dat is dat zelfs als u moet een bibliotheekfunctie opnemen, en nemen daarom minder ruimte in het geheugen mee, als je het niet noemen het zeer vaak en in plaats daarvan rechtstreeks gebruik van de registers, ten minste besparen u tijd (maar niet ruimte) door niet opzoeken.
Een andere optie is de mogelijkheid om te pinnen gebruiken op manieren die ze kunnen niet oorspronkelijk de bedoeling zijn geweest, maar zonder de bijwerkingen. Bijvoorbeeld vergelijken de pinnen op de chipKIT Uno32 beschikken over een extra register gekoppeld die banden in de uitvoer vergelijk module (OCMP) genaamd de output met PWM gekoppeld register (OCxR). De OCMP heeft sommige meer registers die te maken hebben met de timing van het PWM-signaal, maar de OCxR is het werkelijke signaal uitgang register, vergelijkbaar met de LATx (PIC32) of PORTx (ATMEL) registers. Het PWM-periode wordt berekend door vermenigvuldiging van... (makkelijk maar verwarrend math stuff hier)... en dat de waarde wordt ingevoerd in de periode registreren (wrikken). Wrikken vertelt het timer-register (TMRy) die zorgt voor de specifieke OCMP wanneer opnieuw terug naar 0, maar je moet een extra er 1 bij optellen. De taakcyclus wordt dan weggeschreven naar het secundaire Vergelijk register (OCxRS), die in feite een buffer omdat deze waarde bijna onmiddellijk wordt overgedragen aan de vergelijken (OCxR), maar u kunt niet het rechtstreeks schrijven omdat OCxR is alleen-lezen.
Voorbeeld: als PRy een waarde van 5 heeft en OCxRS is geladen met een waarde van 2, OCxR is voor het eerst geladen met 2 ook. TMRy start tellen bij 0. Op 1, OCx uitgangen van een hoge waarde en blijft daar. Op tijdstip 2, verandert er niets, OCx hoog voor 1 telling is geweest. Tegelijkertijd 3 druppels OCx laag sinds het hoog voor 2 graven. Tijde 3, 4 en 5 verandert er niets maar TMRy = loeren, zodat het wordt opnieuw ingesteld en terug op 0 op de volgende tellen start. 1 kloktik passeert, die is telling 0 opnieuw, en tellen 1, OCx uitgangen weer hoog. Hier is figuur 16-18 uit sectie 16: Output vergelijk van het PIC32 familie handleiding:
PRy instelt op 5 en OCxRS naar 2 geeft eigenlijk een duty-cycle van 33% (2/6) en niet 40% (2/5). Dat is waar die extra 1 komt. Het wordt toegevoegd aan de waarde van de Koevoet. Dit is slechts een eenvoudig voorbeeld, en als wrikken en OCxRS veel groter waren, het verschil in %'s zou veel, veel kleinere.
Nou, dat simpel was het niet was? Ja, no. hoorde ik de versnellingen slijpen tot stilstand op "Bijvoorbeeld..." Je moet hebben gezien de blik op de gezichten van mijn klasgenoten toen de professor ons dit de eerste keer toonde. Maar dit is de reden waarom we bibliotheken hebben. Al deze spullen wordt afgehandeld door de bibliotheken wanneer we vertellen de servo te schakelen met een bepaalde snelheid of we willen spelen van een melodie met verschillende tonen. Maar 1) we zijn beperkt tot uitsluitend zijnde kundig voor gebruik van de PWM-pinnen, en 2) bibliotheken ruimte in het geheugen in beslag nemen. Wat doen we als we meer PWM-opties nodig? Gebruik de registers.
Het volgende schema is een eenvoudige toongenerator. Ik ga niet te doen omdat ik niet aanbevelen met behulp van servos zonder de servo.h-bibliotheek, een servo-voorbeeld al met wat werk is het zeker mogelijk. Het is veel te gemakkelijk om uit te breiden over de servo buiten het interne stopt. Als u wilt om het te doen, hebt u al te schrijven van de spullen van de achtergrond dat servo.h in uw schets verwerkt, maar langer schetsen in verschillende perioden van de PWM resulteren zal omdat elke regel een beetje tijd neemt.
Voordat we de schets, sommige snelle eenvoudige wiskunde zien. Eerst bepaalt de uitvoerfrequentie die u wilt. 1 Verdeel door uw frequentie te krijgen van uw periode, en dat vervolgens delen in de helft. Zorg ervoor dat waarde in microseconden, zet dan die waarde in zowel van de delayMicroseconds() functie implementaties. Als we willen voor het genereren van een duty-cycle dan 50%, vermenigvuldigt uw periode met de gewenste hoge percentage van de plicht-cyclus. Die nieuwe waarde invoeren in de delayMicroseconds() functie binnen de if() -instructie. Voer de rest in de delayMicroseconds() functie binnen de instructie else .
Voorbeeld: U wilt een vermogen van 1kHz. 1/1000 Hz = 1 milliseconde = 1000 microseconden = periode. 1000μs/2 = 500 µs ⇒ delayMicroseconds(). Als u wilt dat de taakcyclus van 60%: 1000μs * 60% = 600 µs ⇒ als() verklaring delayMicroseconds() waarde. 1000μs - 600μs = 400μs ⇒ anders verklaring delayMicroseconds() waarde. Leuk en gemakkelijk.
Hier is de toon generator code:
// Simple tone generator not using preset PWM // pins but using register manipulation bool state = true; void setup() { // chipKIT only // set register E, bit 0 as an output (0) // pin 26 Uno32/uC32; pin 37 Max32 TRISE = TRISE & 0xFFFE; // 0b1111 1111 1111 1110 // Arduino only // set register B, bit 0 as an output (1) // pin 8 UNO // DDRB = DDRB | 0x01; // 0b0000 0001 } void loop() { if (state) { // chipKIT only LATE = 0x0001; // Arduino only // PORTB = 0x01; state = false; delayMicroseconds(500); } else { // chipKIT only LATE = 0x0000; // Arduino only // PORTB = 0x00; state = true; delayMicroseconds(500); } }
Hieronder vindt u een o-scope beelden van de output, eerst van de chipKIT Uno32...
.. .en dan uit de Arduino UNO.
Gek genoeg, deze beelden werden gegenereerd met behulp van de register-manipulatie-schets zoals hierboven, en toen ik de standaardfunctie schets testte, de exacte dezelfde afbeelding popped opwaarts. Raar, right? Dus ik dacht dat ik zou besparen u hoeft te verspillen tijd op zoek op een duplicaat. Ik ook heb geen idee waarom de Arduino UNO vrij onstabiel op piek productie is, dus als iemand heeft enige legitieme uitleg, gelieve te verduidelijken in de commentaren.