Heizplatte über PWM an und ausschalten

Hallo zusammen,

ich muss eine Heizplatte für einen 3D-Drucker für meine Thesis entwerfen. Ich habe soweit auch schon fast alles. Nun möchte ich die Heizplatte in abhängigkeit von der Temperatur an und ausschalten. Dies soll über PWM gemacht werden. Die H-Brücke muss ich verwendet, da meine Aufsicht das so möchte.

Nun zu meiner Frage. Ich habe noch nie bis zu meiner Thesis programmiert. Nun habe ich schon ein wenig was programmiert und weis aber nicht wie man pwm programmiert. Ich würde mich daher sehr freuen wenn ihr mir ein bischen helfen könntet. Ich soll über pwm mal 70% anschalten mal 30% bis ich dann den wert ermittelt habe in % wo die Heizplatte recht konstant warm bleibt.
Hier einmal mein code:

int PT1000=A0;     //PIN A0
int t=500;         //Delay-Time
float sollwert = 28; //Der Wert, der Eingestellt werden soll
float temperatur=0;  //Variable soll zu beginn auf 0 sein
float sensorwert=0;  //"         "   "    "     "  "  "
float minWert = sollwert -2; //Mindestwert
float maxWert = sollwert +2; //Maximalwert
int h_1 = 11; // h-brücke Pin 11
int h_2 = 12; // h-brücke Pin12


void setup() {
 
 Serial.begin(9600);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(4,OUTPUT); //LED GRÜN
  pinMode(5,OUTPUT); //LED ROT
  //pinMode(7,OUTPUT); //SCHALTER
  digitalWrite(5,LOW); // Zu Beginn auf LOW
  digitalWrite(10,LOW); // Zu Beginn auf LOW
}

void loop() {
int Input = analogRead(PT1000);  //Auslesen des Temp-Sensors
  Serial.print("Sensor Value: ");
  Serial.print(Input);


int Input_h1 = digitalRead(h_1); //Auslesen des ersten Inputs von der H-Brücke ob 1 oder 0
  Serial.print(" 1.Wert: ");    
  Serial.print(Input_h1);

int Input_h2 = digitalRead(h_2); //Auslesen des zweiten Inputs von der H-Brücke ob 1 oder 0
  Serial.print(" 2.Wert: ");
  Serial.print(Input_h2);  
  
float voltage = (Input/1024.0)*5.0; //Spannungsumrechnung für den Temp-Sensor
  Serial.print(", Volts: ");
  Serial.print(voltage);
  


sensorwert = analogRead(PT1000); 
  temperatur= map(sensorwert, 0, 1024, 0, 250); //die Temperatur wird ausgelesen
  Serial.print(", Celsius: ");
  Serial.println(temperatur);
 
if(temperatur <= minWert){
  digitalWrite(4, HIGH);
  digitalWrite(5,LOW);
  //digitalWrite(7,HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH); 
} 

else if(temperatur >minWert && temperatur <= maxWert){
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  //digitalWrite(7,HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH); 
  }
else
{
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    //digitalWrite(7,LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW); 

}



delay(t);
}

die H-Brücke die ich benutze ist BTN7971b hier ein foto

taha66:
...und weis aber nicht wie man pwm programmiert...

Beim arduino ist das analogWrite(pin, 0-255). Damit gibst du "eine Spannung von 0-5V auf dem Pin aus.

taha66:
Ich soll über pwm mal 70% anschalten mal 30% bis ich dann den wert ermittelt habe in % wo die Heizplatte recht konstant warm bleibt.

Was meinst du damit?

Zudem. Beim Board vom 3D-Drucker hast du grundsätzlich immer eine Heizbett regelung integriert.

Beim Ramps ist es z.b. die Klemme D8.

Die H-Brücke muss ich verwendet, da meine Aufsicht das so möchte.

Irre...

Aber ok, auch wenn eine halbe Brücke, oder ein einzelner FET, reichen würde....
Die volle Brücke wird es auch tun.

