Problem bei PWM an einem Mosfet

Hallo Leute,
ich steuer einen Motor mit einem Mosfet, und damit die Gate Ladung richtig schnell ge- und entladen wird mit einer Gegentakt- TreiberStufe. Soweit so gut, durch den Treiber steht jetzt eine 1 am Mosfet an, wenn vom Arduino eine 0 kommt , also eine Invertierung: Das setzen auf Null funktioniert jetzt nicht mehr :o Weiß wer was?

 else                                          //Ansonsten: Wenn keine der Bedingungen erfüllt ist(else):
       {
        int pwmWert =0;                         //Taktlänge ist Null
        analogWrite(pumpeEin,pwmWert);          //Dann: Pumpenausgang wird mit dem PWM Takt auf "HIGH" gesetzt
        digitalWrite(kontrollLed,LOW);          // setzen des Ports "Kontroll Led" (ye)
       }

Ps.:als pwmWert 255 einsetzen hat es nicht gebracht...

Was hälst du von
analogWrite(pumpeEin, 255 - pwmWert);

Hallo,

was ist denn die Variable "pumpeEin"? Diese muss eine PWM fähige Pinnummer sein.
Ansonsten diesen Pin als Ausgang konfigurieren.
Wenn immer noch nicht, dann bitte den gesamten Code zeigen.

Auch den Schaltpan der Hardware bitte. Kann ja sein, das da was falsch beschaltet ist, das der MOSFET immer angesteuert wird und der µC garnicht Schuld ist :wink:

