Ich möchte mit meinem Arduino Mega 3 Hall Signale nachbilden, die 120° phasenverschoben sind. Das Problem dabei ist die Frequenz. Ich muss mit der Frequenz auf 50 khz kommen, schaffe aber maximal 36 khz. Das Programm läuft mit dem Timer1, den ich auf den Wert 65534 setze und dann immer nur einen schritt nach oben zählt. Dann löst der Overflow Interrupt aus, der eine Switch-Case durchläuft und den Wert wieder auf 65534 setzt. Trotz Prescaler 1 und manuelles Pin auf High setzen (digitalWrite umgangen um Zeit zu sparen) komm ich nicht auf meine gewünschten 50 khz. Gibt es weitere Möglichkeiten um meinen Sketch zu optimieren, bzw andere Lösungen ?
Ich Lade ein Bild vom Oszilloskop hoch, damit man genau sieht was ich möchte. Die Frequenz soll 50 khz betragen.
1.) Verwende nicht den Overflow Interrupt, sondern den CTC Modus (Modus 4) mit Compare Match Interrupt. Dann sparst du es dir das Counter-Register immer wieder per Hand vorzubesetzen. Bei CTC wird das automatisch auf 0 gesetzt wenn der Wert des OCR1A Registers erreicht ist.
2.) Statt |= und &= einfach nur = machen. Dann wird der Port nicht erst gelesen und verknüpft. Dadurch gehen natürlich die restlichen 5 Pins auf dem Port verloren, da die dann immer 0 sind.
3.) Deklariere x als byte, nicht als int. int hat 16 Bit und eine Addition braucht dann auch mehr Zeit.
Ob das aber ingesamt so viel bringt sei mal dahingestellt. 50kHz sind 20µs. Das ist nicht extrem viel Zeit, aber sollte hier eigentlich locker machbar sein.