Go Down

Topic: Mosfet-Schaltung 12V von 0V bis 10V regeln (Read 636 times) previous topic - next topic

lucasr98

Hallo zusammen,

Ich möchte mit dem Arduino eine 12V Spannung aus einer Batterie (Varta V23GA) mittels Mosfet von 0 bis 10Volt regeln um ein Proportionalventil anzusteuern. Über tinkercad habe ich auch schon zwei Schaltungen aufgebaut und den Code dazu geschrieben, dies funktioniert in der Theorie auch ohne Probleme.

Nun habe ich die Schaltung aufgebaut und musste feststellen dass es nicht so funktioniert wie ich mir das erhofft hatte.

Ich benutze:
- Arduino Nano
- Mosfet IRL3803
- 12V Batterie (Varta V23GA)
- 470Ohm Potentiometer
- 10kOhm und 220Ohm (Versuch2)

Anbei der Aufbau der beiden Versuche...

In beiden Versuchen steigt die Spannung, welche zwischen 60mV und 300mV schwankt, sobald ich ein bisschen am Potentiometer drehe direkt auf die vollen 12V an.

Hier der Code zum ersten Versuch:
Code: [Select]

const int MosfetPin = 9;        // Mosfet an Pin 9 angeschlossen
const int PotiPin = A0 ;     // Potentiometer am analogen Eingang Pin 0 angeschlossen

// Variablen

int MosfetVar = 0;            // Variable für den Mosfet
int PotiVar = 0 ;            // Variable zum speichern des Potentiometereingangs


void setup() {

  TCCR1B = TCCR1B & 0b11111000 | 0x01;    // Setzt Timer1 (Pin 9 und 10) auf 31300Hz
  Serial.begin(9600);
  pinMode(MosfetPin, OUTPUT) ;      //Setzt den Mosfet Pin als Ausgang
  pinMode(PotiPin, INPUT) ;      //Setzt den LEDPin als Ausgang
}


void loop() {

  PotiVar = analogRead(PotiPin) ;               // Liest das Potentiometer aus
  MosfetVar = map(PotiVar, 0, 1023, 0, 255);   // Verteilt den PWM Wert über den Messbereich des Potis
  Serial.println(MosfetVar);          // Gibt die Variable im Seriellen Monitor aus
  analogWrite(MosfetPin, MosfetVar);     // Gibt die Variable mit PWM aus
}



Und hier für den zweiten (hier steuere ich noch einen Servomotor an, dieser funktioniert ohne Probleme):
Code: [Select]
int potpin1 = 0;                              // Festlegen des Potentiometer Pins 1
int potpin2 = 1;                              // Festlegen des Potentiometer Pins 2
int servo = 10;                               // Festelegen des Servo Pins
int mosfetPin = 9;                            // Festelegen des MOSFET Pins
int val1;                                     // Variable für MOSFET Ansteuerung
int servoval;                                 // Variable für Servo Ansteuerung
int pwm;                                      // Variable für Pulsweiten-Modulation
int pos;                                      // Variable für Drehwinkel


void servoMove(int servo, int pos) {          /* Funktion um den Servo zu bewegen. Hier wird die Position berechnet und der Wert der neuen Position an den Servo übergeben*/
  pwm = (pos * 11) + 500;                     // Winkel in Mikrosekunden umrechnen
  digitalWrite(servo, HIGH);                  // Servo Pin auf HIGH zum aktivieren des Servos
  delayMicroseconds(pwm);                     // kurze Zeit warten
  digitalWrite(servo, LOW);                   // Servo Pin auf LOW zum deaktivieren des Servos
  delay(20);                                  // 20ms warten
}

void setup() {
  Serial.begin(9600);                         // Serielle Schnnittstelle  initialisieren
  pinMode(mosfetPin, OUTPUT);                 // Initialisieren des MOSFET Pins als Ausgang
  pinMode(servo, OUTPUT);                     // Initialisieren des Servo Pins als Ausgang
}

