6.25 nanosekund resolution timer för alla mikrokontroller!
När du utformar en solid state-ersättning för ett vakuum-rör-och-CRT radar display delsystem, var jag fast på att få ett lämpligt system då perioden mellan synch pulsen och echo pulsen. Synch puls och echo puls var att fångas på två stift över en Arduino förfallna. Arduino förfallodatum har en MCLK/2 klockan på 42 MHz, som skulle ge mig en upplösning på 23.81 nanosekunder (ns) som för ljushastigheten, skulle översätta till 6.86 meter. Jag ville ha en bättre upplösning.
Efter att ha tittat in i lösningar med hög hastighet oscillatorer och diskret logik ICs (räknare, SKIFT register), FPGAs och off hyllan lösningar kostar i spänna av USD 2,000 /-, bestämde jag mig att undersöka ESP8266 för någon lösning på min timing problem.
Till min glädje upptäckte jag två funktioner i Arduino ESP8266 API, nämligen ESP.getCycleCount() och ESP.reset()
ESP.getCycleCount() räknar instruktion cyklar sedan start, i en inre osignerat 32-bitars variabel, riskerar att svämma över varje 28 sekunder eller så. En en mikrosekund ger period 160 instruktion cykler. Nu för att mäta den programvara overhead som krävs av din programvara, behöver du bara räkna instruktion cyklar din rutin räknas för en 1 mikrosekund fördröja och subtrahera 160 från att räkna, att ge dig programvaran overhead i förvärva räkningen. För 1 mikrosekund dröjsmål fick jag en räkning av 213. Som fungerat till 213-160 = 53 räknas (53 x 6,25 = 331.25 nanosekunder) programvara overhead att förvärva räkningen. Subtrahera 53 från varje räknas ger mig en noggrannhet av några tiotals picoseconds, räkna för perioden från 30 mikrosekunder till cirka 500 mikrosekunder.