Ohh schöne Resonanz, cool :slight_smile:

    #include <Bounce2.h>                             //Entprellbibliothek includiert
    #include <SPI.h>                                 //I²C Bus Bibliothek includiert
    #include <Adafruit_GFX.h>                        //Adafruit Firmware für Display includiert
    #include <Adafruit_SSD1306.h>                    //Adafruit Firmware für Display includiert
    #define OLED_RESET 4                             //Deklarierung des Displays
    Adafruit_SSD1306 display(OLED_RESET);
    int messwert = 0;                                //Variable "messwert" deklariert
    int pumpeEin = 3;                                //Port 3 für "Pumpe ein" deklariert
   
    int kontrollLed = 11;                            //Kontroll Led an Port 11 deklariert
    unsigned int  mittelwert=0;                      //Variable "mittelwert"deklariert(2 byte ohne Vorzeichen)
    unsigned int ausgabe =0;                         //Variable "ausgabe"deklariert(2 byte ohne Vorzeichen)
    byte tasterManuell = 8;                          //Pin 8 als "tastermanuell" deklariert
    int zustandTaster = 0;                           // Variable "zustandTaster" deklariert, um Taster abzufragen

    
    void setup()
    {

      //Code von Adafruit_Ind
      
      Serial.begin(9600);                            //Baudrate für Uebertragung festgelegt -> Display & µC Komm.
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);     //Initialisierung mit I2C Adresse 0x3C
      display.display();                             //Initialisierung des Adafruit Displays
      display.clearDisplay();                        //löschen des Displays
      display.setTextSize(1);                        //Deklaration der Schriftgröße    
      display.setCursor(0, 0);                       //Cursor auf erste Zeile,links setzen
      display.setTextColor(WHITE);                   //Text-Farbe deklarieren
    
      int pwmfreq =4;                                //Konfigurationswert 4 festgelegt(=490.20Hz)
      TCCR2B = (TCCR2B & 0xF8)|pwmfreq;              //Timer Register2  mit prescaler für Port 3 aktiviert
      pinMode ( pumpeEin, OUTPUT );                  //Port 3 für "pumpeEin" als Ausgang initialisiert
      pinMode (kontrollLed, OUTPUT);                 //Port 11 für LED "kontrollLed" als Ausgang initialisiert
      pinMode ( tasterManuell, INPUT );              //Pin 8 für "tasterManuell" als Eingang initialisiert
      messwert = analogRead(A2);                     // 1te. Abfrage des Sensoreingangs"A2" f. Mittelwert
       }
  
   void loop()
   {
      mittelwert = analogRead (A2);                 //2te. Abfage des Sensoreingangs "A2" f. Mittelwert
      mittelwert = (mittelwert * 9 + messwert) / 10;//pro Loop wird messwert mit mittelwert im Verhältnis 1 zu 10 gemischt 
                                                    //und somit ein gleitender Mittelwert gebildet
          
         
          
      ausgabe = ((mittelwert * 100)/650);          //650 Bits = max. Feuchte, durch 100 entspricht einer % Angabe 
      zustandTaster = digitalRead (8);             //Auslesen von Pin 8 durch Variable "zustandTaster"
         
   
     
        display.setCursor(0, 0);                   //Cursor auf erste Zeile,links setzen
        display.print("Humidity:");                //Display beschreiben
        display.setCursor(72, 0);                  //Cursor setzen
        display.println(ausgabe);                  //mit Funktion "println" Ausgabewert zurückgeben
        display.setCursor(90, 0);                  //Cursor setzen
        display.print ("%");                       //Display beschreiben
        display.setCursor (0,10);                  //Cursor setzen
        display.print ("Schwellwert: 30%" );       //Display beschreiben
        display.display();                         //Arbeitsaufforderung ans Display
        display.clearDisplay();                    //löschen des Displays
        delay(200);                                //Wartezeit 200ms
                                                   //(sonst springt Display ständig zwischen den Messwerten)
      
    
    if ( ausgabe <= 30 )                         //Erste Bedingung :  Wenn Ausgabewert kleiner gleich 30 
                                                 //(experimentell ermittelt)
       { 
           int pwmWert = 35;                     //PWM Takt {ist noch variaber}
           analogWrite(pumpeEin,pwmWert);        //Dann: Pumpenausgang wird mit dem PWM Takt auf "HIGH" gesetzt
           display.setCursor(0, 0);              //Cursor auf erste Zeile,links setzen
           display.print("Humidity:");           //Display beschreiben
           display.setCursor(72, 0);             //Cursor setzen
           display.println(ausgabe);             //mit Funktion "println" Ausgabewert zurückgeben
           display.setCursor(90, 0);             //Cursor setzen
           display.print ("%");                  //Display beschreiben
           display.setCursor (0,10);             //Cursor setzen       
           display.print ("Schwellwert: 30%" );  //Display beschreiben
           display.setCursor (0,20);             //Cursor setzen
           display.print("Giessvorgang starten");//Display beschreiben
           display.display();                    //Arbeitsaufforderung ans Display       
           digitalWrite(kontrollLed,HIGH);       // setzen des Ports "Kontroll Led"(ye), als Betriebsmelder
           delay(5000);                          //Giesszeit 5s.(experimentell ermittlelt)
           analogWrite(pumpeEin,LOW);            //Pumpe abschalten, damit Sensor neuen Wert aufnehmen kann
           delay(100);
        }

  
    else if (zustandTaster == HIGH )            //Zweite Bedingung : Wenn Taster betätigt ist  
                                                //( und damit Variable "zustandTaster" HIGH wahr ist) 
        {
          int pwmWert = 35;                     //PWM Takt {ist noch variaber}
          analogWrite(pumpeEin,pwmWert);        //Dann: Pumpenausgang wird mit dem PWM Takt auf "HIGH" gesetzt
          digitalWrite(kontrollLed,HIGH);       // setzen des Ports "Kontroll Led", als Betriebsmelder
          display.setCursor(0, 0);              //Cursor auf erste Zeile,links setzen
          display.print("Humidity:");           //Display beschreiben
          display.setCursor(72, 0);             //Cursor setzen
          display.println(ausgabe);             //mit Funktion "println" Ausgabewert zurückgeben
          display.setCursor(90, 0);             //Cursor setzen
          display.print ("%");                  //Display beschreiben
          display.setCursor (0,10);             //Cursor setzen       
          display.print ("Schwellwert: 30%" );  //Display beschreiben
          display.setCursor (0,20);   
          display.print("Giessvorgang manuell");//Display beschreiben
          display.display();                    //Arbeitsaufforderung ans Display
          
       }
  else                                          //Ansonsten: Wenn keine der Bedingungen erfüllt ist(else):
       {
        int pwmWert =0;                         //Taktlänge ist Null
        analogWrite(pumpeEin,pwmWert);          //Dann: Pumpenausgang wird mit dem PWM Takt auf "HIGH" gesetzt
        digitalWrite(kontrollLed,LOW);          // setzen des Ports "Kontroll Led" (ye), als Betriebsmelder
       }
   }

Doc_Arduino:
Hallo,

was ist denn die Variable "pumpeEin"? Diese muss eine PWM fähige Pinnummer sein.
Ansonsten diesen Pin als Ausgang konfigurieren.
Wenn immer noch nicht, dann bitte den gesamten Code zeigen.