meister_q:
Beim arduino ist das analogWrite(pin, 0-255). Damit gibst du "eine Spannung von 0-5V auf dem Pin aus.

Was meinst du damit?

Zudem. Beim Board vom 3D-Drucker hast du grundsätzlich immer eine Heizbett regelung integriert.

Beim Ramps ist es z.b. die Klemme D8.

Danke für deine Antwort :smiley:
Also mit 70% meine ich z.B das die Heizplatte nur zu 70% Leistung abgibt stat die vollen 100%

Habe vergessen zu erwähnen das ich ein Mega2560 benutze

Wäre der code so richtig?

int PT1000=A0;     //PIN A0
int t=500;         //Delay-Time
float sollwert = 28; //Der Wert, der Eingestellt werden soll
float temperatur=0;  //Variable soll zu beginn auf 0 sein
float sensorwert=0;  //"         "   "    "     "  "  "
float minWert = sollwert -2; //Mindestwert
float maxWert = sollwert +2; //Maximalwert
int h_1 = 11; // h-brücke Pin 11
int h_2 = 12; // h-brücke Pin12


void setup() {
 
 Serial.begin(9600);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(4,OUTPUT); //LED GRÜN
  pinMode(5,OUTPUT); //LED ROT
  //pinMode(7,OUTPUT); //SCHALTER
  digitalWrite(5,LOW); // Zu Beginn auf LOW
  digitalWrite(10,LOW); // Zu Beginn auf LOW
}

void loop() {
int Input = analogRead(PT1000);  //Auslesen des Temp-Sensors
  Serial.print("Sensor Value: ");
  Serial.print(Input);


int Input_h1 = digitalRead(h_1); //Auslesen des ersten Inputs von der H-Brücke ob 1 oder 0
  Serial.print(" 1.Wert: ");    
  Serial.print(Input_h1);

int Input_h2 = digitalRead(h_2); //Auslesen des zweiten Inputs von der H-Brücke ob 1 oder 0
  Serial.print(" 2.Wert: ");
  Serial.print(Input_h2);  
  
float voltage = (Input/1024.0)*5.0; //Spannungsumrechnung für den Temp-Sensor
  Serial.print(", Volts: ");
  Serial.print(voltage);
  


sensorwert = analogRead(PT1000); 
  temperatur= map(sensorwert, 0, 1024, 0, 250); //die Temperatur wird ausgelesen
  Serial.print(", Celsius: ");
  Serial.println(temperatur);
 
if(temperatur <= minWert){
  digitalWrite(4, HIGH);
  digitalWrite(5,LOW);
  //digitalWrite(7,HIGH);
  analogWrite(11, 255);
  analogWrite(12, 255); 
} 

else if(temperatur >minWert && temperatur <= maxWert){
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  analogWrite(11, 255);
  analogWrite(12, 255); 
  }
else
{
    digitalWrite(4,LOW);
    digitalWrite(5,HIGH);
    analogWrite(11, 0);
    analogWrite(12, 0);  

}



delay(t);
}

combie:
Irre...

Aber ok, auch wenn eine halbe Brücke, oder ein einzelner FET, reichen würde....
Die volle Brücke wird es auch tun.

combie:
Irre...

Aber ok, auch wenn eine halbe Brücke, oder ein einzelner FET, reichen würde....
Die volle Brücke wird es auch tun.

soweit ich weiß benutzt man H-Brücken für Motoren oder? Wieso sollte es mir hier etwas bringen? Also ist das in diesem Fall sowas wie ein Schalter? Und würde es reichen wenn ich nur 1 halbe brücke benutzen würde? Weil auf dem Ding steht einmal 5V IN1 IN2 GND am eingang und am ausgang OUT1 OUT2? Also müssen an beiden OUTPUTS etwas dran sein? oder könnte ich auch nur an OUTPUT 1 etwas anschließen und es würde funktionieren? Ich möchte ja keinen Motor nach links oder rechts rotieren lassen. Daher meine Frage

