grindstone

Ruhrpott, 29.04.2026, 08:58
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» » Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist.
»
» Seltsamer Weise nicht. Es war nicht der Endbereich der Frequenz, sondern
» irgendwo dazwischen.
Wirklich seltsam! Du könntest versuchsweise die beiden Zeilen
delayMicroseconds(2);
jeweils durch
delayMicroseconds((int)impulslaenge);
ersetzen. Dann sind Puls und Pause gleich lang. Vielleicht hilft das ja.
» » Der Arduino ist auf jeden Fall
» » schnell genug.
» 100µs für das Auslesen des Analogports haben wir ja schon festgestellt.
» Superschnell ist das jetzt nicht.
Aber immer noch deutlich schneller als die Mechanik, im Verhältnis etwa wie Fußgänger vs. Düsenjäger.
» » Wenn du
» » während einer Bewegung eine konstante Geschwindigkeit haben möchtest,
» » lass einfach die Finger von dem Einstellknopf.
» Der rechnet ja trotzdem permanent im Hintergrund...
Ansonsten kreist er in einer Warteschleife herum. "delay" heißt ja nicht, dass der Prozessor stehenbleibt. Die Zeiten, die er für die Berechnungen braucht, werden durch entsprechend kürzere Wartezeiten ausgeglichen. Aber eigentlich sind sie (siehe oben) vernachlässigbar.
» Wenn das Poti dann auf der "falschen Position" stand, hat sich der
» Schrittmotor nicht gerührt.
Das ist dann eine Eigenart deines Schrittmotortreibers. Da kann ich nichts zu sagen. (Mal ganz nebenbei: Ich weiß immer noch nicht, was der Apparat eigentlich macht ).
» » Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz
» an.
» Klar. Andererseits definieren wir ja im Programm nicht direkt eine
» Frequenz, sondern nur Impulse und Pausenzeiten.
Das ist das Gleiche, nur mit einem andern Namen.  -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
28.04.2026, 18:47
@ grindstone
|
Arduino Programmierung "speciale" |
» Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist.
Seltsamer Weise nicht. Es war nicht der Endbereich der Frequenz, sondern irgendwo dazwischen.
» Der Arduino ist auf jeden Fall
» schnell genug.
100µs für das Auslesen des Analogports haben wir ja schon festgestellt. Superschnell ist das jetzt nicht.
» Wenn du
» während einer Bewegung eine konstante Geschwindigkeit haben möchtest,
» lass einfach die Finger von dem Einstellknopf.
Der rechnet ja trotzdem permanent im Hintergrund...
Wenn das Poti dann auf der "falschen Position" stand, hat sich der Schrittmotor nicht gerührt.
» Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz an.
Klar. Andererseits definieren wir ja im Programm nicht direkt eine Frequenz, sondern nur Impulse und Pausenzeiten.
» Wenn du willst, kannst du ja für den Automatikbetrieb eine feste Taktrate
» vorgeben.
So der Plan. |
grindstone