void loop() {                                 // Hauptprogramm
  val1 = analogRead(potpin1);                 // Auslesen des ersten Potentiometers
  val1 = map(val1, 0, 1023, 0, 100);          /* Ändern der ermittelten Werte (0 bis 1023) auf die gewünschte Größe 0 bis 100 (normalerweise 0 bis 255, jedoch benötigen wir nicht mehr PWM bei vollem Potentiometer-Wert)*/
  analogWrite(mosfetPin, val1);               // Ausgabe der PWM an das MOSFET
  delay(15);                                  // 15ms warten
  servoval = analogRead(potpin2);             // Auslesen des zweiten Potentiometers
  servoval = map(servoval, 0, 1023, 83, 97);  /* Ändern der ermittelten Werte (0 bis 1023) auf die gewünschte Größe 83 bis 97 (normalerweise 0 bis 180, jedoch nicht notwendig da maximaler Einschlagwinkel pro Richtung 7° */
  servoMove(servo, servoval);                 // Verfahren des Servomotors auf gewünschte Position
  Serial.println(val1);                       // Variable seriell ausgeben (Kontrolle der Werte auf seriellem Monitor auf PC)
  delay(15);                                  // 15ms warten
}


Da ich in Elektrotechnik nicht allzu versiert bin, weiß ich nicht was ich nun machen soll bzw woran das liegen kann.

Vielen Dank schonmal im voraus :)

HotSystems

#1
Oct 12, 2018, 09:59 am Last Edit: Oct 12, 2018, 10:02 am by HotSystems
.....
Da ich in Elektrotechnik nicht allzu versiert bin, weiß ich nicht was ich nun machen soll bzw woran das liegen kann.
Mit PWM alleine funktioniert das auch nicht.
Einfach erklärt, liegt die Ausgangsspannung "immer" auf maximaler Spannung und wird nur ein- bzw. ausgeschaltet. Dabei ist die das Verhältnis Ausschaltzeit zu Einschaltzeit maßgeblich.
Bitte hier nachlesen.

Du kannst eine nutzbare Gleichspannung daraus machen, wenn du einen Tiefpass (Widerstand und Kondensator) dafür einbaust.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

Quote
Mit PWM alleine funktioniert das auch nicht.
Je nach Proportionalventil, ist PWM genau das richtige.

Allerdings ist das mal wieder geheim, so dass das lustige Glaskugelpolieren beginnen kann.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

HotSystems

#3
Oct 12, 2018, 10:27 am Last Edit: Oct 12, 2018, 10:31 am by HotSystems
Je nach Proportionalventil, ist PWM genau das richtige.

Allerdings ist das mal wieder geheim, so dass das lustige Glaskugelpolieren beginnen kann.
Ja, ok.
Das stimmt auch.
Da war ich bedingt durch fehlende Informationen zum Ventil betrifft zu voreilig.

Jedoch bei der gewünschten Gleichspannung (0 - 10V) funktioniert das nur mit PWM nicht.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

Allerdings ist das mal wieder geheim, so dass das lustige Glaskugelpolieren beginnen kann.
Ich habe gehört, daß die Kristallkugeln vom zuviel polieren hässliche hellblaue Flecken bekommen können. Vor allem wenn sie nicht 18 Stunden zusammenhängend im dunkeln gelagert werden.  ;)  ;)  ;)

Grüße Uwe

uxomm

Always decouple electronic circuitry.

lucasr98

Es handelt sich hierbei um ein Ventil von Festo (ich habe das Datenblatt mal beigehängt)

Auf Nachfrage ob das Ventil mit PWM angesteuert werden könne, bekam ich die Antwort dass es eigentlich funktionieren sollte  ;)

HotSystems

.....
Auf Nachfrage ob das Ventil mit PWM angesteuert werden könne, bekam ich die Antwort dass es eigentlich funktionieren sollte  ;)
Wenn diese Aussage vom Hersteller kommt, wäre ich vorsichtig.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