Du kannst es so ausprobieren, natürlich. Aber 255 ist maximum, also 5V. Wenn du nur 70% haben willst, musst du schon analogWrite(pin, 190) oder so machen.

So habe ich das angeschlosse. An der Anschlussklemme habe ich eine externe Spannungsquelle. Und auf der H-Brücke habe ich vom arduino 5V GND angeschlossen und halt die zwei inputs. Habe ich da etwas falsch angeschlossen? Weil ich das gefühl habe als würde ich das doppelt mit spannung versorgen.

Kleiner Einwand: Mit Analog-Write reguliert man keine Spannung, sondern den Tastgrad der PWM. Also auch bei analogWrite(pin, 10) werden 5V ausgegeben, aber mit einem anderen Tastgrad als bei analogWrite(pin, 127) oder analogWrite(pin, 255)

Grüsse
Peter

someone83:
Kleiner Einwand: Mit Analog-Write reguliert man keine Spannung, sondern den Tastgrad der PWM. Also auch bei analogWrite(pin, 10) werden 5V ausgegeben, aber mit einem anderen Tastgrad als bei analogWrite(pin, 127) oder analogWrite(pin, 255)

Grüsse
Peter

Hallo Peter

heißt das also, dass bei analogWrite(pin,10) die 5V immer nur sehr kurz anliegen und bei analogWrite(pin,127) länger als wie bei analogWrite(pin,10)? Also muss ich mir das so vorstellen, dass zb bei analogWrite(pin,10) nur 5 sekunden 5v anliegen dann zb 20 sekunden 0V und dann wieder 5 sekunden 5v und 20 sekunden 0V? Also quasi das der Schalter mal an ist und mal aus?

taha66:
soweit ich weiß benutzt man H-Brücken für Motoren oder? Wieso sollte es mir hier etwas bringen? Also ist das in diesem Fall sowas wie ein Schalter?

Eine H-Brücke braucht man wenn Strom in zwei Richtungen fließen muss. Motoren sind die häufigste Anwendungen, aber nicht die einzige.

Vereinfacht sind das 4 Transistoren:

Davon sind jeweils zwei aktiv, damit der Strom in beide Richtungen fließen kann

Wenn Strom nur in eine Richtung fließen soll reicht ein einzelner Transitor

Also muss ich mir das so vorstellen, dass zb bei analogWrite(pin,10) nur 5 sekunden 5v anliegen dann zb 20 sekunden 0V und dann wieder 5 sekunden 5v und 20 sekunden 0V?

Nein. Der Wechsel findet mit 490 oder 970 Hertz statt. Und für PWM ist das eine sehr niedrige Frequenz. Mehrere Dutzend kHz sind da bei anderen Anwendungen nicht unüblich

Auch hier hilft ein Bild:
https://learn.mikroe.com/ebooks/wp-content/uploads/sites/36/2016/02/pic-microcontrollers-examples-in-assembly-language-chapter-05-fig5-4.gif?x29927

Die Frequenz ist im Prinzip die Zeit zwischen den positiven Flanke. Die ist konstant. Was sich ändert ist die Position der negativen Flanke dazwischen

someone83:
Kleiner Einwand: Mit Analog-Write reguliert man keine Spannung, sondern den Tastgrad der PWM. Also auch bei analogWrite(pin, 10) werden 5V ausgegeben, aber mit einem anderen Tastgrad als bei analogWrite(pin, 127) oder analogWrite(pin, 255)

Grüsse
Peter

Natürlich gebe ich dir recht. Aber wie soll ich es den anders an einen Laien weiter geben?

taha66:
Hallo Peter

heißt das also, dass bei analogWrite(pin,10) die 5V immer nur sehr kurz anliegen und bei analogWrite(pin,127) länger als wie bei analogWrite(pin,10)? Also muss ich mir das so vorstellen, dass zb bei analogWrite(pin,10) nur 5 sekunden 5v anliegen dann zb 20 sekunden 0V und dann wieder 5 sekunden 5v und 20 sekunden 0V? Also quasi das der Schalter mal an ist und mal aus?

