PWM mit DC-Motor ; Messwertverfälschung Ultraschall

Hallöchen,

ich habe eine Schaltung zur PWM aufgebaut, in Kombination mit einem IRF540 Mosfet, um einen kleinen Motor aus dem Arduino Starterkit drehzahlzuregeln und dem HC-SR0 Ultraschallsensor zur Abstandsmessung. Bei einem gewissen Abstand, soll der Motor abgeschaltet werden. Die Drezahl des Motors wird über ein 10K-Potentiometer geregelt. Eine Diode in Sperrichtung habe ich parallel zum Motor auch drin.

Folgendes Problem:

Sobald ich den Motor mittels Poti laufen lassen will, misst der Ultraschallsensor durchgehend +/- 630 mm, egal wie weit ich den Poti aufdrehe, stelle ich den Poti wieder auf 0, so dass der Ausgang des Arduinos auch den Wert 0 hat, misst er wieder normal.
Ich hab das ganze mit einer Diode getestet, weil ich EMV Probleme wegen Induktionen vermutet habe. Wenn ich die LED OHNE !! Vorwiderstand dimmen will, habe ich das gleiche Phänomen, sobald ich die Diode mit Vorwiderstand betreibe nicht.

Ich weiß nicht wo mein Fehler liegen könnte. Wenn nötig würde ich auch einen Schaltplan zeichnen.

Vielleicht kann mir ja jemand helfen! :slight_smile: :slight_smile:
Auf jeden Fall schonmal vielen Dank im Vorraus fürs Anschauen und mögliche Hilfeversuche! :slight_smile:

Liebe Grüße

Aljoscha

Hier noch mein Code:

int Motor = 9 ;                                       // Ausgang Motor
int Poti  = A0 ;                                      // Analogeingang Potentiometer / Sensor
int Poti_Wert ;                                       // Variable um Wert des Potentiometers / Sensors zu speichern

int Schalter = 10 ;                                   // Start-Schalter
int Schalterzustand = 0 ;                             // Variable um Wert des Schalters zu speichern
int previous_Schalterzustand = 0 ;                    // Variable um vorherigen Wert des Schalters zu speichern
int Start = 0 ;                                       // Variable die ein Betätigen des Schalters speichert

int Trigger = 11 ;                                    // Trigger Ausgang für Ultraschallsensor
int Echo = 12  ;                                      // Echo-Eingang des Ultraschallsensors
int Zeit ;                                            // Variable, für den Wert von "pulseIn" ; Zeit in Mikrosekunden bis der Schall wieder beim Empfänger ankommt
int Abstand ;                                         // Variable für den errechneten Wert des Abstandes zum Objekt

int LED1 = 13 ;                                       // Ausgang für Signal-LED 1 (Abstand < 50 mm)
boolean Blinken = LOW ;
int LED2 = 8 ;                                        // Ausgang für Signal-LED 2 ("Anlage" in Betrieb / Start) 

unsigned long previous_millis ;
unsigned long interval = 1000 ;


void setup ()

{
  pinMode (Schalter, INPUT) ;
  pinMode (Echo, INPUT) ;
  pinMode (Trigger, OUTPUT) ;
  pinMode (LED1, OUTPUT) ;
  pinMode (LED2, OUTPUT) ;
  
  Serial.begin (9600) ;

}


void loop ()

