Hur får man en Arduino micros() funktion med 0.5us precision
Jag älskar Arduino microcontroller programmering, och jag använder det regelbundet i flyg-och forskning samt i hem projekt. När jag arbetar med mina många hem projekt, men befinner jag ofta mig behöver en mycket exakt timer. Detta beror på att mitt hem projekt fokus runt Radio kontroll (RC) flygplan och RC hobby meddelande signaler är timing-baserat signaler. Dessa RC meddelande signaler kallas PWM (Pulse bredd Modulation) och PPM (Pulse Position Modulation). I signaler, en full stick nedböjning i en riktning, på en handhållen radiosändare, vanligtvis motsvarar ~ 1000us (mikrosekunder), och en full stick nedböjning i motsatt riktning motsvarar ~ 2000us.
För att mäta tidpunkten i dessa signaler, använde jag den Arduino micros() funktion, tillsammans med externa avbryter. Den inbyggda Arduino micros() funktionen är bra, men inte bra nog för mina behov. Den har en precision av 4us (se här). Detta innebär att om jag läser i en PWM-signal som jag vet är exakt 1500us (center-stick position på en handhållen sändare), jag skulle se avläsningar av 1496, 1504, 1500 och ibland även 1492 eller 1508us. Detta är för mycket avvikelse.
So... Jag tittade och jag tittade och jag letade efter en lösning. Den enda lösningen jag kunde hitta används Atmega328 mikrokontroller Timer1, vilket är oacceptabelt för mina behov, eftersom då jag förlora användning av Arduino servo bibliotek. Därför har jag beslutat att göra massor av läsning och få i modet i mikrokontroller, direkt åtkomst till den Atmel timers och skriva min egen timerfunktionen.
Från denna strävan är född mitt Timer2_Counter "bibliotek," som innehåller funktioner som kan användas i stället för funktionen micros(), och som ger en precision av 0.5us, som är 8 x bättre än funktionen micros()!
För mer detaljerad information om min kod, samt den senaste versionen av min kod, inklusive en fullständig lista över dess funktioner, se min artikel här:
Arduino micros() funktion med 0.5us precision - med hjälp av min Timer2_Counter "Library".