Re: PWM DC Motorsteuerung

Hi,

ich habe zwei Arduinos, die beide verschiedene Motoren ansteuern sollen.
Der eine soll einen 24V 0,5A Motor ansteuern (vorwärts/rückwärts ohne Geschwindigkeitsregelung).
Der andere soll vier in Reihe geschaltete 6V bis 6A Motoren ansteuern (vorwärts/rückwärts UND Geschwindigkeitsregelung) -> Die Motoren werden in Reihe geschaltet und somit auf 24V betrieben, was ja die Stromstärke auf max. 6A für alle Motoren herabsetzt.
Des weiteren betreibt der zweite Arduino noch zwei Motoren (komplett synchron) 12V 1A (vorwärts/rückwärts dauerhaft auf niedriger Geschwindigkeit)

Ich wollte nun fragen welche der folgenden Motorsteuerungen ich benutzen kann für die jeweiligen Motoren (soll natürlich möglichst billig sein)

  1. Motortreiber Archive - Mikrocontroller-Elektronik.deMikrocontroller-Elektronik.de
  2. http://www.watterott.com/de/Motor-Steuerung-9A-VNH3SP30
  3. http://www.roboterecke.de/index.php?option=com_content&task=view&id=9&Itemid=1
  4. http://de.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0503827
  5. http://www.watterott.com/de/Motor-Steuerung-15A-IRF7862PBF

Hier noch meine Schaltpläne (ist noch einiges mehr drinne, aber ich hoffe das stört nicht) ps: die umschalten muss ich noch schauen , wie ich die realisiere oder ob ich die noch brauche, wenn ich eine Motorsteuerung habe, die das schon kann...

Hallo bema09

für die 1x 24V 0,5 A Motore:http://www.watterott.com/de/Motor-Steuerung-25A-MC33887
für die 4x 6V,6A Motore:http://www.watterott.com/de/Motor-Steuerung-9A-VNH3SP30
für die 2x 12V, 1A http://www.watterott.com/de/Motor-Driver-1A-Dual-TB6612FNG

Was Du mit komplett synchron meinst verstehe ich nicht. Wenn beide Motore gleich schnell und in gleichen Drehwinkel drehen sollen ist das mit Gleichstrommotoren ohne großen Aufwand nicht zu schaffen.

Du brauchst bei den vorgeschlagenen Motortreibern keinen FET für die PWM sondern kannst das PWM vom Arduino direkt an den Treiberbaustein geben.

Grüße Uwe

ich finde den Gedanken 4 Motore in Reihe zuschalten recht lustig, gehen wir mal vom Ideal aus, hast Du recht die 24 V müssten sich gleichmässig auf die Motore verteilen und jeweils einen Spannungsabfall von 6 Volt erzeugen.. die Annahme das der Strom mit 6A fliesst...ok....
Was passiert bei Fertigungstoleranzen der Motoren oder bei mechanischen beeinträchtigungen während des Betriebs ?? Wird einer der Motore gestoppt, ändert sich der Spannungsabfall über den anderen Motoren die dann zB. 8 Volt statt 6 Volt abbekommen...
könnte lustig sein.... aber wenns die Funktion nicht stört....

Jo, vielen Dank für die Antworten...

das mit den Motoren in Reihe überlege ich dann wohl noch mal, probiere es aber erstmal asu.. aber egal erstmal...

ich habe mich für folgende motorsteuerung für meine vier motoren entschieden: http://www.arduino-tutorial.de/2010/06/motorsteuerung-mit-einer-mos-fet-brucke/

ich habe es genau nach dem plan aufgebaut

wenn ich nun einen code schreibe, der den motor über pwm ansteuert, dann klappt es mit dem hier:

analogWrite(pin5, 200);
  delay(10000);
  analogWrite(pin5, 0);
  delay(5000);
  analogWrite(pin6, 100);
  delay(5000);
  analogWrite(pin6, 0);
  delay(2000);

aber wenn ich das mit einer schleife lösen will (egal ob while oder for), dann ändert er einfach seine drehrichtung nicht. es ist so als wäre nur ein pwm ausgang da -.-

