system
1
Hallo Gemeinde,
kann es sein, dass ich mein Board getötet habe?
Wen ich OCR2B auf z.B. 20 setze und OCR2B zur Kontrolle
im Loop auslese, wird mir 200 statt 20 angezeigt.
Bis heute Nachmittag hat alles funktioniert.
Gibt es eine Möglichkeit die Register bzw. den Arduino Mega
in den Auslieferungszustand zurück zu setzen?
Viele Grüße
Ronny
uwefed
2
ArduinoFreund:
Hallo Gemeinde,
kann es sein, dass ich mein Board getötet habe?
Möglich. Glaube ich aber nicht.
ArduinoFreund:
Wen ich OCR2B auf z.B. 20 setze und OCR2B zur Kontrolle
im Loop auslese, wird mir 200 statt 20 angezeigt.
Bis heute Nachmittag hat alles funktioniert.
Gibt es eine Möglichkeit die Register bzw. den Arduino Mega
in den Auslieferungszustand zurück zu setzen?
Viele Grüße
Ronny
Die Register werden bei jedem Reset (auch bein Einschalten) initialisiert.
Schick uns bitte den gesamten Code.
Grüße Uwe
system
3
Hallo Uwe,
anbei der Code. Ist noch nicht aufgeräumt und die
Kommentare habe ich noch nicht aktualisiert.
Ich währe Froh, wenn Du etwas findest.
Momentan ist der Stand so, das OCR mir den Wert immer
um den Faktor 10 zu Hoch ausgibt.
#include <math.h>
int PIN_temp = 2; // Pin an den Messdaten gelesen werden
int PIN_SD = 3; // Pin digitaler Stromschalter
int R_F1 = 10000; // Widerstand des festen Widerstandes am Spannungsteiler
int R_NTC = 10000; // Widerstand des Thermistor bei 25° C -> siehe Datenblatt Thermistor
int i_v = 0; //Zähler für Vergleichsoperation
int S_t = 0; //Schalter Lüfterregler
float temp_u ; // Umgebunstemperatur
float V_a = 4.63; //Anliegende Spannung -> Voltmeter gemessen
float B_Temp = 25; // Basistemperatur
float B_25 = 3977; //Basiswert bei 25°C 10KOhm +-5% -> siehe Datenblatt Thermistor
float Tn = 298.15; // 25°C in Kelvin (0°C = 273,15K)
float Kelvin = 273.15; // Konstante Umrechung Kelvin in Celsius
float temp_v2; //Temporäre Variable um Temperaturveränderungen zu ermitteln
float temp_s= 22.00; //Temperaturschwellwert ab dem die Lüftung gestartet wird
float temp_va = 0.5; //Temperaturveränderung
unsigned long millis_akt = 0; // Millisekunden
void setup() {
Serial.begin(9600); // Kommunikation starten
pinMode(PIN_SD, OUTPUT); // Pin als Output deklarieren
/* Erstmalige Temperaturbestimmung um in temp_v2 aktuelle Raumtemperatur zu schreiben,
ohne diese Messung würde Zähler gleich auf 1 Springen, da temp_v2 noch auf 0 steht*/
temp_u = temperatur(analogRead(PIN_temp)); //Pinwert lesen umrechnen & in Variable schreiben
temp_u = celsius(temp_u); // Ermittelter Wert in Celcius umrechnen
temp_v2 = temp_u;
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | /*_BV(WGM21)*/ | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22);
OCR2A = 180; // VGL
OCR2B = 0;
}
void loop() {
// Temperaturmessung
millis_akt = millis();
temp_u = temperatur(analogRead(PIN_temp)); //Pinwert lesen umrechnen & in Variable schreiben
temp_u = celsius(temp_u); // Ermittelter Wert in Celcius umrechnen
S_t = 0;
S_t = vergleich(temp_u);
//Datenrückgabe
// Serial.print(temp_u); // Wert im Serial Monitor ausgeben
// Serial.println(" C"); // Einheit dazu schreiben
Serial.print("; OCR2B = "); // PWM ausgeben
Serial.print(OCR2B); // Einheit dazu schreiben
Serial.print(S_t);
Serial.println(" Schaltwert");
Serial.print("Millisekunden: ");
Serial.println(millis_akt);
delay(1000); // 500ms warten
if (temp_u >= temp_s) {
digitalWrite(PIN_SD, HIGH);
} else {
digitalWrite(PIN_SD, LOW);
OCR2B = 20;
}
if (S_t > 0) {
OCR2B = OCR2B + 40;
if (OCR2B > 180) {
OCR2B = 180;
}
}
if (S_t < 0) {
OCR2B = OCR2B - 40;
if (OCR2B < 20) {
OCR2B = 20;
}
}
}
// Brechnung der Temperatur
float temperatur(int V_raw) {
// U = R * I -> R = U/I
float U_term; //Aktuelle Spannung Thermristor
float U_F1; //Spannung Vorwiderstand
float I; //Strom in Ampere
float R_akt; //Aktueller Widerstand
float temp_k; //Temperatur in Kelvin
//Vorberechnungen
U_term = V_a / 1023 * V_raw; //gemessene Spannung am Termistor
U_F1 = V_a - U_term; //errechnete Spannung am Vorwiderstand
I = U_F1 / R_F1; //errechneter Strom am Thermistor
R_akt = U_term / I; //errechneter Widerstand am Thermistor
// Temperaturberechung mit Steinhart-Hart-Gleichung
temp_k = (B_25*Tn) / (B_25+(log(R_akt/R_NTC)*Tn)); //errechnete Temperatur in Kelvin
//temp_u = temp_k - Kelvin;
return temp_k; // Temperatur in Kelvin zurückgeben
}
// Umrechnen der Temperatur in Cesius
float celsius(float temp_kon) {
temp_kon = temp_kon - Kelvin;
return temp_kon; // Temperatur in Celsius zurückgeben
}
float vergleich(float temp_v1) {
Serial.print("temp_v2 = ");
Serial.print(temp_v2); // Einheit dazu schreiben
if (temp_v1 > temp_v2) {
i_v = i_v + 1;
} else if (temp_v1 < temp_v2){
i_v = i_v - 1;
}
temp_v2 = temp_v1;
Serial.print("; temp_v1 = ");
Serial.print(temp_v1); // Einheit dazu schreiben
Serial.print("; Zähler = ");
Serial.print(i_v); // Einheit dazu schreiben
if (i_v < -4) {
i_v = 0;
return -1;
}
if (i_v > 4) {
i_v = 0;
return 1;}
else {
return 0;
}
}
system
4
Vielleicht helfen noch diese Info.
Ich habe ein anderes Programm getestet, bei dem 4 Taster
ausgelesen werden. Der Taster an Pin 5 (PWM Pin - Arduino MEGA 1280)
reagiert nicht.
Das Auslesen an Pin 7, mit der selben Schaltung, jedoch funktioniert.
Nun dachte ich Pin 5 ist defekt.
-> also ein weiterer Test:
Ein weiteres Programm von mir nutzt Pin 5 als OUTPUT um einen Mosfet zu
schalten und dort funktioniert er wieder.
Wahrscheinlich ist es heute schon zu spät.
Bis dahin.
Ronny
uwefed
5
S_t = 0;
S_t = vergleich(temp_u);
...
Serial.print("; OCR2B = "); // PWM ausgeben
Serial.print(OCR2B); // Einheit dazu schreiben
Serial.print(S_t);
S_T wird nach OCR2B geschrieben. Wenn S_t den Wert 0 hat, dann hast Du OCR2B mit "10 multipliziert".
Wenn Du den Kode in
Serial.print(OCR2B); // Einheit dazu schreiben
Serial.print(" "); Serial.print(S_t);
änderst, was bekommst Du dann ausgedruckt?
Grüße Uwe
system
6
Hallo Uwe,
was soll ich sagen....
.. es war doch schon zu spät. Vielen Dank für den Hinweis.
Jetzt funktioniert alles wieder so wie vorher.
Viele GRüße
Ronny