Ruhrpott, 28.04.2026, 12:52 (editiert von grindstone am 28.04.2026 um 13:01)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Es gibt bestimmte Frequenzbereiche, in welchen der Schrittmotor nur
» 'komisch brummt'. Der Arduino kommt da anscheined mit der Impulserzeugung
» nicht hinterher und schickt Kaudawelsch an den Treiber.
Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist. Da solltest du das Programm noch einmal richtig auf die Mechanik einmessen, wie ich es weiter oben beschrieben habe. Der Arduino ist auf jeden Fall schnell genug.
» Das Einlesen des Analogwertes und Umrechnen in die entsprechende Pausenzeit
» würde ich ja immer noch gerne in einer ausgelagerten Routine haben.
Was soll das bringen? Selbst der relativ behäbige Arduino ist um Größenordnungen schneller als jede Schrittmotor-Mechanik. Da bleibt zwischen den einzelnen Impulsen genug Zeit für Berechnungen. Wenn du während einer Bewegung eine konstante Geschwindigkeit haben möchtest, lass einfach die Finger von dem Einstellknopf.
» Weiterhin hat sich rausgestellt, dass für den Automatik-Modus auch auf
» diese Funktion verzichtet, und dort wie ursprünglich mit festen
» Pulsbreiten gearbeitet werden kann.
Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz an. Wenn du willst, kannst du ja für den Automatikbetrieb eine feste Taktrate vorgeben. Oder 2 Potis für unterschiedliche Geschwindigkeiten bei Automatik oder Hand. Es sind ja noch genug Analogeingänge frei. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
27.04.2026, 12:22
@ grindstone
|
Arduino Programmierung "speciale" |
» Ggf. würde mich eine Mitteilung über den Stand der Dinge interessieren.
»
Mich auch
Hat sich leider wieder etwas gezogen, aber am Wochenende konnte die Steuerung an der Maschine getestet werden.
Leider verlief der Test nur zum Teil erfolgreich.
Es gibt bestimmte Frequenzbereiche, in welchen der Schrittmotor nur 'komisch brummt'. Der Arduino kommt da anscheined mit der Impulserzeugung nicht hinterher und schickt Kaudawelsch an den Treiber.
Das Einlesen des Analogwertes und Umrechnen in die entsprechende Pausenzeit würde ich ja immer noch gerne in einer ausgelagerten Routine haben.
Weiterhin hat sich rausgestellt, dass für den Automatik-Modus auch auf diese Funktion verzichtet, und dort wie ursprünglich mit festen Pulsbreiten gearbeitet werden kann. |
grindstone

Ruhrpott, 23.04.2026, 13:59 (editiert von grindstone am 24.04.2026 um 15:09)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Im "Trockendock" funktioniert soweit auch alles. Der Probebetrieb an der
» Maschine dauert man wieder ein bisschen.
Ggf. würde mich eine Mitteilung über den Stand der Dinge interessieren.
Der Thread hat tatsächlich die 4000-Views-Marke geknackt. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
02.04.2026, 14:28
@ grindstone
|
Arduino Programmierung "speciale" |
» Da habe ich mich wohl etwas missverständlich ausgedrückt. Ich meinte
» damit, dass du die Werte für "impulslaengemax" und "impulslaengemin" im
» Programm-Quelltext auf die Apparatur anpassen solltest, die der Arduino
» steuern soll.
Das war schon soweit klar
Im "Trockendock" funktioniert soweit auch alles. Der Probebetrieb an der Maschine dauert man wieder ein bisschen. |
grindstone

Ruhrpott, 15.03.2026, 17:48 (editiert von grindstone am 15.03.2026 um 17:50)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Eine hardware-basierte Zeitkonstante finde ich noch nicht so gut, werde es
» aber mal probieren.
» Die Berechnung auszulagern (mit dem Nachteil, dass dann keine Einstellung
» während der Laufzeit der Schleifen möglich ist) wäre dann immer noch
» eine Option...Oder es geht doch irgendwie mit Interrupts...
Da habe ich mich wohl etwas missverständlich ausgedrückt. Ich meinte damit, dass du die Werte für "impulslaengemax" und "impulslaengemin" im Programm-Quelltext auf die Apparatur anpassen solltest, die der Arduino steuern soll.
Dazu empfehle ich folgendes Procedere: Zuerst setzt du "impulslaengemin" auf 1.0 und "impulslaengemax" auf 0. Das Poti drehst du auf höchste Geschwindigkeit. Dann lässt du den Schrittmotor laufen und erhöhst den Wert für "impulslaengemax" so weit, dass der Schrittmotor auch beim Anlaufen keine Schritte verliert.
Anschließend drehst du das Poti auf langsamste Geschwindigkeit und änderst "impulslaengemin" so, daß der Schrittmotor mit der von dir gewünschten Minimalgeschwindigkeit läuft.
Theoretisch sollte es jetzt passen, in der Praxis kann es sein, dass du den Wert für "impulslaengemax" noch einmal nachjustieren musst. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
15.03.2026, 11:27
@ grindstone
|
Arduino Programmierung "speciale" |
» https://www.elektronik-kompendium.de/forum/upload/20260306142243.ino
»
» Die geeigneten Werte für "impulslaengemax" und "impulslaengemin" hängen
» von deiner Hardware ab, die musst du empirisch ermitteln (auf gut deutsch:
» Ausprobieren). Die Werte beeinflussen sich gegenseitig, du musst also
» eventuell noch ein paarmal nachjustieren.
Danke dir (konnte leider nicht früher antworten).
Eine hardware-basierte Zeitkonstante finde ich noch nicht so gut, werde es aber mal probieren.
Die Berechnung auszulagern (mit dem Nachteil, dass dann keine Einstellung während der Laufzeit der Schleifen möglich ist) wäre dann immer noch eine Option...Oder es geht doch irgendwie mit Interrupts... |
grindstone

