Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung mit Arduino, Regelung der Drehzahl leider Exponentiell


von Sebastian (Gast)



Lesenswert?

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

von Christian (Gast)


Lesenswert?

Ja du bekommst eine Art 1/x-Funktion. Du könntest das mit einer 
Kennlinie bzw. Look-up Table wieder linearisieren.

von Wieso linear? (Gast)


Lesenswert?

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.

von Wieso linear? (Gast)


Lesenswert?

.... 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

von Sebastian (Gast)


Lesenswert?

hi,

wie klappt das denn mit der look up tabelle?

grüße

von Martin (Gast)


Lesenswert?

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.

von Easylife (Gast)


Lesenswert?

"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;

von Easylife (Gast)


Lesenswert?

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;

von grundschüler (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.