analogWrite(pin5, 0);
  analogWrite(pin6, 0);
  while (i<=255) {
    analogWrite(pin5, i);
    i++;
    delay(100);
  }
  delay(1000);
  analogWrite(pin5, 0);
  delay(5000);
  while (j>=-255) {
    analogWrite(pin6, j);
    delay(100);
    j--;
  }
  delay(1000);

hat jemand eine idee?

Wie kommst Du auf die Idee j nach - 255 herunterzuzählen?
analogWrite() akzeptiert Werte zwischen 0 (PWM Signal 0%) und 255 (PWM Signal 100%)
Grüße Uwe

Das ist egal. Also auf jeden Fall hatte ich das auch schon positiv und das mit negativ war mein letzter gescheiterter versuch. also das ganze geht auch nicht, wenn ich das positiv mache.

Danke für den Hinweis trotzdem :wink:

Ja, Du mußt zuerst j auf 255 setzen und dann in der while Schleife decrementieren solange j >= 0
Grüße Uwe

const byte pin5 = 5;            //Ausgang zum "rechts-drehen"
const byte pin6 = 6;            //Ausgang zum "links-drehen"
byte i = 0;                     //Zählvariable 1
byte j = 0;                     //Zählvariable 2 

void setup() {
  pinMode(pin5, OUTPUT); 
  pinMode(pin6, OUTPUT); 
}
  
void loop() {
  analogWrite(pin5, 0);         //rechts aus
  analogWrite(pin6, 0);         //links aus
  
  while (i<=255) {              //langsam "rechts-drehen" hochfahren
    analogWrite(pin5, i);
    i++;
    delay(100);
  }
  
  delay(1000);                   //"rechts-drehen" 1sec auf 255
  
  analogWrite(pin5, 0);          //rechts aus
  analogWrite(pin6, 0);          //links aus
  
  delay(5000);                   //5sec alles aus
  
  while (j<=255) {               //"links-drehen" hochfahren
    analogWrite(pin6, j);
    j++;
    delay(100);
  }
  
  delay(1000);                   //"links-drehen" 1sec auf 255
  
  delay(5000);                   //5sec alles aus
}

so, habe den code nochmal verschönert :wink:

was passieren soll steht ja in den kommentaren...

so und jetzt zu dem was passiert :smiley: :
er fährt rechts herrum langsam hoch, ist dann 1sec auf 255 und macht dann 5sec Pause, danach fährt er wieder hoch, aber diesmal wieder rechts... warum???
sonst funktioniert alles.

mfg bema09

Welchen motor Hast Du?
Bitte schick uns ein Foto der Schaltung oder zeichne sie.
Grüße Uwe


und davon wie gesagt 4 in Reihe, weil wir 24V haben und auch nicht runter gehen können, weil sonst die Ströme viel zu groß werden...

mfg bema09

ps: wenn ich die schleifen weg lasse und stattdessen einfach nur eine bestimmte geschwindigkeit einstelle dann funktioniert es perfekt!!!

Dein Beispiel in Post #3 geht aber davon aus, das die Spannung des Arduino
und des Motors halbwegs identisch sind, das ist aber bei deinen 24V nicht der Fall.
Hier wirst du Probleme haben den P-Channel Mosfet zu sperren.
Schau dazu auch mal hier die Schaltung an:

ist allerdings auch nicht der Weisheit letzter Schuss, Beiträge dazu im Forum
http://www.roboternetz.de/phpBB2/viewtopic.php?t=33067
ist aber einen Versuch wert...

hallo bema09

Nach einigen probieren weiß ich jetzt Dein Problem.
Es ist ein Sw Fehler.

Du definierst die Variablen i und j als Byte, dh sie können Werte von 0 bis 255 annehmen. Wenn die Variable 255 ist und Du sie um 1 erhöhst bekommst Du den wert 0.
In der While-Schleife ist die Bedingung, daß die Schleife solange ausgeführt wird solange die Variable i kleiner gleich 255 ist. Da nach 255 nicht 256 kommt sondern 0 (da die Veriable 1 Byte lang ist) kommst Du nie aus der erste Schleife heraus und darum dreht der Motor immer in die selbe Richtung.

Lösung:
a) definire i und j als int;
oder
b) ändere die Bedingung in der while-Schleife; "while (i<255) { "
incrementiere i vor dem analogWrite();

Ich würde die Schaltung auch nicht mit Transistoren aufbauen sondern mit einem IC.

Grüße Uwe