lucasr98

Ja habe dem Hersteller eine Email geschrieben und wurde dann ein paar Stunden später angerufen.
Am Telefon war ein Mitarbeiter der fragte um was es denn gehen würde. Als ich dann nachfragte ob ich das Ventil mit PWM ansteuern könne, meinte dieser dass es gehen sollte ich aber darauf achten muss dass das Ventil nicht mehr als 2A abbekommt.

combie

#9
Oct 12, 2018, 11:24 am Last Edit: Oct 12, 2018, 11:27 am by combie
Es handelt sich hierbei um ein Ventil von Festo (ich habe das Datenblatt mal beigehängt)

Auf Nachfrage ob das Ventil mit PWM angesteuert werden könne, bekam ich die Antwort dass es eigentlich funktionieren sollte  ;)
Du möchtest den "Soll Wert" erzeugen.

Das geht nicht mit einen N-Kanal FET.
Überhaupt, brauchst du da keinen FET. Und schon gar nicht so einen fetten.

Das Ventil wird dauerhaft an 24 V geklemmt, und die (0-10V)Steuerspannung ist auf GND bezogen.

Wenn überhaupt, dann brauchst du einen HigeSideSwitch.
Also einen P-Kanal FET oder PNP Transistor.
Und dann bitte nicht so einen fetten, der Steuerstrom wird nur sehr klein sein.

Auch dürfte ein Tiefpass, wie HotSystems schon sagte, durchaus angemessen sein.


Quote
dass das Ventil nicht mehr als 2A abbekommt.
Die Aussage passt nicht zum Datenblatt.

Auch sagt das Datenblatt, dass man hohe Frequenzen fern halten soll.

Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

lucasr98

Also muss ich den N-Kanal FET durch einen P-Kanal FET oder PNP Transistor austauschen und einen Tiefpass einbauen damit ich überhaupt auf ein Ergebnis komme?

Quote
Die Aussage passt nicht zum Datenblatt.
Das habe ich mir auch gedacht :o

DrDiettrich

#11
Oct 12, 2018, 11:33 am Last Edit: Oct 12, 2018, 11:38 am by DrDiettrich
AFAIK funktionieren Proportional-Ventile richtig nur mit PWM. Im Datenblatt ist dann oft eine (minimale) PWM-Frequenz empfohlen. Das leichte "Brummen" verhindert, daß das Ventil hängen bleibt, bei reiner Gleichspannung weiß man nie genau, wo das Ventil stehen geblieben ist.

Das Datenblatt deutet allerdings darauf hin, daß die Steuerung bereits eingebaut ist.

combie

#12
Oct 12, 2018, 11:48 am Last Edit: Oct 12, 2018, 11:48 am by combie
Quote
Das Datenblatt deutet allerdings darauf hin, daß die Steuerung bereits eingebaut ist.
Sehe ich auch so!
Und die möchte ein möglichst glattes Signal sehen.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

lucasr98

Also auf jedenfall p-Kanal FET und Tiefpass wenn ich das richtig verstehe oder?

combie

#14
Oct 12, 2018, 12:03 pm Last Edit: Oct 12, 2018, 12:06 pm by combie
Also auf jedenfall p-Kanal FET und Tiefpass wenn ich das richtig verstehe oder?
Wenn PWM, dann ja...
Und dann auch mit möglichst hoher Frequenz.
Das hilft beim glätten, ermöglicht kleinere Bauteile.

Übrigens:
1. DACs wie der DAC7571 sind extra für solche Zwecke erfunden worden.(es gibt noch viel mehr)
2. Viele µC haben eingebaute DAC, vielleicht ist der Nano nicht die beste Wahl
In beiden Fällen ist dann noch ein Verstärker/OP nötig, um auf die 10V zu kommen
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

Go Up