Nein, beim PWM wird durch das Tastverhältniss die Spannung je nachdem schneller oder langsamer An und Ausgeschaltet.

Dadurch "gaukelt" man einem Motor, oder einem Heizbett oder oder vor, als ob man mit nur z.b. 70% der Leistung fährt.

taha66:
heißt das also, dass bei analogWrite(pin,10) die 5V immer nur sehr kurz anliegen und bei analogWrite(pin,127) länger als wie bei analogWrite(pin,10)? Also muss ich mir das so vorstellen, dass zb bei analogWrite(pin,10) nur 5 sekunden 5v anliegen dann zb 20 sekunden 0V und dann wieder 5 sekunden 5v und 20 sekunden 0V? Also quasi das der Schalter mal an ist und mal aus?

Im Prinzip ja. Das ist das Prinzip einer PWM.

Nur dass es beim Arduino mit 490Hz passiert. Also analogWrite(pin,10) erzeugt 80µs lang 5v und 1961 µs lang 0V. 70% würde dann analogWrite(pin,178) entsprechen und 1425µs lang 5v erzeugen gefolgt von 616µs lang 0V.
(und, ja, ich weiß, dass es auch PWM-Kanäle gibt, die mit 980Hz laufen.)

Den PT1000 kannst Du nicht direkt an den Arduino anschließen. Die Widerstandsänderung ist zu gering. Du brauchst eine Wandlerelektronik dazwischen.

Dein Foto der Verdratung verstehe ich nicht.

Was sind h_1 und h_2 der H-Brücke?

Wieso setzt du Pin 10 auf LOW wenn Du es vorher nicht deklariert hast?

Du kannst ruhig 1 Transistor der H Brücke verwenden und die Last zwischen + Versorgungsspannung (VCC) und einem Output (zB Output1) der H Brücke schalten. Die Platine muß dann die Versorgerspannung bekommen (VCC und GND) und zusätzlich 5V und GND. Die Heizleistung steuerst Du dann mit dem PWM SIgnal an IN1.

Ich teile das Unverständnis meiner Vorschreiber, daß Du einen H-Brücke verwenden mußt.

Grüße Uwe

uwefed:
Den PT1000 kannst Du nicht direkt an den Arduino anschließen. Die Widerstandsänderung ist zu gering. Du brauchst eine Wandlerelektronik dazwischen.

Dein Foto der Verdratung verstehe ich nicht.

Was sind h_1 und h_2 der H-Brücke?

Wieso setzt du Pin 10 auf LOW wenn Du es vorher nicht deklariert hast?

Du kannst ruhig 1 Transistor der H Brücke verwenden und die Last zwischen + Versorgungsspannung (VCC) und einem Output (zB Output1) der H Brücke schalten. Die Platine muß dann die Versorgerspannung bekommen (VCC und GND) und zusätzlich 5V und GND. Die Heizleistung steuerst Du dann mit dem PWM SIgnal an IN1.

Ich teile das Unverständnis meiner Vorschreiber, daß Du einen H-Brücke verwenden mußt.

Grüße Uwe

Hallo uwe,
habe den Thread doch gefunden :smiley:

Also ich benutze für den PT1000 einen PT1000-Messwandler von Pollin. Soll wohl nicht gut sein, aber besser als garnichts :slight_smile:

Als h_1 und h_2 sollen die eingänge von der H-Brücke sein. Daher das h für H-Brücke und 1 und 2 für Eingang 1 und Eingang 2.

Ich weiß leider nicht wie ich genau die H-Brücke anschliesen muss. Habe sowohl über den VCC GND mit Spannung versorgt als auch mit den Pins links und rechts von den beiden Eingängen. Beidemale habe ich leider am OUTPUT1 nichts an und ausschalten könne. Das ich Pin 10 nicht deklariert habe, habe ich nicht gemerkt. Danke dir :).

