Forum: Mikrocontroller und Digitale Elektronik Höchstmögliche Schaltfrequenz an einem normalen AVR Ausgangs-Pin


von Jobst M. (jobstens-de)


Lesenswert?

Wilhelm M. schrieb:
> Ich rufe die MegaHF-Challenge aus und nominiere Jobst M. und c-hater. Da
> der TO das sicher in C/C++ wollte, ist das auch eine Bedingung.

Haha! Da sind wir wohl beide raus.
Ich werde doch nicht ein Programm was ich schon habe nochmal in C neu 
schreiben.
Ich bin mir sicher, mit meiner SW an 20MHz auf über 400kHz zu kommen. 
Dann wird die Kommunikation während dieser Zeit allerdings noch lahmer 
und die Geschwindigkeitsberechnung zieht sich dann über ~15 
Ausgangstakte hinweg.
Bringt aber nichts, denn der DRV8825 kann nur 200kHz
Und dann ist da noch der Motor ...

m.n. schrieb:
> Auch bei Timer1 muß man mit Software nachhelfen

Natürlich. Aber man hat mehr Zeit.

m.n. schrieb:
> Geschickter wäre es
> allerdings, ab einer gewissen Drehzahl von Micro- auf Vollschritt zu
> wechseln.

Ich habe festgestellt, dass die Motoren mit Mikroschritten schneller 
laufen können.
Vermutlich einfach, weil sie ruhiger laufen.

Carsten-Peter C. schrieb:
> Hast Du Dein Programm
> selbst geschrieben? So schnell kann sich mein Motor nicht drehen, dafür
> muss er einiges an Masse bewegen. Es ist ein Unterschied, ob man ein
> paar Register setzt, um den Motor drehen zu lassen oder ihn auf eine
> Position laufen lässt. Lass Dich nicht ärgern!

Programm ist in ASM selbst geschrieben.

Tatsächlich war ich auch überrascht, wie schell er drehen kann. 
Funktioniert bei mir aber auch nur mit diesem Motor. Masse wirkt bei 
hohen Drehzahlen allerdings unterstützend. Man kann dann eben einfach 
nur langsamer anfahren.

Wie Du siehst, steht der Legobalken immer gerade, wenn der Motor steht. 
Nur einmal hat der 45°. Das sind alles vorgegebene Positionen.

Ärgern? Hier? Haha! Nein!

Gruß
Jobst

: Bearbeitet durch User
von Marvin K. (m_marvin)


Lesenswert?

Ich wollte mal kurz meinen aktuellen stand mit dem ATxmegaA3 bekannt 
geben.

Ich habe jetzt einen Testaufbau auf dem Steckbrett mit 7 Kanälen (nur 7 
Timer, aber ausreichend. Eigentlich brauche ich ja nur 6).

Frequenzerzeugung UND Impuls Zählung aller 7 Kanäle funktioniert.
Die Signalqualität ist auch gut, wenig Jitter, nur eine Oberwelle, die 
wohl aber vom Netzteil kommt (auch bei "stillstand" vorhanden).
Als CPU Takt habe ich 25 MHz von einem externen Quarzoszillator.

Ich habe schon ein par Szenarien laufen lassen (unterschiedliche 
Frequenzen auf unterschiedlichen Ports, mit unterschiedlichen 
Impulsanzahlen), bisher sieht es sehr gut aus.

Demnächst implementiere ich eine UART Schnittstelle und schreibe ein 
kurzes Script dass ein par zufällig Frequenzen und Schrittzahlen erzeugt 
und zeichne das Ergebnis mit dem Oszilloskop auf, so kann ich dann alles 
nochmal genau testen.

Ich habe herausgefunden das das die Optimierungs-Option auf "Optimize 
most" zu stellen, das Ergebnis weiter verbessert, ich konnte 
kontrollierbare Takte bis 100kHz erreichen, aber da ich ja nur 50kHz 
benötige, nachdem ich die Treiber anders eingestellt habe, belasse ich 
es bei einer Obergrenze von 50kHz.

Jeder Kanal wird mittels eines 16-Bit Timers betrieben.
Die Impulse werden durch die Interrupts gezählt, allerdings durch eine 
Schleife die die entsprechenden Bits abfragt, und nicht durch ein ISR.
Bei jedem Interrupt wird ein GPIOR hochgezählt, und in regelmäßigen 
abständen wird der Inhalt vom GPIOR in eine variable kopiert, und der 
GPIOR zurückgesetzt.
Das hat nach meinen Tests das zuverlässigster Ergebnis geliefert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.