Ruhrpott, 06.03.2026, 14:31
@ Offroad GTI
|
Arduino Programmierung "speciale" |
Die Gleichung hat tatsächlich Ähnlichkeit mit der Geradengleichung, und dein Gedanke geht auch in die richtige Richtung. Die Berechnung solltest du allerdings im float-Format durchführen und das Ergebnis nach integer konvertieren. Ich habe das Programm mal so umgeschrieben, dass sich die Schrittfrequenz zwischen (ungefähr) 500Hz und 5kHz einstellen lässt.
https://www.elektronik-kompendium.de/forum/upload/20260306142243.ino
Die geeigneten Werte für "impulslaengemax" und "impulslaengemin" hängen von deiner Hardware ab, die musst du empirisch ermitteln (auf gut deutsch: Ausprobieren). Die Werte beeinflussen sich gegenseitig, du musst also eventuell noch ein paarmal nachjustieren. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
05.03.2026, 08:55
@ grindstone
|
Arduino Programmierung "speciale" |
» 4,3kHz Schrittfrequenz sind schon ein ganz schöner Stiefel, bei einem
» üblichen Schrittmotor mit 200 Schritten/Umdrehung entspräche das einer
» Drehzahl von 21,5 Umdrehungen pro Sekunde, entsprechend 1290 Umdrehungen
» pro Minute.
Der verwendete Schrittmotortreiber macht minimal 400 Mikrosteps, also wären es nur etwa 10 U/s.
» Und eine Geradengleichung macht nur bei zwei überlagerten Bewegungen Sinn,
Missverständnis, ich meinte "Geradengleichung" nur bezogen auf die Skalierung zwischen Min- und Max-Frequenz.
Im Programm dann etwa so:
int min= 1000; //in µs entsprechend 500Hz Pulsfrequenz oder 1,2 U/s
int max= 100; //in µs entsprechend 5000Hz Pulsfrequenz oder 12 U/s
int skalierung=max+analogread()*(min-max)/1023; //als Parameter für delaymicroseconds() |
grindstone

Ruhrpott, 04.03.2026, 14:51
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Danke für deine schnelle Reaktionszeit
»
» » Das geht noch einfacher als erwartet (und diesmal sogar getestet). 
» Kommt mir fast etwas zu einfach vor.
Manchmal passt es halt.
» Die Werte waren ja erst mal nur aus der Hüfte geschossen. Eine
» Geradengleichung, welche die Verzögerungszeit auf Basis einer vorher
» definierten Min- und Max-Frequenz berechnet, würde ich wohl auch noch
» hinbekommen.
» Das kann dann aber wohl nur effizient einmal je Durchlauf von void loop()
» erfolgen
» Wobei eine Einstellmöglichkeit "on the fly" schon schön wäre.
» Geht da was mit Interrupts?
Um dazu etwas sagen zu können, bräuchte ich mehr Informationen, z.B. was der Apparat, für den das Programm geschrieben wurde, eigentlich macht. 4,3kHz Schrittfrequenz sind schon ein ganz schöner Stiefel, bei einem üblichen Schrittmotor mit 200 Schritten/Umdrehung entspräche das einer Drehzahl von 21,5 Umdrehungen pro Sekunde, entsprechend 1290 Umdrehungen pro Minute.
Und eine Geradengleichung macht nur bei zwei überlagerten Bewegungen Sinn, also x und y. Soweit ich das von hier aus beurteilen kann, steuert der Arduino nur eine Bewegung. Um diese einer anderen Bewegung definiert nachführen zu können, wäre eine (vom Arduino auswertbare) Information über die andere Bewegung erforderlich. Da könnte man dann versuchen, statt der Geradengleichung einen passend modifizierten Bresenham-Algorithmus zu programmieren.
Davon ab habe ich mal ein wenig mit der Programmierung herumgespielt. Mit einigen kleinen Änderungen im Programm ließe sich die Schrittfrequenz -bei kontinuierlicher Abfrage des Analogeinganges- auf ca. 15kHz steigern. Bei einmaliger Abfrage und direktem Portzugriff wären maximal 290kHz machbar. Das entspräche dann einer Motordrehzahl von 87000 Umdrehungen pro Minute. Wenn du noch mehr brauchst, hilft nur ein schnelleres Board.  -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
03.03.2026, 20:39 (editiert von Offroad GTI am 03.03.2026 um 20:43)
@ grindstone
|
Arduino Programmierung "speciale" |
Danke für deine schnelle Reaktionszeit
» Das geht noch einfacher als erwartet (und diesmal sogar getestet). 
Kommt mir fast etwas zu einfach vor.
» Der Anschluss des Potis ist einfach: Rechter Anschlag auf GND, linker
» Anschlag auf 5V und den Schleifer auf den gewünschten Analogeingang.
Das ist klar.
» zwischen 436Hz
Klingt plausibel, da analogread() maximal 1023 zurückgibt, was in µs ja etwa der jetzigen Pausenzeit von 1ms entspricht.
» und 4,3kHz einstellen
https://arduinogetstarted.com/de/reference/analogread
Lesezeit für Analogeingang etwa 100µs - damit wäre dieses "Phänomen" auch geklärt.
Die Werte waren ja erst mal nur aus der Hüfte geschossen. Eine Geradengleichung, welche die Verzögerungszeit auf Basis einer vorher definierten Min- und Max-Frequenz berechnet, würde ich wohl auch noch hinbekommen.
Das kann dann aber wohl nur effizient einmal je Durchlauf von void loop() erfolgen
Wobei eine Einstellmöglichkeit "on the fly" schon schön wäre.
Geht da was mit Interrupts? |
grindstone

