Forum: Mikrocontroller und Digitale Elektronik Temperatur Regelung mit ATmega 2561


von Yannick (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag lieber Foren Mitglieder,

ich bin franzose, und arbeite in Deutschland...also bitte ich um 
ntschuldigung für mein miesrigen deutsch.

Ich möchte das Problem klar darstellen bevor ich ihre Hilfe anfordere.

Wir sind ein kleines Unternehmen die sich mit Gasanalyse beschäftigen.
Ich bin verantwortlich für eine elektronische datenerfassungs platine, 
die durch infrarotes Prinzip eine Gaskonzentration erfassen sollte. Und 
der Herz der platine ist der Mikrocontroller (µC) AVR Atmega 2561.

Die Temperatur hat eine sehr schlechte Wirkung auf die Ergebnisse. 
Deswegen ist eine Temperatur Regelung benötigt, und zwar:

- Dank Heizfolien (2 Stück), 12V, 2W möchte ich die Messkammer (wo das 
Gas fliesst) erwärmen, auf einer Temperatur zw 39° und 40°C zu regeln.

- Das IR Detektor enthält einen Temperatur Sensor, der mir einen 
linearen Ausgangssignal (Spannung) liefert. Diese Spannung wird dank den 
A/D Wandler im µC digitalisiert (10 bits Resolution =1024 
Wandlerwerten(WW)) und wird für Berechnungen weiter verwendet.

z.B. eine Temperatur von 25°C würde 1,225V oder 530 WW sein.


Mein Idee war:

Dank dieser "digitale" Temperatur ein der I/O Port des µC zu benützen, 
um einen Transistor zu steuern.
In anderen Worten wenn die Temperatur 40°C überschreitet, sollte das µC 
den Transistor "ausschalten" so dass die Spannungsversorgung für die 
Heizfolie sich ausschaltet, und so kann die Messkammer sich abkühlen.
Wenn die Temperatur unter 39°C wird, sollte der µC den gleichen 
Transistoren wieder "einschalten" so dass die Heizfolie die Messkammer 
neu erwärmen kann. (Prinzip des Schmidt Trigger aber digital).


Mein Problem:

ich habe leider die C-Programmierung (unter AVRStudio4) nicht 
entwickelt, aber muss damit arbeiten und weiter entwickeln...
Sie enthält 11 Funktion, unterstützt von 11 header Funktion...also im 
Grunde ungefähr 4700 Quellekode Linien...

ich leider kein Programmierspezialist, meine Frage ist:

Könnten sie mich helfen, oder ein paar Typ geben, wie man einen freien 
I/O Pin steuert? Wo muss man die Änderung durchführen? Welche Variabeln 
sind wichtig?
Alles ist in dieser Programmierung zusammengekoppelt, und es ist nicht 
sehr klar...

Ich habe den AVR-GCC Tutorial in der hand, aber trotzdem...

Anbei habe ich eine Abbildung von den Schaltplan mit dem µC kopiert, es 
bestehen einigen freien I/O.

Ich erkläre gern noch weiter, und/oder besser wenn sie nicht verstehen. 
Aber es wäre super ein bisschen Hilfe zu bekommen, da ich alleine 
darüber arbeite :-)

Vielen Dank im voraus,
Yannick

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Ich kann die Zeichnung sehr schlech lesen, kann also nur vermuten, dass 
Port D7 frei ist. Deswegen verwende ich diesen in meinem Beispiel.

Wenn man mit dem AVR-Studio und Win-AVR programmiert, würde man Port D7 
so als digitalen Ausgang initialisieren:

DDRD |= (1 << DDB7);  // Setze Bit 7 von Data Direction von PortD auf 
high

Danach ist dieser Pin ein Ausgang und kann Strom treiben. Er ist nach 
dem Reset der CPU auf low gesetzt, liefert also 0 Volt.

So setzt man den Pin auf high:

PORTD |= (1 << PD7);

Und so auf low:

PORTD &= ~(1 << PD7);


Grüße,

Peter

von Yannick (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

Vielen vielen Dank Peter, ich muss noch überprüfen ob es frei ist (ich 
war zwei Wochen weg...), aber ich habe das Bild in zwei geteilt, und 
denke dass es jetzt viel einfacher ist zu sehen.

Vielleicht hat jemanden noch eine Idee :-), man weiss nicht.

Ich melde mich im kurzen wieder.
MfG
Yannick

von Karl H. (kbuchegg)


Lesenswert?

Yannick schrieb:

> Vielleicht hat jemanden noch eine Idee :-), man weiss nicht.

Im Grunde wurde schon fast alles gesagt, nur eines noch. Wenn die 
Temperaturkonstanz so wichtig ist, wirst du wahrscheinlich
 *) mit dieser einfachen 2-Punkt Regelung nicht sehr glücklich
    werden.
 *) als Abhilfe dagegen eher einen Umschaltpunk in der Mitte
    bevorzugen
    ist die Temperatur > 39.5°C dann Heizung aus
    ist die Temperatur darunter, dann Heizung ein

Der Grund dafür ist einfach: Selbst wenn du die Heizung ausschaltest, 
wird sich deine Messkammer weiter erwärmen, weil es eine Weile dauert, 
bis die Energie der Heizfolie bis zur Kammer durchgedrungen ist.
Genauso in der umgekehrten Richtung: Wenn die Temperatur sinkt und du 
die Heizung einschaltest, wird die Kammer zunächst noch ein bischen 
kühler werden, ehe sie wieder ansteigt.

