INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Brushless-motor Steuerung
25.08.2017, 20:50
Beitrag #1
Smile Brushless-motor Steuerung
Hallo allerseits,
Ich bin neu hier, und befasse mich erst seit einigen wochen mit der ArduinoIDE.
So ein Forum ist für mich neu, ich bin noch am Ausprobieren, jedoch denke ich, ich werde ich mich hier schnell zurechtfinden.
Ich habe eine Frage bzw. ich würde jemanden darum bitten, einen kurzen Blick in meinen Code zu werfen und mich auf Fehler bezüglich der Funktion hinzuweisen.

(Kurz) zu meinem Ziel:
Ich möchte einen Brushlessmotor und den dazugehörigen Regler mit einem Taster über einen Arduino ansteuern.
Taster --> Arduino (ATtiny85) --> Regler --> Brushlessmotor
das funktioniert auch soweit. (Für mich ein grosser Erfolg!)
Allerdings möchte ich den Motor langsam beshleunigen lassen (mit einer for-schleife welche langsam die Geschw. erhöht). Bei Loslassen und erneutem Betätigen des Tasters möchte ich aber nicht, dass die for-Schleife wieder erneut von null beginnt den Motor zu beschleunigen, sondern, je nachdem wieviel Zeit vorangeschritten ist, den Motor und seine Masse an der richtigen stelle "auffängt", und von dort beginnt den Motor zu beschleunigen.
Ähnlich wie bei einem Auto das nur durch einen Knopf gesteuert werden soll.
es soll nicht nach einmaligem Loslassen des Knopfes wieder von null beschleunigen, sondern von der geschw., in der es sich befindet. Eigenartiges Beispiel, jedoch bringt dieses alles recht gut auf den punkt.

Den Code habe ich als Attachement hinzugefügt. Macht man das so oder kopiere ich den besser in die nachricht ?

Grüsse Meyer.f


Angehängte Datei(en)
.ino  FINALES_programm.ino (Größe: 2,11 KB / Downloads: 152)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.08.2017, 21:09
Beitrag #2
RE: Brushless-motor Steuerung
Stelle bitte Deinen Sketch hier in Codetags ein. Wie das geht, steht hier.
Anhänge liest kaum jemand.

Der Attiny ist nicht unbedingt ein Anfängerprozessor. Wenn es aber grundlegend funktioniert, ist es ok.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.08.2017, 21:26
Beitrag #3
RE: Brushless-motor Steuerung
Hallo,

nach loslassen Rampenwert speichern. Rampenwert auf Null setzen. Rampe + Speicher ist Startposition für neue Rampe.

Gruß
Rainer

den Code habe ich mir nicht angesehen, aber die Beschreibung des Problems. Die Lösung habe ich in der Praxis oft angewendet.
Diese Nachricht in einer Antwort zitieren
26.08.2017, 10:09 (Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2017 10:18 von MicroBahner.)
Beitrag #4
RE: Brushless-motor Steuerung
Hallo Meyer.f,
nach deinem Code vermute ich, dass dein Motor mit Servo-impulsen gesteuert wird. <1ms stop, >2ms maximale Drehzahl?

So ganz kann ich deinen Code noch nicht mit deiner Beschreibung zusammenbringen.
Ich habe den Eindruck, dass Du das Prinzip des loop() bei der Arduino-Programmierung noch nicht so ganz verinnerlicht hast. Du solltest deinen Code mal in Gedanken durchgehen:
Du hast 5 Programmblöcke, die nacheinander immer wieder ausgeführt (oder übersprungen) werden:
for-Schleife <- mit Taster drücken fängst Du hier immer wieder bei 0 an.
while-Schleife <- blockiert den loop, wenn Taster bei max. Drehzahl gedrückt bleibt.
if ( Taster nicht gedrückt ) <- stoppt den Motor ( ohne x zu verändern! )
if ( x>50 ) <-- Der Sinn diese Blockes erschliesst sich mir überhaut nicht
if ( Taster nicht gedrückt ) <- stoppt den Motor ( ohne x zu verändern! )
So wie ich das sehe, wird der Motor immer direkt gestoppt, wenn der Taster nicht gedrückt wird - und das auch noch 2mal im loop. Ist das gewollt?

