Hallo zusammen, ich hoffe ihr könnt mir helfen. Leider bin ich schon ein paar Jahre aus dem Thema raus.... ich komme einfach nicht mehr weiter... Folgende Situation. - Ich habe eine Fräse ähnlich Bild 1. - An den Jeweiligen Achsen habe ich Servomotoren mit 9 NM montiert, die über eine Step/Dir Steuerung ähnlich Schrittmotoren angesteuert werden.. - Jetzt habe ich vor mit dem Arduino eine Steuerung zu programmieren wo ich von Hand jede Achse einzeln steuern und die geschwindigkeit über ein Porti regeln kann. - Bild 2. und Bild 3. so schaut es momentan aus. Ich habe momentan nur eine Achse eingebunden. Und das Handrad ist auch noch ohne Funktion. Problemstellung: Ein Problem ist jetzt das ich durch den Internen Zähler die Pulse generiert werden. Das hat zur Folge das die Regelung an dem Poti total exponentiell regelbar ist. um diesen Code abschnitt geht es: //////////////////////////////////////////////////////////////////////// //////////////// Motor_PotiGeschwindigkeitHilfe = sqrt(float(analogRead(Pin_Potipos)))*128+100; Motor_PotiEigelesen = int(Motor_PotiGeschwindigkeitHilfe); Serial.println(analogRead(Pin_Potipos)); // (alt) Serial.println(Motor_IstGeschwindigkeit); // Werte Berechnen // Drehzal berechnen // Aus Datenblatt f_PIN = 16MHz / ( 2 N ( 1 + Wert ) N = 8 // Kürzen ergibt f_PIN = 10MHz / ( 1 + Wert) Wert = 100 - 4196 Berechnung_Frequenz = 1000000 / ( 1 + Motor_PotiEigelesen); Berechnung_Drehzahl = (float) Berechnung_Frequenz * 60 / 1000; Berechnung_Weg = ( 2.5 * Berechnung_Frequenz / 1000); //////////////////////////////////////////////////////////////////////// //////////////// ich hoffe ihr könnt verstehen was ich meine. viele grüße und vielen Dank schon mal. Sebastian
Ja du bekommst eine Art 1/x-Funktion. Du könntest das mit einer Kennlinie bzw. Look-up Table wieder linearisieren.
Exponentiell finde ich eigentlich ideal. Einfach den Analogwert skaliert als Timerwert nehmen fühlt sich recht brauchbar an. Am langsamen Ende hat man eine recht hohe Auflösung zum Positionieren und am schnellen Ende will man eh nur maximale Geschwindigkeit.
.... besser noch mit diesem Rampen-Algorithmus kombinieren, damit der Motor keine Schritte verliert, wenn man zu schnell am Poti dreht. http://www.embedded.com/design/mcus-processors-and-socs/4006438/Generate-stepper-motor-speed-profiles-in-real-time
hi, wie klappt das denn mit der look up tabelle? grüße
Ich würd's so machen: - Sollwert ist z.B. 0..255 - zu festen Zeitpunkten wird auf einen Byte-Zähler der Sollwert aufaddiert - bei einem Überlauf wird ein Puls ausgegeben. Die mittlere Ausgabefrequenz ist dann proportional zum Sollwert, natürlich jittert das Signal etwas, das macht aber weder Schrittmotoren noch Servos was aus.
"Problemstellung: Ein Problem ist jetzt das ich durch den Internen Zähler die Pulse generiert werden. Das hat zur Folge das die Regelung an dem Poti total exponentiell regelbar ist." Das macht dein Problem leider nicht klar. Was ist denn dein Ziel. Soll die Regelung linear sein? Der Kommentar // Kürzen ergibt f_PIN = 10MHz / ( 1 + Wert) Wert = 100 - 4196 ist übrigens falsch. Kürzen ergibt 1MHz, im Code darunter hast du ja auch 1000000 stehen. Wenn du jetzt eine linear regelbare Frequenz zwischen 1KHz und 1MHz brauchst, und der Potiwert offenbar von 0..1023 läuft rechne doch einfach
1 | Berechnung_Frequenz = 1000 + analogRead(Pin_Potipos) * 977; |
2 | if (Berechnung_Frequenz > 1000000) |
3 | Berechnung_Frequenz = 1000000; |
Achso, ne in deiner Formel kommen ja Frequenzen zwischen 240 und 9900 Hz raus. Also
1 | Berechnung_Frequenz = 240 + analogRead(Pin_Potipos) * 10; |
2 | if (Berechnung_Frequenz > 9900) |
3 | Berechnung_Frequenz = 9900; |
und wenn das Poti umgedreht regeln soll, dann
1 | Berechnung_Frequenz = 240 + (1023-analogRead(Pin_Potipos)) * 10; |
2 | if (Berechnung_Frequenz > 9900) |
3 | Berechnung_Frequenz = 9900; |
Ich beschäftige mich zur Zeit auch mit der Drehzahlregelung. Dieser code -editiert von Karl heinz, vielen Dank - regelt die Drehzahl in einem gewissen Bereich schon ganz gut: Beitrag "Re: Drehzahlregelung Singer Nähmaschine II"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.


