Hallo p@ty,
es gibt so viele Möglichkeiten einen Takt zu erzeugen. Dein Programm nutzt einen Interrupt um dort einen Pin zu toggeln. Damit lassen sich sicher keine 300kHz erzeugen weil Interruptausführung (mit Sichern von Registern) und Toggle Kommando zuviel Zeit beanspruchen. Es werden dann mehr Interrupts benötigt als überhaupt ausgeführt werden können. Die Timer im AVR können aber selbst HW-mäßig einen Pin toggeln.
Ich habe Dir dazu mal einen Testgenerator für einen Mega88 angehangen, der compiliert für einen Mega168 auch dort laufen sollte. Mit max. 2550Hz ist der Generator zwar noch weit von 300kHz entfernt, sollte aber zum Probieren gut sein. Welche Frequenz brauchst Du denn effektiv bzw Dein Motor? 300Khz scheint mir für die Praxis schon recht viel. Aber mit 16MHz Systemfrequenz und Prescaler = 1 für Timer1 kommt man hier schon recht einfach auf 40kHz und bei weiteren Modifikationen auch höher - teoretisch bis 333kHz wenn man den ADC_new Wert zB. manuell auf 2047 setzt.
Programm ist bis etwa 1,9kHz getestet. Mangels eines richtigen Schrittmotortreibers diente ein ATtiny44 mit L293D als Simulator mit einem bipolaren Schrittmotor (der bei höherer Taktfrequenz aus dem Tritt kam) aus einem Floppylaufwerk.
Das Programm nutzt den Timer1 des Mega88 im Mode 15. Das ist Fast-PWM, bei dem der Timer immer nur bis zum OCR1A Registerwert läuft. Durch ein Poti wird der OCR1A Wert verändert und damit wird die Frequenz des Taktes beeinflußt. Im PWM Modus wird der OCR1A-Wert gepuffert und erst zu einem unkritischen Zeitpunkt effektiv,; hier am "BOTTOM" bei TCNT1 = 0. Die Ausgabe des Taktes wird durch die Timereinstellung Toggeln von OC1A bei Erreichen des OCR1A-Wertes erreicht.
Mit zwei Tastern kann man DIR und ENABLE beeinflussen.
Gruß
Searcher
Frequenzangaben zum Programm berichtigt. Hoffe sind keine weiteren Bugs drin
Lesezeichen