Habe den gesamten sketch gepostet

Hallo,

der Variablenname PumpeEin ist etwas irreführend. Es ist nur ein Pin für die Pumpe. Nur “Pumpe” oder “pin_Pumpe” wäre eindeutiger. Das am Rande. Die eigentliche Lösung für dein Problem hatte Spanier schon gepostet. Durch die Negierung des Treibers musste natürlich auch den Code an allen Stellen negieren. Laut meinem Durchblick wie folgt ändern. Beim ein- und ausschalten.

Bedenke bitte bei analogWrite auch analog zu denken. Mit LOW mag das zufällig funktionieren. Weil LOW mit 0 definiert ist. Wenn du aber mal HIGH schreibst und denkst damit läuft die Pumpe volle pulle, dann klappt das nicht, weil HIGH mit logisch 1 definiert ist und nicht mit 255 was für analogWrite volle pulle wäre.

Desweiteren initialisierst du die Variable pwmWert ständig neu. Mach diese global und weiße ihr nur immer den neuen Wert zu.
Der Compiler sollte eigentlich meckern. Datei > Voreinstellungen > "Compiler-Warnungen: ALLE
Wenn ich nichts übersehen habe sollte das funktionieren.

alle analogWrite Aufrufe abändern:

if ( ausgabe <= 30 ) //Erste Bedingung : Wenn Ausgabewert kleiner gleich 30
//(experimentell ermittelt)
{
int pwmWert = 35; //PWM Takt {ist noch variaber}
analogWrite(pumpeEin,255-pwmWert); //Dann: Pumpenausgang wird mit dem PWM Takt auf “HIGH” gesetzt
//negiert wegen Treibersignalinvertierung
display.setCursor(0, 0); //Cursor auf erste Zeile,links setzen
display.print(“Humidity:”); //Display beschreiben
display.setCursor(72, 0); //Cursor setzen
display.println(ausgabe); //mit Funktion “println” Ausgabewert zurückgeben
display.setCursor(90, 0); //Cursor setzen
display.print ("%"); //Display beschreiben
display.setCursor (0,10); //Cursor setzen
display.print (“Schwellwert: 30%” ); //Display beschreiben
display.setCursor (0,20); //Cursor setzen
display.print(“Giessvorgang starten”);//Display beschreiben
display.display(); //Arbeitsaufforderung ans Display
digitalWrite(kontrollLed,HIGH); // setzen des Ports “Kontroll Led”(ye), als Betriebsmelder
delay(5000); //Giesszeit 5s.(experimentell ermittlelt)
**analogWrite(pumpeEin,255); ** //Pumpe abschalten, damit Sensor neuen Wert aufnehmen kann
//negiert wegen Treibersignalinvertierung
delay(100);
}

else if (zustandTaster == HIGH ) //Zweite Bedingung : Wenn Taster betätigt ist
//( und damit Variable “zustandTaster” HIGH wahr ist)
{
int pwmWert = 35; //PWM Takt {ist noch variaber}
analogWrite(pumpeEin, 255-pwmWert); //Dann: Pumpenausgang wird mit dem PWM Takt auf “HIGH” gesetzt,
** //negiert wegen Treibersignalinvertierung**
digitalWrite(kontrollLed,HIGH); // setzen des Ports “Kontroll Led”, als Betriebsmelder
display.setCursor(0, 0); //Cursor auf erste Zeile,links setzen
display.print(“Humidity:”); //Display beschreiben
display.setCursor(72, 0); //Cursor setzen
display.println(ausgabe); //mit Funktion “println” Ausgabewert zurückgeben
display.setCursor(90, 0); //Cursor setzen
display.print ("%"); //Display beschreiben
display.setCursor (0,10); //Cursor setzen
display.print (“Schwellwert: 30%” ); //Display beschreiben
display.setCursor (0,20);
display.print(“Giessvorgang manuell”);//Display beschreiben
display.display(); //Arbeitsaufforderung ans Display

}
else //Ansonsten: Wenn keine der Bedingungen erfüllt ist(else):
{
int pwmWert = 255; //Taktlänge ist Null, negiert wegen Treibersignalinvertierung
//negiert wegen Treibersignalinvertierung
analogWrite(pumpeEin,pwmWert); //Dann: Pumpenausgang wird mit dem PWM Takt auf “HIGH” gesetzt
digitalWrite(kontrollLed,LOW); // setzen des Ports “Kontroll Led” (ye), als Betriebsmelder
}