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
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
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
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.
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
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.