{ 
  
  
  // Liest den Eingangszustand des Schalters aus und prüft, ob eine Änderung des Signals stattgefunden hat
  
  Schalterzustand = digitalRead (Schalter) ;
  
  if ((Schalterzustand == 1) && (previous_Schalterzustand == 0))
    {
      Start = 1 - Start ;
      delay (30) ;
    }
    
    previous_Schalterzustand = Schalterzustand ;    
   
  // Wenn eine Änderung stattgefunden hat und Start = 1 ist führe den Anweisungsblock aus
  
  if (Start == 1) 
    {
        digitalWrite (LED2, HIGH) ;  
        
        // setzt den Triggerausgang LOW, dann HIGH und wieder LOW, dadurch wird Ultraschall ausgesendet
        
        digitalWrite (Trigger, LOW) ;
        delayMicroseconds (2) ;
        digitalWrite (Trigger, HIGH) ;
        delayMicroseconds (5) ;
        digitalWrite (Trigger, LOW) ;
        
        // misst die Zeit in Mikrosekunden, bis der Schall nach dem Aussenden wieder beim Empfänger ankommt
        
        Zeit = pulseIn (Echo, HIGH) ;
        
        // Berechnet den Abstand zum Objekt in Millimeter
        
        Abstand /*mm*/ = (Zeit * 0.343) / 2 ;
        
        Serial.print (Abstand) ;
        Serial.print ( " , " ) ;
        Serial.println (Poti_Wert / 4) ;
        
        // Wenn Abstand > X mm, dann führe Anweisungsblock aus / Motor darf laufen !
        
        if (Abstand > 80)
          {  
             Poti_Wert = analogRead (Poti) ;
             analogWrite (Motor, Poti_Wert / 4) ; 
             digitalWrite (LED1, LOW) ;
          }
        
        // Wenn Abstand < X mm, dann führe Anweisungsblock aus ; Motor darf nicht laufen!
        
        else
          {
            if ((millis() - previous_millis) > interval)
              {
                previous_millis = millis() ;
                Blinken = !Blinken ;
                digitalWrite (LED1, Blinken) ; 
              }
                
            analogWrite (Motor, 0) ;
          }
    }
  
  // Wenn Variable Start = 0, kein Betrieb, Motor darf nicht laufen!
  
  else
    {
      analogWrite (Motor, 0) ;
      digitalWrite (LED2, LOW) ;
      digitalWrite (LED1, LOW) ;
    }
    
  delay (50) ;
 

}

Das klingt nach Problemen mit der Spannungsversorgung. Hast Du versucht den Motor mit einem anderen Netzteil zu versorgen?
Grüße Uwe

Und ein dicker Elko an die Versorgung plus was kleineres -so 10 Mikro - an den HC schaden auch nicht.

Aljonator:
Wenn nötig würde ich auch einen Schaltplan zeichnen.

Das wäre sicherlich hilfreich.

Also ich beziehe meine Spannung von dem 5V-Pin und speise den Arduino schon per Netzteil.
Aber eine LED, selbst OHNE! Vorwiderstand, die ganz schwach gedimmt ist, zieht mir doch die Spannung nicht in die Knie, oder? :cold_sweat:

Ich hab mir jetzt mal so ne DC-Buchse / Hohlstecker bestellt, um die Leistung wirklich komplett seperat zu speisen.

So, der Schaltplan ist als Anhang dabei, ich hoffe ich habe mich nirgends verzeichnet! :slight_smile:

Lieb Grüße
Aljoscha

Aljonator:
Also ich beziehe meine Spannung von dem 5V-Pin und speise den Arduino schon per Netzteil.

Motoren (und andere Verbraucher, die Strom brauchen und stören) sollte man nie aus den Arduino-5V versorgen!

Aljonator:
Aber eine LED, selbst OHNE! Vorwiderstand, die ganz schwach gedimmt ist, zieht mir doch die Spannung nicht in die Knie, oder?

Doch tut sie!
Gerade, wenn sie ohne Vorwiderstand betrieben wird!
Der Vorwiderstand soll ja den Strom begrenzen. Wenn du keinen hast, macht das der Ausgang des Arduino. Der kann nicht mehr als 40mA und geht dann in die Knie. Du kannst dich glücklich schätzen, dass die ATmegas so robust sind. Anderer Prozessoren wären schon kaputt. (und auch der Arduino wird es bald sein)
ganz schwach gedimmt bedeutet ja nur, dass die Pulse kurz sind. Trotzdem ist bei jedem Puls der Arduino überlastet, und wahrscheinlich bricht zumindest die interen Versorgung kurz ein.

