Stap 4: De Firmware
Bijgevoegd is de firmware die ik voor deze kleine demo gebruikte. Ik gebruikte de vrije MPLAB IDE met de C18-compiler (gratis voor studenten). Beide zijn beschikbaar om te downloaden vanaf de website van de Microchip. De logica gaat als volgt:1. de wachttijd voor ergens tussen de 10 en 20 ms (in dit geval, 12)
2. Indien de knop (pin 4) wordt geduwd, meet het voltage van de potentiometer (pin 2)
3. Stel de hoge stuursignaal (5 v)
4. vertraging voor een tijdsduur evenredig met de spanning gemeten in stap 2
5. Stel het besturingssignaal lage (grond)
6. lus terug naar stap 1
Misschien is een beetje meer informatie over de analoog-naar-digitaal conversie in orde. Dus we al weten dat de spanning op pin 2 is gonna be ergens tussen 0 en 5 volt vanwege de spanning divider. De foto's A/D conversie werkt (conceptueel) soort als een omgekeerde spanning divider. Het rapporteert de spanning als een deel van de voedingsspanning. Echter is het aandeel geschaald worden tussen 0 en 255 (dat is 8 bits van informatie, de grootte van een niet-ondertekende teken). Met andere woorden, is de volgende gelijkheid ingesteld:
(pin 2 spanning) / 5v = POT_VALUE / 255
of:
POT_VALUE = 255 * ((pin 2 voltage) / 5v)
De foto doet eigenlijk een 10-bits A/D-conversie, maar 8 bits is veel granulaire genoeg voor onze doeleinden, zodat de twee minst significante bits van de A/D-conversie in deze code zijn niet gebruikt. Bovendien, de laatste paar cijfers zijn waarschijnlijk het meten van lawaai in plaats van het signaal zelf, zodat we niet dat alles veel missen door het negeren van hen.
De vertragingen zijn berekend op basis van de tijd die het kost om één instructie op de PIC, compleet met een klok van 4 MHz. Ik herinner me niet waarom, maar een of andere manier dat dit werkt naar 1/6 ons per instructiecyclus. Dus als we vertraging voor 5400 cycli, thats 5400 cycli * 1/6 Amerikaanse / cyclus = 900 US = 0.9 ms. een ander belangrijk stuk is het vinden van de constante van evenredigheid die weegschaal POT_VALUE (op een bereik van de 255-0 = 255) naar onze pulsbreedte (op een bereik van 2,1 ms-0.9 ms = 1200 ons); of, om het frame van de vraag een andere manier: Hoeveel cycli moeten we vertraging voor elke telling van POT_VALUE?
(1200 US * 6 cycli / ons) / 255 telt 28 cycli/count =
Degenen onder u na samen met de code zult merken dat ik eigenlijk 20 cycli per tellen, niet 28 vertragen. Dit is een experimenteel bepaalde waarde (ik keek het signaal met een oscilloscoop) die voor alle factoren die effect de timing, voornamelijk de overhead van de for-lus van lijn 68 past.