Ansteuerung von Brushless Reglern für Version 1.0

dietmar

New member
Ist es denkbar das für die Version 1.0 noch eine Ansteuerung für einen Brushless Regler für den Mähmotor hineinkommt?

Evtl so, dass man in der Config den Motor angibt

Brusless = 0 oder eben 1
 
Soweit ich das sehe gibt es verschiedene Ansteuerungen für Brushless-Regler (Servo-PWM, Analog etc.). Über welche Ansteuerung sprechen wir hier?

Beispiel Servo-PWM:


Code:
#include <Servo.h>

Servo brushless;


void Mower::setup()
{
  ...
  brushless.attach(pinMotorMowPWM);
}

void Mower::setActuator(char type, int value){
  switch (type){
    case ACT_MOTOR_MOW: 
       if (value > 0) brushless.write( 180 );  // assumes 180 is maximum power
         else brushless.write( 0 );   // assumes 0 is OFF
       break;
  ...
}
 
?? Steht das so schon im code?

Dann wäre meine Frage ja schon beantwortet.

Ich meine Brushless pwm via Servo.h

Die meisten Brs benötigen eine untergrenze beim Einschalten. z.B 20
Ansonsten gehen die gar nicht.
Das muss iwie bei der Initialisierung berücksichtigt werden
 
Das fände ich auch super, dann muss ich es nicht jedesmal wieder reinkopieren, wenn ich eine Revision aus dem SVN ziehe. Außerdem ist mein Codeschnipsel nur in C geschrieben und zerstört das ganze Klassenkonzept :) Schön wäre auch, wenn es mit einem Drehzahlimpuls zusammen funktionieren würde ... ich regel bei mir aktuell die Drehzahl, damit er in den unteren Drehzahlen rund um die 3000 rpm nicht bei Belastung einbricht, da der Motor in dem Bereich noch nicht so super läuft (da der KV-Wert zu hoch ist, ist bei mir der Nutzbereich leider das Minimum, was ich im ESC als Signal eingeben kann, außerdem ist es kein sensored brushless motor: Starten benötigt 20% Signal, für 3000 rpm benötigt es 10% Signal und bei 8% geht der Motor aus, genauso wie der Motor bei Drehzahlen unter 2500 rpm auch aus geht). Nicht optimal, aber [Ironie an] dafür kann ich bis 10000 rpm hoch drehen und hab dann über 800 W pure Power ... [Ironie aus]. Ich werde aber damit erstmal leben, weil es ansonsten sehr gut funktioniert.

Die meisten Brushlessmotoren mit einem ESC aus dem Modellbaubereich werden mit einem Servosignal gesteuert, die Varianten aus dem Hacking-Bereich (Laufwerksmotoren) haben ja alle nicht so funktioniert, wenn ich mich recht erinner.

Gruß,
Jem
 
Hallo Alexander,

da meine Programmierkenntnisse eher gegen Null gehen möchte ich dich fragen, wer mir erklären kann oder wo ich im Forum fündig werde, wie ich meinen nun endlich fast fertigen Ardumower mit einem Brushless Motor fürs Mähwerk betreiben kann. Ich habe in meinen Modellflugbestand einen Regler für Hubschrauber den ich im Hubi Modus benutzen möchte. Soweit ich das verstehe müsste der Arduino zum Mähen einen Fernsteuerimpuls erzeugen der den Regler in Betrieb setzt. Ein Stromsensor von dem Original Mähantrieb könnte die Stromwerte dem Arduino zurück melden.
Aber wie und wo macht man das in der Software? Ich habe zwar angefangen mich mit den Grundlagen auseinander zu setzen aber ich bezweifle aus eigener Kraft das Problem zu lösen.

Vielen Dank Andreas
 
Hallo,

hier meine Änderungen für den brushless Mähmotor (Version 602):
(Acceleration, Bluetooth Ansteuerung... funktioniert alles)

Betroffen sind 3 Dateien:

-ardumower.ino
-robot.h
-mower.cpp


-ardumower.ino (bereits vorbereitet):
Zeile 44: //#include aendern in: #include


-robot.h (bereits vorbereitet):
Zeile 40: //#include aendern in: #include
nach Zeile 238 oder irgendwo im Abschnitt // --- mower motor state --- :
Zeile einfügen: Servo brushless;

-mower.cpp
(brushless ESC an 5V, Masse und pinMotorMowPWM anschliesen (original Pin 2, bei mir Pin 8 ))
Zeile 340: aendern in: brushless.attach(pinMotorMowPWM);
Zeile 341: aendern in: brushless.write(45);

Zeile 527: case ACT_MOTOR_MOW: setMC33926(pinMotorMowDir, pinMotorMowPWM, value); break;
aendern in:
case ACT_MOTOR_MOW: {
int VAL = map (value, 0, 255, 45, 145);
brushless.write(VAL);}break;


Erklärung:
Servotiming 1ms (linker Anschlag) bis 2ms (rechter Anschlag)
somit sollte 0 => 1ms und 255 => 2ms ergeben.
Bei meinem Mega ergeben die Sollwerte 0..255 ==> ca. 0,7ms .. 2,6ms (mit Oszi gemessen)
Durch verändern und messen ermittelt: 45 => 1ms und 145 => 2ms

siehe de.wikipedia.org/wiki/Servo
siehe en.wikipedia.org/wiki/File:ServoPwm.png
 
Guten Abend,

heute habe ich mich beigemacht und versucht die Dateien zu ändern. Zum Teil habe ich es hinbekommen, nur bei mower.cpp möchte ich noch einmal nachfragen.

(brushless ESC an 5V, Masse und pinMotorMowPWM anschliesen (original Pin 2, bei mir Pin 8 ))