Du darfst eine LED nie, nie, nie ohne Vorwiderstand betreiben.

Jaaaa, das leuchtet natürlich ein!
Stimmt, ist ja auch ein PWM Signal und kein analoges Signal, bei dem die Spannung ansteigt! :slight_smile:

Du darfst eine LED nie, nie, nie ohne Vorwiderstand betreiben.

Das weiß ich! :slight_smile: Aber ich war mir nicht bewusst, auf welch dünnem Eis ich mich da bewegt habe, als ich sie testweise OHNE! angeschlossen habe. Bin auf dem Gebiebt Microcontroller noch sehr neu.

Vielen vielen Dank für das tolle Feedback und die Ratschläge! :slight_smile:

Ich gehe dann mal von aus, da niemand sich dazu äußerte, dass meine Verdrahtung und der Sketch keine Fehler enthielten, abgesehen von der Spannungsversorgung des Motors?!

Ich werde das Ganze wieder testen, wenn ich die Leistung sperat nehmen kann, morgen sollten meine Dc-Buchsen da sein. :slight_smile:
Gebe dann auch Feedback, ob die Probleme dadurch beseitigt wurden! :slight_smile:

Liebe Grüße
Aljoscha

Und ich sehe keinen meiner beliebten Kondensatoren. Aber Gunthers Hinweise sind in jedem Fall erstmal wichtiger.

Ja gut, das sollte ich noch tun! Hats du Recht. :slight_smile:

Aber was meinst du genau, mit HC? Kann damit grad nichts anfangen :cold_sweat:

Na, Dein HC-SR0

Achsooo, sag das doch Mensch! :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :slight_smile:

Aber mal zu Gunther! :slight_smile:

Ich habe die LED doch gar nicht an einem Ausgang angeschlossen, sondern über den Fet direkt an die 5V und die können doch mehr leisten, als 40mA. Wird aber wohl trotzdem so sein, dass die Diode OHNE Vorwiderstand, mir da die Spannung in die Knie zieht, da muss ich dir Recht geben! :slight_smile:

LED1 hängt an GND und wird direkt mit Pin13 geschaltet. Oder soll das die onboard-LED sein?

Hm, wenn ich das richtig sehe, bekommt der Arduino Saft aus 2x 5V Quellen :astonished:
Das funktioniert so nicht und macht auch keinen Sinn!
Zum einen wird er per Steckernetzteil und DC-In versorgt.
Und zum anderen hängt er an den +5V, die den Motor speisen "rückwärts" nochmals an 5V!
Wenn die Powerversorgung 12V oder 24V wären, käme ja auch niemand auf die Idee, die noch mit Arduino Plus zu verbinden :slight_smile:
Trenne die Verbindung 5V Motor und 5V Arduino auf - die gemeinsame Masse bleibt.
US, LED und Schalter kommen an die 5V vom Arduino. Nur der Motor, FET und die Diode kommen an den 5V Power-Kreis.
Ich denke, dann tut deine Schaltung auch, was sie soll :wink:

Gruß Gerald

Klaus_ww:
LED1 hängt an GND und wird direkt mit Pin13 geschaltet. Oder soll das die onboard-LED sein?

Ist ja auch völlig richtig so! :slight_smile: Pin 13 hat einen integrierten Vorwiderstand, also brauch ich da keinen zusaätzlichen. :wink:

nix_mehr_frei:
Hm, wenn ich das richtig sehe, bekommt der Arduino Saft aus 2x 5V Quellen :astonished:

Also eigentlich hängt der Arduino nur an USB und am zusätzlichen Steckernetzteil über die verbaute DC-Buchse.
Die 5V-Kontaktbahn, die du auf dem Plan siehst, sollte die Plusleiste an meinem Steckbrett darstellen, die vom 5V-Pin des Arduinos gespeist wird. :slight_smile: Vielleicht hätte ich das besser zeichnen sollen, damit das nicht missverständlich ist. :slight_smile:

