Die Timingproblem liegen an den "delayMicroseconds()" Befehlen.
Der µC macht dann solange genau "nichts" (NOP = non operating).
Damit verzögert man den Schleifendurchlauf und macht das Programm langsam.
Der nächste Schritt beim Lernen von Arduino wäre Dein programm von einfach auf effektiv umzustellen und dann auf elegant und effektiv.
Ich habe ja weiter oben schon darüber geschrieben wie man das mit Timerabfagen und Interrupts machen kann.

Wenn es so läuft und das der einzige Zweck ist, kannst Du es auch so lassen (never change a running system).
Wenn Du Dich verbessern willst, gehe den nächsten Schritt.