Die Zeile verstehe ich als Beschreibung wo die Kabel des Brushless Reglers angeschlossen werden sollen. PIN 2 und PIN 8 verstehe ich nicht.

Zeile 340: aendern in: brushless.attach(pinMotorMowPWM);
Zeile 341: aendern in: brushless.write(45);

In Zeile 340 steht bei mir: // lawn sensor
Somit überlege ich wo die beiden Zeilen hin sollen?

Viel Grüße Andreas
 
Hallo,

der brushless ESC hat drei Kabel: +5V, Masse und Signal.
+5V und Masse sind hoffentlich klar.
Signal kommt auf Pin 2.
In der Mower.cpp steht: #define pinMotorMowPWM 2
(bei mir war es kabeltechnisch günstiger auf Pin 8 zu stecken, darum habe ich
#define pinMotorMowPWM 8 )

Die beiden Zeilen sollten vor // lawn sensor
in den Bereich // mower motor

Sieht bei mir so aus:

// right wheel motor
pinMode(pinMotorRightPWM, OUTPUT);
pinMode(pinMotorRightDir, OUTPUT);
pinMode(pinMotorRightSense, INPUT);
pinMode(pinMotorRightFault, INPUT);

// mower motor
pinMode(pinMotorMowDir, OUTPUT);
pinMode(pinMotorMowPWM, OUTPUT);
pinMode(pinMotorMowSense, INPUT);
pinMode(pinMotorMowRpm, INPUT);
pinMode(pinMotorMowEnable, OUTPUT);
digitalWrite(pinMotorMowEnable, HIGH);
pinMode(pinMotorMowFault, INPUT);
brushless.attach(pinMotorMowPWM);
brushless.write(45);

// lawn sensor
pinMode(pinLawnBackRecv, INPUT);
pinMode(pinLawnBackSend, OUTPUT);
pinMode(pinLawnFrontRecv, INPUT);
pinMode(pinLawnFrontSend, OUTPUT);

Falls noch Fragen sind, bitte melden.
MfG
 
Hallo,

vielen Dank für die schnelle Antwort. Wenn man erst vor kurzem bei Null mit Arduino angefangen hat ist vieles nicht nachvollziehbar was für euch selbstverständlich ist. Aber man ist ja lernfähig.

Die Änderungen habe ich nun alle drin und habe vor dem Hochladen mal auf Verifizieren gedrückt. Dann kommt die Meldung: Fehler beim Kompilieren. Soweit ich das einschätzen kann scheint die Meldung die Datei adcman.cpp zu betreffen. Kann das mit meinen Änderungen zusammenzuhängen. Ich glaube nicht, oder doch??
Im Anhang der Bildschirmausdruck von der Meldung.

Gruß Andreas
 
Es ist zum Mäusemelken, DOC und PDF weigern sich und das JPEG wird so klein gemacht das es nicht lesbar ist. Hier die abgeschriebene Fehlermeldung:

adcman.cpp: In member Funktion 'void ADCManager::startADC(int)':

adcman.cpp:181:29: error: 'MUX5' was not declared in this scope

ADCSRB = (ADCSRB & ~(1 > 3) & 0x01) >> MUX5);


adcan.cpp:195:10: error: 'DIDR2' was not declared in this scope


else DIDR2 I = (1
 
Bin noch mal meine Änderungen durchgegangen und habe auf die korrekte Schreibweise geachtet. Danach konnte ich ohne Fehlermeldung den Sketch hochladen.
 
Ich habe für die Erzeugung des PWM-Signals mit der Servo.h eine andere Funktion benutzt:

Code:
brushless.writeMicroseconds((int)pwm);


Damit kann man direkt die Länge des PWM-High-Signals angeben. Eigentlich sollte es ja so sein, dass das Servo-High-Signal im PWM zwischen 1000 und 2000 Mikrosekunden lang ist und anschließend der Low-Teil des PWM-Signals solange dauert, bis 20 Millisekunden rum sind (--> PWM-Signal mit einer Ditherfrequenz von 50Hz und einem Duty von 5-10%. 5% = 0% für den ESC und 10% = 100% für den ESC).

Nutzt man die oben genannte Funktion, kann man die Aussteuerwerte für den ESC genauer ausprobieren. Bei mir sind es jetzt folgende:
Motor Neutral 1100 us
Motor Bremse 1000 us
Motor Mähen 1330 us
Gov-Mode (Store) auf 1600 us gesetzt.

Gruß,
Jem
 
Ist es eigentlich möglich den Strom zu dem ESC zu messen? Also ich habe hier noch einen MC33926 herumliegen, der ja eigentlich als Endstufe für den Mähmotor genutzt wird. Meine Idee war jetzt, das ich den Strom über den MC33926 abgreife, der misst wieviel und das PWM-Signal dann einzeln abgreife, für den ESC

Wie habt ihr das denn so gelöst?

Grüße
Benni
 
Ich hab nen ACS aus dem Shop genommen (https://www.marotronics.de/Stromsensor-30A-ACS712-fuer-Arduino-Raspberry-PI-Analogausgang-Current-Sensor).

Gruß,
Jem
 
Einlesen:

Code:
strom = strom * 0.99 + (double)analogRead(A0) * 0.01;


Umrechnen:

Code:
i = 0.7 * i + (strom - strom_kalib) * -74.05432625 * 0.3;


Diskret integrieren für Gesamtstrom:

Code:
gesamtstrom = gesamtstrom + (i / 3600.0);


Nur so nebenbei als Ansteuerung für den Regler (nicht die servo-Funktion, die ist ungenauer und schlechter auf die Grenzen des Reglers einstellbar):

Code:
brushless.writeMicroseconds((int)pwm);


Gruß,
Jem
 
Oben