Aber wie Gunther ja schon schrieb und du jetzt auch, sollte ich die Spannungsversorgung, von "Leistung" und "Steuerung" trennen. :slight_smile:

Liebe Grüße
Aljsocha

Aljonator:

Klaus_ww:
LED1 hängt an GND und wird direkt mit Pin13 geschaltet. Oder soll das die onboard-LED sein?

Ist ja auch völlig richtig so! :slight_smile: Pin 13 hat einen integrierten Vorwiderstand, also brauch ich da keinen zusätzlichen. :wink:

Sagenhaft, dann sprechen wir sicher nicht vom UNO R3

Arduino_Uno_Rev3-schematic.pdf (80.4 KB)

Da muss ich dir Recht geben. :roll_eyes:

Hatte mir den Schaltplan noch nicht angeschaut.
Ich bin aber davon ausgegangen, da ich mir auf Youtube gute Tutorials angeschaut hatte, in denen auch der UNO verwendet wurde und es hieß, dass Pin 13 einen Vorwiderstand integriert hat, bzw. in dem Buch das bei meinemSarterkit mitgeliefert wurde, wurde bei Pin 13 auch nie ein Vorwiderstand in den Versuchsaufbauten verwendet.

Das ist natürlich schlecht, wenn man da falsche Informationen raus gibt! :~ :~ :~

Dankeschön! :slight_smile:

Da ging's sicher um die onboard-LED die an Pin 13 hängt, nicht um extern angeschlossene.
Aber macht ja nix, ist ja offenbar noch alles heil.

ja ne, da wurden ja jeweils externe LED´s direkt auf Pin 13 gesteckt und nebendran direkt auf GND! :smiley: :smiley:

Sehr gut, wenn die Vertreiber da falsche Infos aus erster Hand rausgeben! :slight_smile:

Aber gut, ist noch alles heil, da hast du recht! :slight_smile:

Soooo Update ! :smiley:

Habe meine DC-Buchsen erhalten und das ganze jetzt so aufgebaut, dass der Motor seperat gespeist wird. Abgeänderter Schaltplan als Anhang dabei! :slight_smile:

Die ganze Chause funktioniert jetzt auch in so fern, dass meine Messwerte fast nicht mehr verfälscht werden. Hatte anfangs das Problem, dass die serielle Kommunikation, während des Laufens / Regelns abbrach, habe dann eine flinkere und größere Diodde vom Typ 1N4002 genommen, seither keine Einbrüche mehr. :slight_smile:

Jedoch, bei fast maximaler Drehzahl, bekomme ich dann doch Messwertverfälschungen rein, ich vermute aber eher, dass es an dem billigen Minimotor liegt, der dem Starterkit mitgeliefert wurde, Störsignale durch unsauberes Laufen ?!
Habe das ganze aber noch nicht mit einem anderen getestet, werde ich aber tun :slight_smile:

Vielen Dank an dieser Stelle auf jeden Fall, für die Hilfestellung und Tipps! :slight_smile:

Kurze Frage noch, kann ich mit dem Arduino und dieser Steuerung auch Motoren betreiben, die eine höhere Spannung als 9V benötigen? Sprich 12V/24V/… ?
Es werden ja lediglich die Massen miteinander verbunden!

Liebe Grüße
Aljoscha

Ultraschall_PWM_DC_Motor_Arduino_mit_NT.dsn (53.2 KB)

Aljonator:
Jedoch, bei fast maximaler Drehzahl, bekomme ich dann doch Messwertverfälschungen rein, ich vermute aber eher, dass es an dem billigen Minimotor liegt, der dem Starterkit mitgeliefert wurde, Störsignale durch unsauberes Laufen ?!

Meist hilft bei kleinen DC-Motoren eine einfache Enstörung mit Kondensatoren:Enstörung von DC

Kurze Frage noch, kann ich mit dem Arduino und dieser Steuerung auch Motoren betreiben, die eine höhere Spannung als 9V benötigen? Sprich 12V/24V/... ?

Ja, das geht problemlos.