Deine Temperaturvorgaben und die Toleranzen sind schon nicht ohne. Eine 
Kammer auf +-0.5°C konstant zu halten ist schon nicht mehr soooo 
trivial. Wenn du es mit deiner einfachen 2-Punkt Regelung nicht 
hinkriegst, rechne damit, dass du die Heizung mittels PWM in ihrer 
Intensität einstellen musst und dass du einen PI-Regler dafür benötigst.

von Yannick (Gast)


Lesenswert?

Guten Tag,

Vielen Dank Karl, diese umschaltpunkt Regelung habe ich probiert, zu 
implementieren, aber habe noch einen Problem. Ich erkläre:

ich habe den Pin PA7 gewählt, weil es zu einen Port gehört, der die ein 
externes Digital /Analog Wandler (DAC) steuert. (PA7 ist aber noch frei, 
und nicht benützt).

Es gibt einer Header Datei, wo globale Parametern konfiguriert sind, 
dort habe ich es initialisiert, und habe es DAT_T_control benannt (siehe 
bei Komment. //Yannick)

// Define DAC Pins
#define DDR_DAC        DDRA
#define PORT_DAC      PORTA
#define DAC_RS1_PIN                     DDA0
#define DAC_RS2_PIN      DDA1
#define DAC_FAULT_PIN            DDA2
#define DAC_CLEAR_PIN            DDA3
#define DAC_T_control            DDA7 //Yannick

In der Haupt Quell Funktion ("init.c") habe ich folgendes geschrieben: 
(tempDeg ist die Temperatur in °C , PORT_DAC ist in der obigen Funktion 
deklariert.)


  if (tempDeg < 25)
      {

      PORT_DAC |= (1<<DAC_T_control);

      printf("Block_heating ON");
      }

  else //if (tempDeg > 25)

      {
      PORT_DAC &= ~(1<<DAC_T_control);

      printf("Block_heating OFF");
      }



Normalerweise sind alle Variablen richtig deklariert.

Mein Problem:

In diesem Fall ist der Pin PA7 auf high gesetzt, mit dem Multimeter 
messe ich eine schöne 5V, und das bis die Temperatur 25°C.

So wenn die Temperatur 25°C überschreitet, bleibt das PIN immer noch auf 
"high" statt low zu sein, und ich messe immer noch die 5V...

ich habe einen Terminal (TeraTerm 4.6) , wo ich die Ausgangsdaten meine 
Karte ablesen kann, und dort kann ich sehen wenn die Heizung an ist ( 
Block_heating ON) und wenn sie aus ist (Block_heating OFF).

Wenn temperatur über 25°C bleibt das Terminal immer noch auf : 
Block_heating ON...


ich denke dass das Problem von der Zahl 25 kommt, weil sie nicht 
definiert ist... also vielleicht eine funktion entwickeln...?

Habt ihr einen Typ?

vielen Dank
Yannick

von Karl H. (kbuchegg)


Lesenswert?

Yannick schrieb:

> ich denke dass das Problem von der Zahl 25 kommt, weil sie nicht
> definiert ist... also vielleicht eine funktion entwickeln...?

Du denkst zu kompliziert.
Wenn der µC nie in den else Zweig kommt, dann deswegen, weil tempDeg nie 
größer als 25 wird.

> Habt ihr einen Typ?

Lass dir den Wert von tempDeg ausgeben und sieh nach, welcher Wert 
wirklich vorliegt. Du hast ein Terminal drann, an dem du Ausgaben machen 
kannst. Nutze es!

von Yannick (Gast)


Lesenswert?

Guten Tag,

Ja Karl, die Zahl 25 war nicht definiert in dieser Haupt Funktion.

Deswegen habe ich es anders gemacht:

Ich habe eine Funktion definiert in der Hauptfunktion wo die temperatur 
definiert wurde, siehe unten:

void Block_temperature_control(float tempDeg)  //Yannick
{
  if (tempDeg < 22)
      {

      PORT_DAC |= (1<<DAC_T_control);

      printf("Block_heating ON\n");

      }

  else

      {
      PORT_DAC &= ~(1<<DAC_T_control);

      printf("Block_heating OFF\n");

      }
}                        //Yannick


Ich habe in einer anderer Hauptfunktion (eine spezielle...), dieser 
Funktion aufgerufen:

Block_temperature_control(tempDeg); // Yannick

Und es hat funktionniert!

Also als Zusammenfassung: die Zahl war nicht richtig definiert, und 
deswegen konnte es in der ursprüngliche Hauptfunktion einfach nicht 
funktionnieren!

ich wollte mich noch einmal bedanken, weil ihr mich guten Tipps gegeben 
habt, und wenn man so unerfaren ist wie ich, ist es wirklich hilfreich.

ich wünschte mir etwas ähnliches auf französisch :-)

Merci
Yannick

von Karl H. (kbuchegg)


Lesenswert?

Yannick schrieb:

> Also als Zusammenfassung: die Zahl war nicht richtig definiert, und
> deswegen konnte es in der ursprüngliche Hauptfunktion einfach nicht
> funktionnieren!

Wir haben offenbar unterschiedliche Auffassungen, was das Wort 
"definiert" in diesem Zusammenhang bedeutet. Aber ist ok, ich vergass 
das du Franzose bist und ich daher nicht jedes Wort auf die Goldwaage 
legen darf :-)

Hauptsache es funktioniert jetzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.