Ruhrpott, 03.03.2026, 16:05
@ grindstone
|
Arduino Programmierung "speciale" |
Das geht noch einfacher als erwartet (und diesmal sogar getestet). 
https://www.elektronik-kompendium.de/forum/upload/20260303154953.ino
Der Anschluss des Potis ist einfach: Rechter Anschlag auf GND, linker Anschlag auf 5V und den Schleifer auf den gewünschten Analogeingang. Der Wert des Potis ist unkritisch, er kann irgendwo zwischen 1k und 100k liegen.
Bei meinem Versuchsaufbau (mit einem 2,2k - Poti) lässt sich die Frequenz zwischen 436Hz und 4,3kHz einstellen, also ziemlich genau der von dir angepeilte Frequenzbereich. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
grindstone

Ruhrpott, 03.03.2026, 00:33
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» » Na ja, dann besteht ja noch Hoffnung...
» Zurecht, dadd Progrämm'sche funktioniert ausgezeichnet
Das freut mich.
»
» Jetzt gehen natürlich die Sonderwünsche nach einer Drehzahlsteuerung los
»
»
» Mit der Taktrate von 500Hz ist der Motor zu langsam, bzw. als
» Minimalfrequenz noch akzeptabel. Ein Stellbereich von 500Hz bis 5kHz über
» ein Potentiometer wäre schön.
» Das sollte ja generell mit delaymircoseconds("skalierter Potiwert" anstatt
» delay("Festwert" in den 'Takt-Schleifen' machbar sein...Ooooder? Auf
» absolute Präzision kommt es ja wieder nicht an.
Kein Problem. Hast du noch einen Analogkanal frei? -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
02.03.2026, 15:07
@ grindstone
|
Arduino Programmierung "speciale" |
» Na ja, dann besteht ja noch Hoffnung...
Zurecht, dadd Progrämm'sche funktioniert ausgezeichnet
Jetzt gehen natürlich die Sonderwünsche nach einer Drehzahlsteuerung los
Mit der Taktrate von 500Hz ist der Motor zu langsam, bzw. als Minimalfrequenz noch akzeptabel. Ein Stellbereich von 500Hz bis 5kHz über ein Potentiometer wäre schön.
Das sollte ja generell mit delaymircoseconds("skalierter Potiwert" anstatt delay("Festwert" in den 'Takt-Schleifen' machbar sein...Ooooder? Auf absolute Präzision kommt es ja wieder nicht an. |