arduino:flaschenkuehler:programmversion_0.1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
arduino:flaschenkuehler:programmversion_0.1 [02.07.2017 08:14] – Frickelpiet | arduino:flaschenkuehler:programmversion_0.1 [18.05.2023 12:34] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Flaschenkühler - Programmversion 0.1 ====== | ====== Flaschenkühler - Programmversion 0.1 ====== | ||
- | Die erste Version der Software für den Flaschenkühler | + | Die erste Version der Software für den Flaschenkühler |
* mit der Änderung der PWM-Frequenz | * mit der Änderung der PWM-Frequenz | ||
+ | * mit der Auswertung des Tachosignals | ||
* mit dem dem Auslesen eines Thermistors | * mit dem dem Auslesen eines Thermistors | ||
* mit der PID-Regelung | * mit der PID-Regelung | ||
- | Das Ziel ist zunächst, die Drehzahl eines 4-Pin-PC-Lüfters über ein Poti zu regeln. | + | Das Ziel ist zunächst, die Drehzahl eines PC-Lüfters |
- | ===== Änderung der PWM-Frequenz | + | ==== Änderung der PWM-Frequenz ==== |
- | ==== Timer ==== | + | |
Der Arduino Nano hat drei Timer, die sich auf die PWM-Frequenz verschiedener Pins auswirken: | Der Arduino Nano hat drei Timer, die sich auf die PWM-Frequenz verschiedener Pins auswirken: | ||
* timer 0: Pins 5 und 6 | * timer 0: Pins 5 und 6 | ||
Zeile 16: | Zeile 16: | ||
Der timer 0 wirkt sich auf die Befehle millis(); micros() und delay() aus, so dass er nicht verändert werden sollte. | Der timer 0 wirkt sich auf die Befehle millis(); micros() und delay() aus, so dass er nicht verändert werden sollte. | ||
- | Evtl. muss die Bibliothek | + | Um den PC-Lüfter mit 25 kHz und das Peltier-Element mit einer anderen PWM-Frequenz ansteuern zu können, wird die PWM-Bibliothek |
+ | * Der PC-Lüfter wird an Pin D9 angeschlossen. | ||
+ | * Das Peltier-Element wird an Pin 3 angeschlossen. (Pin 11 gibt kein Signal aus.) | ||
+ | |||
+ | Der [[https:// | ||
+ | |||
+ | Die PWM-Frequenz kann mit der PWM-Bibliothek nahezu beliebig festgelegt werden. 50 kHz für das Peltier-Element an Pin 3 sind kein Problem. | ||
- | http:// | ||
- | http:// | ||
==== Tachosignal ==== | ==== Tachosignal ==== | ||
- | Der PC-Lüfter | + | Der PC-Lüfter |
+ | |||
+ | ==== PID-Regler ==== | ||
+ | Der PID-Regler für den Lüfter (und später auch der für das Peltier-Element) werden mit der [[http:// | ||
+ | |||
+ | ==== Ein- und Ausschalten des Lüfters ==== | ||
+ | Der verwendete PC-Lüfter von BeQuiet! hat eine Sicherheitsfunktionen, | ||
+ | |||
+ | < | ||
+ | // Flaschenkühler - Programmversion 0.1 | ||
+ | // Diese Version steuert einen PC-Lüfter mit 4-Pin-Anschluss ... | ||
+ | // ... liest das Tachosignal aus ... | ||
+ | // ... berechnet die Drehzahl des Lüfters ... | ||
+ | // ... liest einen Thermistor aus und berechnet die Temperatur ... | ||
+ | // ... stellt über ein Poti die Zieltemperatur ein ... | ||
+ | // ... und regelt den Lüfter mit einem PID-Modul. | ||
+ | |||
+ | # include < | ||
+ | # include < | ||
+ | # include < | ||
+ | |||
+ | // Definition der Ein- und Ausgänge | ||
+ | int potiPin = A0; // Input-Pin für den Lüfter | ||
+ | int thermistorPin = A1; // Input-Pin für den Thermistor | ||
+ | int fanPin = 9; // PWM-Pin für Lüfter | ||
+ | int powerPin = 4; // Schaltet den Transistor | ||
+ | int tachoPin = 2; // Pin für Tachosignal des Lüfters | ||
+ | int peltierPin | ||
+ | |||
+ | // Definition der Variablen | ||
+ | float thermistorValue = 0; // Variable in der der Wert des Thermistors gespeichert wird | ||
+ | int potiValue = 0; // variable to store the value coming from the sensor | ||
+ | |||
+ | uint16_t frequencyFan = 25000; | ||
+ | uint16_t frequencyPeltier = 50000; // PWM-Frequenz für den Lüfter (in Hz) | ||
+ | |||
+ | int tachoSignal; | ||
+ | uint32_t pulseOn = 0; // Ansteigende Signalflanke (Variablenformat nicht verändern!) | ||
+ | uint32_t pulseOff = 0; // Abfallende Signalflanke (Variablenformat nicht verändern!) | ||
+ | uint32_t duration; | ||
+ | bool high = false; | ||
+ | int rpm = 0; // Drehzahl des Lüfters in U/Min | ||
+ | |||
+ | int temperatur = 0; | ||
+ | |||
+ | // Definiert Instanzen zur Berechnung von Mittelwerten | ||
+ | RunningAverage averageRPM(10); | ||
+ | RunningAverage averageThermistor(10); | ||
+ | |||
+ | // Definiert den PID-Regler | ||
+ | double Setpoint, Input, Output; | ||
+ | double Kp=2, Ki=5, Kd=1; | ||
+ | PID fanPID(& | ||
+ | |||
+ | // Definiert die Tracking-Variablen für die IF-Abfragen | ||
+ | unsigned long previousMillisSerialPrint = 0; // Ausgabe an die serielle Schnittstelle | ||
+ | |||
+ | // Definiert die Intervalle für die IF-Abfragen in Millisekunden | ||
+ | const unsigned long intervalSerialPrint = 250; // Ausgabe an die serielle Schnittstelle | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(115200); | ||
+ | |||
+ | // Definiert die Pins | ||
+ | pinMode(tachoPin, | ||
+ | pinMode(powerPin, | ||
+ | pinMode(fanPin, | ||
+ | pinMode(peltierPin, | ||
+ | |||
+ | // Initialisiert timer1 und timer2 (timer0 bleibt unberührt) | ||
+ | InitTimersSafe(); | ||
+ | |||
+ | // Definiert die Frequenzen für die angegebenen Pins | ||
+ | bool successFan = SetPinFrequencySafe(fanPin, | ||
+ | bool successPeltier = SetPinFrequencySafe(peltierPin, | ||
+ | |||
+ | //if the pin frequency was set successfully, | ||
+ | if(successFan) { | ||
+ | pinMode(13, OUTPUT); | ||
+ | digitalWrite(13, | ||
+ | Serial.print(" | ||
+ | } | ||
+ | if(successPeltier) { | ||
+ | Serial.print(" | ||
+ | } | ||
+ | |||
+ | // Initialisiert die PID-Regler | ||
+ | fanPID.SetMode(AUTOMATIC); | ||
+ | |||
+ | // Meldung "Klar zum Start!" | ||
+ | Serial.println("< | ||
+ | } | ||
+ | |||
+ | |||
+ | void loop() { | ||
+ | // Aktuelle Zeit abfragen | ||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | // Lese die analogen Inputs aus | ||
+ | potiValue = analogRead(potiPin); | ||
+ | thermistorValue = analogRead(thermistorPin); | ||
+ | averageThermistor.addValue(thermistorValue); | ||
+ | |||
+ | // Berechnung der Temperatur | ||
+ | thermistorValue = averageThermistor.getAverage(); | ||
+ | thermistorValue = 1023 / thermistorValue - 1; | ||
+ | thermistorValue = 10000 / thermistorValue; | ||
+ | |||
+ | float temperatur; | ||
+ | temperatur = thermistorValue / 10000; | ||
+ | temperatur = log(temperatur); | ||
+ | temperatur /= 3950; // 1/B * ln(R/Ro) | ||
+ | temperatur += 1.0 / (25 + 273.15); | ||
+ | temperatur = 1.0 / temperatur; | ||
+ | temperatur -= 273.15; | ||
+ | |||
+ | // Regelung des Lüfters (TEST) | ||
+ | Input = temperatur; | ||
+ | Setpoint = 10 + float(potiValue * 0.02); | ||
+ | fanPID.Compute(); | ||
+ | pwmWrite(fanPin, | ||
+ | |||
+ | // Wenn der Output des PID-Reglers Null ist, wird der Lüfter ausgeschaltet. | ||
+ | if (Output > 0) { | ||
+ | digitalWrite(powerPin, | ||
+ | // | ||
+ | } | ||
+ | else { | ||
+ | digitalWrite(powerPin, | ||
+ | // | ||
+ | } | ||
+ | |||
+ | //use this functions instead of analogWrite on ' | ||
+ | // | ||
+ | pwmWrite(peltierPin, | ||
+ | |||
+ | // Messung der Pulsweite des Tachosignals | ||
+ | tachoSignal = digitalRead(tachoPin); | ||
+ | if (tachoSignal == HIGH && high != true) { // Zeit in micros bei ansteigender Flanke | ||
+ | pulseOn = micros(); | ||
+ | high = true; | ||
+ | } | ||
+ | else if (tachoSignal == LOW && high == true) { | ||
+ | pulseOff = micros(); | ||
+ | high = false; | ||
+ | duration = pulseOff - pulseOn; | ||
+ | if (duration > 7000 && duration < 150000) { // Liegt die Variable über bzw. unter den angegebenen Werten, liegt ein Messfehler vor | ||
+ | rpm = float(100000 * 2 * 60 / duration); | ||
+ | } | ||
+ | else { | ||
+ | rpm = 0; | ||
+ | } | ||
+ | averageRPM.addValue(rpm); | ||
+ | } | ||
+ | |||
+ | // Wenn der Lüfter angehalten wird, soll die Drehzahl " | ||
+ | if (Output == 0) { | ||
+ | rpm = 0; | ||
+ | averageRPM.addValue(rpm); | ||
+ | } | ||
- | | + | |
+ | if ((unsigned long)(currentMillis - previousMillisSerialPrint) >= intervalSerialPrint) { | ||
+ | |||
+ | Serial.print(" | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | | ||
+ | | ||
+ | | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | Serial.print("; | ||
+ | |||
+ | //Speichere die aktuelle Zeit in die zughörige Variable | ||
+ | previousMillisSerialPrint = currentMillis; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | Der Sketch verwendet 8590 Bytes (27%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes. | ||
+ | Globale Variablen verwenden 579 Bytes (28%) des dynamischen Speichers, 1469 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes. | ||
- | Tags: #Arduino #Nano #PC-Lüfter | + | Tags: # |
arduino/flaschenkuehler/programmversion_0.1.1498976059.txt.gz · Zuletzt geändert: 18.05.2023 12:16 (Externe Bearbeitung)