Könntest du mir vielleicht sagen ob ich nur an VCC GND was anschließen muss oder nur an 5V GND oder ob ich bei beiden was anschließen muss?

Und hat mein Quelltext ein Hystereseverhalten?

Viele liebe Grüße

taha66

taha66:
Ich weiß leider nicht wie ich genau die H-Brücke anschliesen muss. Habe sowohl über den VCC GND mit Spannung versorgt als auch mit den Pins links und rechts von den beiden Eingängen. Beidemale habe ich leider am OUTPUT1 nichts an und ausschalten könne. Das ich Pin 10 nicht deklariert habe, habe ich nicht gemerkt. Danke dir :).

Könntest du mir vielleicht sagen ob ich nur an VCC GND was anschließen muss oder nur an 5V GND oder ob ich bei beiden was anschließen muss?

Bitte lies meine letzte Antwort genauer durch.
Grüße Uwe

meister_q:
... Natürlich gebe ich dir recht. Aber wie soll ich es den anders an einen Laien weiter geben? ...

Wieso willst Du es überhaupt anders weitergeben? Ich denke, dass selbst ein Laie versteht, was PWM ist. Wer das nicht versteht, ist dermaßen wenig an Technik interessiert, dass er hier sowieso nicht mitliest.

Gruß

Gregor

Als erstes solltest du mal verstehen wie die vor dir liegende Platine funktioniert. Nur programmieren ist sicher nicht das Ziel deiner Aufgabe.

Da durch die zwei Optokoppler eine galvanische Trennung zwischen Steuer- und Arbeitskreis vorliegt, musst du natürlich beide Seiten mit Spannung versorgen.

Aber, als ich das Foto deiner "Verdrahtung" gesehen habe, hast du wohl hardwaremässig noch viel mehr zu lernen.

Warum gibt man dir eigentlich solch eine "schwere" Aufgabe, wenn Null Wissen und Können vorliegen? Wenn es darum geht programmieren zu lernen, dann sollte man dir fertige Hardware geben. Wenn es darum geht auch Hardware zu lernen, dann sollte man vorher gewisse Grundkenntnisse vermitteln und nicht einfach nur die Brocken "hinwerfen" und sagen "...mach mal...". Schon die Vorgabe eine H-Brücke für diese Aufgabe verwenden zu müssen finde ich eine Frechheit.

So, nachdem ich mich über deine/n AusbilderIn aufgeregt habe, hier die Erklärung deiner Fehler im Verdrahtungsfoto:

  • Spannungsversorgungen werden in den meisten Gleichspannungsfällen wie folgt verbunden:
    -- Plus = rot
    -- Masse (GND) = blau
    -- Minus = schwarz
    Solltest du dich in Richtung KFZ Technik weiterbilden, dann gilt:
    -- ungeschaltete Plusadern, z. B. Kl. 30 = rot oder bei mehrfarbigen rot als Grundfarbe
    -- Masse, Kl. 31 = braun (deutsche KFZ Hersteller)
    -- Minus, gibt es in der Verdrahtung (noch?) nicht
    -- geschaltete Plusadern, z. B. Kl. 15 = schwarz bzw. bei mehrfarbigen als Grundfarbe

Nächster Fehler laut deinem Foto, die Farben der In-Adern tauchen bei der Versorgung auf der Sekundärseite als Spannungsversorgung auf - riesenfehler!!!

Und die Versorgungsader der Heizplatte sieht wie ein blankes Stück Draht aus! Sollte dies eine durchsichtige Ummantelung sein, dann habe ich nichts gesagt, ansonsten, sofort austauschen.

Auch die Querschnitte der Adern auf der Sekundärseite sind sicher viel zu gering, für eine Heizplatte.

Also, bringe erst mal die Hardware in Ordnung. Wenn du nämlich hier schon Fehler hast, dann kannst du im Programm lange nach Fehlern suchen wenn was nicht läuft.

Gruß und viel Erfolg

MiReu