Du solltest die for-Schleifen rausschmeissen, und den loop() als die wesentliche Schleife nutzen. Ein kleiner 'endlicher Automat' könnte evtl. deine Aufgabe lösen. Zustände z.B. Beschleunigen-Bremsen-Tempo Halten-Stop

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2017, 18:56 (Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2017 20:03 von Meyer.F.)
Beitrag #5
RE: Brushless-motor Steuerung
(25.08.2017 21:09)Tommy56 schrieb:  Stelle bitte Deinen Sketch hier in Codetags ein. Wie das geht, steht hier.
Anhänge liest kaum jemand.

Der Attiny ist nicht unbedingt ein Anfängerprozessor. Wenn es aber grundlegend funktioniert, ist es ok.

Gruß Tommy

erstmal dankeschön für all die netten Antworten. Hab ich nicht erwartet dass das so schnell geht.

Den Attiny zum Laufen zu bringen, hat einige Zeit benötigt. Vorallem die Servobibliothek darauf zu laden...
War vlt nicht der motivierendste Einstieg aber jetzt lässt er sich programmieren wie ein UNO. (Speicherprobleme habe ich bei meinen Plänen noch lange nicht Wink

hier nochmal der code:
Code:
int x; //repräsentiert den geschwindigkeitszustand des motors von 0-180

#include <Servo8Bit2.h> //attiny85 servo/regler bibliothek
Servo8Bit2 regler;

void setup() {
regler.attach(1, 1000, 2100);
pinMode(3, INPUT);
regler.write(0); //initialisierung des reglers. Dieser hat seinen nullpunkt bei 1ms periodendauer ;)
delay(2000);
}

void loop() {
  for(x=0; x<180 && digitalRead(3) == HIGH; x++){ //lässt den motor langsam beschleunigen
    regler.write(x);
    delay(80);
   }
  while(digitalRead(3) == HIGH && x>=180){ //sobald auf 100% beschl. wurde, wird dieser zustand beibehalten, solange der taster gedrückt ist
    regler.write(180);
   }
  if(digitalRead(3) == LOW){ //wenn der tster nicht mehr gedrückt ist, wird der motor zum stillstand gebracht
    regler.writeMicroseconds(900);
    delay(20);
  }
if(x>50){ //wenn die beschleunigung soweit fortgeschritten ist, beginnt der folgende abschnitt
  for(int t=0; t>=0 && t<=x*44; t+100){ //je nachdem wie weit beschleunigt wurde, läuft der timer früher oder später ab. bei ablauf des timers wird wieder von null beschleunigt. Weil der motor ca. 8 sekunden von vollgas bis zum stillstand benötigt wird der geschw.zustand mit 44 multipliziert. (8000/180= ca 44)
    delay(100);
     map(t, 0, 7900, 0, 180); //der timerwert wird auf einen für den regler verständlicheb wert gemappt.
      for(x=x-t; digitalRead(3) == HIGH && x<180; x++){ //nun wird je nach zeitfortschritt an der richtigen stelle begonnen zu beschleunigen, wenn der taster gedrückt ist
       regler.write(x);
        if(t>0){ //der timer wird reseted, sofern dies nicht schon einmal getan wurde (diese schleife läuft ja öfter als einmal durch)
        t=t-t;
        }
       delay(80); //um die beschleunigungsgeschw. anzupassen
    }
    while(digitalRead(3) == HIGH && x>=179){ //wenn voll beschleunigt wurde wird dieser zustand beibehalten sofern der taster gedrückt ist
    regler.write(180);
   }
  }
}
   if(digitalRead(3) == LOW){ //stoppen des motors. entschuldigt bitte die leichte unübersichtligkeit
    regler.writeMicroseconds(900);
    delay(20);
  }  

}

(25.08.2017 21:26)Binary1 schrieb:  Hallo,

nach loslassen Rampenwert speichern. Rampenwert auf Null setzen. Rampe + Speicher ist Startposition für neue Rampe.

Gruß
Rainer

den Code habe ich mir nicht angesehen, aber die Beschreibung des Problems. Die Lösung habe ich in der Praxis oft angewendet.

Danke für die schnelle Antwort Wink

Ich bin noch ein ziemlicher Einsteiger. Einfache bedingungen mit den logischen Gattern (OR, AND etc.) verknüpfen stellt kein problem dar, jedoch finde ich im Internet nicht viel zur Umsetzung einer solchen Funktion. Ein kurzes (!) Beispiel würde mir sehr helfen.

Gruss

(26.08.2017 10:09)MicroBahner schrieb:  Hallo Meyer.f,
nach deinem Code vermute ich, dass dein Motor mit Servo-impulsen gesteuert wird. <1ms stop, >2ms maximale Drehzahl?

So ganz kann ich deinen Code noch nicht mit deiner Beschreibung zusammenbringen.
Ich habe den Eindruck, dass Du das Prinzip des loop() bei der Arduino-Programmierung noch nicht so ganz verinnerlicht hast. Du solltest deinen Code mal in Gedanken durchgehen:
Du hast 5 Programmblöcke, die nacheinander immer wieder ausgeführt (oder übersprungen) werden:
for-Schleife <- mit Taster drücken fängst Du hier immer wieder bei 0 an.
while-Schleife <- blockiert den loop, wenn Taster bei max. Drehzahl gedrückt bleibt.
if ( Taster nicht gedrückt ) <- stoppt den Motor ( ohne x zu verändern! )
if ( x>50 ) <-- Der Sinn diese Blockes erschliesst sich mir überhaut nicht
if ( Taster nicht gedrückt ) <- stoppt den Motor ( ohne x zu verändern! )
So wie ich das sehe, wird der Motor immer direkt gestoppt, wenn der Taster nicht gedrückt wird - und das auch noch 2mal im loop. Ist das gewollt?

Du solltest die for-Schleifen rausschmeissen, und den loop() als die wesentliche Schleife nutzen. Ein kleiner 'endlicher Automat' könnte evtl. deine Aufgabe lösen. Zustände z.B. Beschleunigen-Bremsen-Tempo Halten-Stop


Dankeschön für die Antwort.

Zitat:nach deinem Code vermute ich, dass dein Motor mit Servo-impulsen gesteuert wird. <1ms stop, >2ms maximale Drehzahl?
Das mit dem Servosignal ist richtig. Jedoch funktioniert mein Regler etwas anders. (warum auch immer. Vlt. initialisiere ich ihn so, aber das ist nicht schlimm. Im Gegenteil. So kann ich den Regler feiner anteuern.)
Mein Regler hat seinen Nullpunkt bei 1ms und seinen Hochpunkt bei 2ms.

Zitat:if ( Taster nicht gedrückt ) <- stoppt den Motor ( ohne x zu verändern! )
x muss nicht verändert werden da x bei jedem Neubeginn der for-Schleife wieder auf den entsprechenden Wert gesetzt wird.

Zitat:if ( x>50 ) <-- Der Sinn diese Blockes erschliesst sich mir überhaut nicht
Diese Bedingung sorgt dafür, dass erst wenn eine bestimmte Gescvhwindigkeit erreicht wurde, das "abschwellen" des motors begonnen wird.

Zitat:So wie ich das sehe, wird der Motor immer direkt gestoppt, wenn der Taster nicht gedrückt wird
Der Motor hat eine Masse an sich befestigt, läuft also von alleine langsam aus.

Zitat: - und das auch noch 2mal im loop. Ist das gewollt?
Ja. Muss ich machen, denn wenn durch die Bedingung [if ( x>50 )] garnicht erst in den Teil gesprungen wird, dann würde der Motor solange mit der Geschwindigkeit weiterlaufen, wie der Wert x kleiner 50 ist obwohl der knopf losgelassen wird.

Zitat:Du solltest die for-Schleifen rausschmeissen, und den loop() als die wesentliche Schleife nutzen.
Darüber habe ich noch garnicht nachgedacht. Confused
Ist aber eine super Sache dass ich das jetzt weiss. Ich habe nochmal einen Code geschrieben der diesen Hinweis berücksichtigt. Ich glaube der ist 10mal kürzer und sogar besser.

Code:
int geschw;
geschw=constrain(geschw, 0, 180);

#include <Servo8Bit2.h>
Servo8Bit2 regler;

void setup() {
pinMode(2, INPUT);
regler.attach(1);
}

void loop() {
if (digitalRead(2) == HIGH){
  geschw+1;
  delay(80);
}

if (digitalRead(2) == LOW){
  geschw-1;
  delay(50);
}

regler.write(geschw);
}

Da kommt nur noch eine fehlermeldung:
geschw does not name a type
Aber sonst sollte des ganz gut funktionieren.
Den alten Code könnt ihr glaube ich vergessen... der war nicht so fein


Gruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2017, 20:43
Beitrag #6
RE: Brushless-motor Steuerung
Hallo,

schaun wir mal ob es mir gelungen ist die Sache etwas verständlicher zu gestalten...

Gruß
Rainer


Angehängte Datei(en) Thumbnail(s)
   
Diese Nachricht in einer Antwort zitieren
26.08.2017, 21:16 (Dieser Beitrag wurde zuletzt bearbeitet: 26.08.2017 21:45 von MicroBahner.)
Beitrag #7
RE: Brushless-motor Steuerung
(26.08.2017 18:56)Meyer.F schrieb:  Den alten Code könnt ihr glaube ich vergessen... der war nicht so fein
Das ist sicher richtig. Ich glaube auch nicht, dass Du das so gedacht hast, wie der Code abläuft.
Wenn Du den Taster gedrückt hältst, um zu Beschleunigen, kommt er hier
Code:
if (x > 50) { //wenn die beschleunigung soweit fortgeschritten ist, beginnt der folgende abschnitt
gar nicht hin, da er in der ersten for-Schleife bis zum Ende durchläuft, und dann in der folgenden while-Schleife festhängt. Nur wenn Du den Taster loslässt, kommt er hierher und dann kann die if-Bedingung wahr werden. Dann werden aber die for-Schleifen in deinem if-Block auch direkt abgebrochen und da passiert nichts mehr, da der Taster ja nicht mehr gedrückt ist.
Was Du dort mit den for-Schleifen machst ist auch ziemlich chaotisch, da Du heftigst deine Schleifenvariablen manipulierst.
Insofern, wie Du selbst sagst -> einfach vergessen.

Dein neuer Code passt jetzt aber vom Ablauf her gar nicht mehr zu dem, was Du vorher an Funktionalität beschreibst. Der ist jetzt seeehr kurz und enthält noch wesentliche Fehler:
Code:
geschw=constrain(geschw, 0, 180);
So eine Zuweisung kannst Du nicht ausserhalb von Funktionen schreiben. Wann sollte die auch ausgeführt werden?

Damit
Code:
geschw+1;
incrementierst Du deine Variable nicht. Entweder Du schreibst
Code:
geschw+=1;
oder
Code:
geschw++;
Ausserdem must Du die Werte noch begrenzen, sonst läuft das jeweils endlos weiter. Dein loop hört ja nicht auf zu 'kreisen'. Dazu könntest Du den constrain-Befehl verwenden, der muss dann aber im loop aufgerufen werden.

Vielleicht solltest Du erstmal genau überlegen und hier beschreiben, was das Programm wirklich machen soll? Dann kann man auch besser helfen.
Damit:
Bei Loslassen und erneutem Betätigen des Tasters möchte ich aber nicht, dass die for-Schleife wieder erneut von null beginnt den Motor zu beschleunigen, sondern, je nachdem wieviel Zeit vorangeschritten ist, den Motor und seine Masse an der richtigen stelle "auffängt", und von dort beginnt den Motor zu beschleunigen.
Kann ich noch nicht so wirklich was anfangen, und es passt auch zu keinem deiner beiden Sketch-Ansätze. Vor allem: was meinst Du mit 'auffängt' ??

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.08.2017, 13:32
Beitrag #8
RE: Brushless-motor Steuerung
(26.08.2017 21:16)MicroBahner schrieb:  
(26.08.2017 18:56)Meyer.F schrieb:  Den alten Code könnt ihr glaube ich vergessen... der war nicht so fein
Das ist sicher richtig. Ich glaube auch nicht, dass Du das so gedacht hast, wie der Code abläuft.
Wenn Du den Taster gedrückt hältst, um zu Beschleunigen, kommt er hier
Code:
if (x > 50) { //wenn die beschleunigung soweit fortgeschritten ist, beginnt der folgende abschnitt
gar nicht hin, da er in der ersten for-Schleife bis zum Ende durchläuft, und dann in der folgenden while-Schleife festhängt. Nur wenn Du den Taster loslässt, kommt er hierher und dann kann die if-Bedingung wahr werden. Dann werden aber die for-Schleifen in deinem if-Block auch direkt abgebrochen und da passiert nichts mehr, da der Taster ja nicht mehr gedrückt ist.
Was Du dort mit den for-Schleifen machst ist auch ziemlich chaotisch, da Du heftigst deine Schleifenvariablen manipulierst.
Insofern, wie Du selbst sagst -> einfach vergessen.

Dein neuer Code passt jetzt aber vom Ablauf her gar nicht mehr zu dem, was Du vorher an Funktionalität beschreibst. Der ist jetzt seeehr kurz und enthält noch wesentliche Fehler:
Code:
geschw=constrain(geschw, 0, 180);
So eine Zuweisung kannst Du nicht ausserhalb von Funktionen schreiben. Wann sollte die auch ausgeführt werden?

Damit
Code:
geschw+1;
incrementierst Du deine Variable nicht. Entweder Du schreibst
Code:
geschw+=1;
oder
Code:
geschw++;
Ausserdem must Du die Werte noch begrenzen, sonst läuft das jeweils endlos weiter. Dein loop hört ja nicht auf zu 'kreisen'. Dazu könntest Du den constrain-Befehl verwenden, der muss dann aber im loop aufgerufen werden.

Vielleicht solltest Du erstmal genau überlegen und hier beschreiben, was das Programm wirklich machen soll? Dann kann man auch besser helfen.
Damit:
Bei Loslassen und erneutem Betätigen des Tasters möchte ich aber nicht, dass die for-Schleife wieder erneut von null beginnt den Motor zu beschleunigen, sondern, je nachdem wieviel Zeit vorangeschritten ist, den Motor und seine Masse an der richtigen stelle "auffängt", und von dort beginnt den Motor zu beschleunigen.
Kann ich noch nicht so wirklich was anfangen, und es passt auch zu keinem deiner beiden Sketch-Ansätze. Vor allem: was meinst Du mit 'auffängt' ??

Hallo und danke für die Antwort,
Zitat:Ausserdem must Du die Werte noch begrenzen, sonst läuft das jeweils endlos weiter. Dein loop hört ja nicht auf zu 'kreisen'. Dazu könntest Du den constrain-Befehl verwenden, der muss dann aber im loop aufgerufen werden.
Das wollte ich mit dem constrain Befehl machen. Das Problem war eben, dass ich ihn an der falschen Stelle hatte.Sleepy Optional kann ich auch zwei Bedingungen in die if-funktion einbauen.
Code:
if (digitalRead(2) == HIGH && geschw<180){
  geschw++;
}

if (digitalRead(2) == LOW && geschw>0){
  geschw-=1;
}

Zitat:Vielleicht solltest Du erstmal genau überlegen und hier beschreiben, was das Programm wirklich machen soll? Dann kann man auch besser helfen.
Nach dem Beitrag von Rainer hab ich meinen Plan etwas geändert und leider vergessen hier zu beschreiben. Sad
Zitat:nach loslassen Rampenwert speichern. Rampenwert auf Null setzen. Rampe + Speicher ist Startposition für neue Rampe.
Nach etwas Googlen, ist mir mein Ziel klarer geworden. Ein Sanftanlauf sollte die Lösung sein.
Ich möchte also einen Sanftanlauf für meinen Motor.
Dafür war mein Code, vom Aufbau her, garnicht schlecht. Die Syntax war nicht soo gut, aber das habe ich verbessert.Smile
Code:
Servo8Bit2 regler;

void setup() {
pinMode(2, INPUT);
regler.attach(1);
}

void loop() {
geschw=constrain(geschw, 0, 180);
if (digitalRead(2) == HIGH){
  geschw++;
  delay(80);
}

if (digitalRead(2) == LOW){
  geschw-=1;
  delay(50);
}

regler.write(geschw);
}

Gruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Lightbulb Steuerung einer Modellbahn mit Arduino und PC via ethernet nilsh 14 12.752 05.10.2018 16:41
Letzter Beitrag: Joachim K.
  Programm zur LED-Steuerung Martin 2 1.310 08.02.2018 13:28
Letzter Beitrag: Martin
  Steuerung Velleman Roboterarm BonsEiki 3 3.565 16.09.2017 12:49
Letzter Beitrag: tronix68
  Steuerung Servomotor mit zwei Sensoren und Tabelle Günther S. 0 1.570 14.04.2017 19:18
Letzter Beitrag: Günther S.
  motor shield hankewitz 2 2.118 24.11.2016 08:11
Letzter Beitrag: Binatone
  360° Kamera Steuerung mit Gopro ardu1n1x 7 4.003 16.11.2016 10:11
Letzter Beitrag: Wolfgang50
  DIY Arduino Timelapse Slider Steuerung Uwe1475 6 3.901 12.11.2016 10:41
Letzter Beitrag: Uwe1475
  Serielle Eingabe zur Steuerung einer RGB-LED Tommy56 5 3.140 22.07.2016 18:32
Letzter Beitrag: Tommy56
  Motor-Parameter-TFT im Auto ChristianK 10 4.158 22.12.2015 11:44
Letzter Beitrag: aef
  Ferngesteuerter Motor Kreativlos 3 2.765 27.11.2015 22:22
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste