kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Laborversuch #5 -- Montag 11.10.2021 -- Zweipunktregler für eine Heizung

(EN google-translate)

(PL google-translate)

Schließlich soll nun die bisherige Anordnung so vervollständigt werden, dass ein Heizelement mit einer Zweipunktregelung entsteht.

Als Heizelement wird ein niedrigohmiger Widerstand benutzt, der in die Nähe des MPU6050 gebracht wird, um eine Temperaturmessung zu ermöglichen.

Der Widerstand wird mittels eines Leistungs N-Mosfet-Transistors an und ausgeschaltet. Es ist nicht möglich ihn direkt an die digitalen Ausgänge des Mikrocontrollers anzuschließen, weil diese maximal 80mA liefern können.


ACHTUNG: Der ausgegebene Leistungs-Widerstand mit 4,7 Ohm ist eigentlich etwas zu niederohmig.


Es würden gut 1 Ampere Strom bei 5 Volt fließen. Um die mittlere Leistung zu reduzieren, könnte er zyklisch immer nur für 1/10 der Zeit angeschaltet werden.

Vorläufig wird einfach ein normaler Kohleschichtwiderstand von 1/4 Watt mit 47 Ohm verwendet. An den muß man eigene Leitungen anbringen, um ihn nahe an den Chip des Breakout-Boards bringen zu können.

Aufbau des kompletten Regelkreises auf dem Steckboard.

Bild 0-1: Aufbau des kompletten Regelkreises auf dem Steckboard.

Teilschaltung, die gegenüber Versuch #4 nun hinzukommt: Ansteuerung des Heizwiderstandes.

Bild 0-2: Teilschaltung, die gegenüber Versuch #4 nun hinzukommt: Ansteuerung des Heizwiderstandes.

#include<math.h>
#include<Wire.h>
const int MPU=0x68;  // I2C address of the MPU-6050
int16_t AcX=0,AcY=0,AcZ=0,Tmp=0,GyX=0,GyY=0,GyZ=0;
double TEMPERATUR = 0.0;
boolean AN = false;
void setup() 
{
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  Serial.begin(9600);
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  delay(500);
}

void loop() 
{
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

  TEMPERATUR = Tmp/340.00+36.53;
  
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(TEMPERATUR);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.print(GyZ);

  if(TEMPERATUR<28.0)
  {
      AN = true;
  }
  else if(TEMPERATUR>30.0)
  {
      AN = false;
  }

  if(AN)
  {
      digitalWrite(9,HIGH);
      digitalWrite(10,HIGH);
      Serial.println(" | AN");
  }
  else
  {
      digitalWrite(9,LOW);
      digitalWrite(10,LOW);
      Serial.println(" | AUS");
    
  }
  
  delay(500);
}

Code 0-1: Programm zur Zweipunkt-Heizregelung.

Temperatur.zip -- Sketch mit obigem Programm.
Aufgaben
  • Vergleichen Sie dieses Programm mit dem aus Versuch #4.
  • Welche Programmzeilen repräsentieren hier den neu hinzugekommenen Zweipunktregler?
  • Analysieren Sie die Funktionsweise der Regelung.
  • Führen Sie das Programm aus und überprüfen, ob die Regelung funktioniert.