cb-blog sägen-software-systeme HOME

Hardware··3 Min. Lesezeit

FAN-Control – Lüfter- und Schiebersteuerung

Kompakte Embedded-Steuerung für Lüfter und Abgasschieber eines Gasdurchlauferhitzers – mit eigener Hardware in KiCad und Firmware in AVRPascal auf einem ATmega328PB.

Überblick

FAN-Control überwacht den Betriebszustand eines Gasdurchlauferhitzers und steuert automatisch:

  • den Abgasschieber (motorisch, via H-Brücke) – öffnet beim Einschalten des Geräts
  • den Lüfter – schaltet temperaturabhängig zu

Die Steuerung erkennt den Gerätezustand über ein Analogsignal, misst die Abgastemperatur mit einem DS18B20-Sensor und reagiert zusätzlich auf einen manuellen Taster.

Systemarchitektur

24 V DC
   │
   ▼
Spannungsaufbereitung
   │
   ▼
ATmega328PB (PD2–PD7)
   ├── PD3 ◄── LM358 (Analogsignal Gerätezustand)
   ├── PD4 ◄── DS18B20 (1-Wire Temperatursensor)
   ├── PD7 ◄── Taster (manuell Ein/Aus)
   ├── PD5/PD6 ──► DRV8871DDA (H-Brücke → Schieber-Motor)
   └── PD2 ──► AO3400A (MOSFET → Lüfter)

Hardware

Hauptkomponenten

BauteilBezeichnungFunktion
MikrocontrollerATmega328PBZentrale Steuerlogik
TemperatursensorDS18B201-Wire Temperaturmessung
MotortreiberDRV8871DDAH-Brücke für Schieber-Motor
LüftertreiberAO3400AN-Kanal MOSFET zum Schalten des Lüfters
SignalaufbereitungLM358Operationsverstärker für Geräte-Signal
Versorgung24 V DCExterne Versorgungsspannung
GehäuseBernic Series 350DIN-Schienenmontage

Gehäuse

Bernic Series 350 – Gehäuse für DIN-Schienenmontage

Pin-Belegung (ATmega328PB)

PinPortRichtungFunktion
PD2D2OUTPUTLüfter Ein/Aus (via AO3400A MOSFET)
PD3D3INPUTBetriebssignal Durchlauferhitzer (via LM358)
PD4D4I/ODS18B20 1-Wire Datenleitung
PD5D5OUTPUTDRV8871 IN1 – Motor Auf
PD6D6OUTPUTDRV8871 IN2 – Motor Zu
PD7D7INPUTTaster – manuell Schieber Ein/Aus

Firmware

Zustandslogik

Die Hauptschlaufe läuft kontinuierlich mit einer Pause von 250 ms pro Zyklus.

Einschalten (SchieberOnOff = TRUE) wenn:
    GEon = 1  (Durchlauferhitzer läuft)
    OR  Temperatur > 40 °C
    OR  Taster aktiv

Ausschalten (SchieberOnOff = FALSE) wenn:
    GEon = 0  AND  Temperatur ≤ 40 °C
    AND  Taster nicht aktiv
  • Temperatur-Schwellwert: TempFan = 40 °C (konfigurierbar als Konstante im Quellcode)
  • Fehlertoleranz: Bei einem Lesefehler des DS18B20 (seCRCError, seNoSensor) bleibt der zuletzt gültige Temperaturwert (lastGoodTemp) erhalten.

Motor-Ansteuerung

Der DRV8871-Motortreiber wird über zwei Ausgänge angesteuert:

BefehlIN1IN2Lüfter
Schieber AUFHIGHLOWEIN
Schieber ZULOWHIGHAUS

Zwischen den Schaltzuständen werden kurze Mikrosekunden-Pausen eingehalten, um Stromspitzen zu vermeiden.

DS18B20 – eigene 1-Wire-Implementierung

Der Sensor wird über direktes Port-Bit-Banging (DDRD / PORTD / PIND) ohne externe Bibliothek angesprochen. Die Implementierung beinhaltet:

  • 1-Wire Reset mit Präsenzsignal-Erkennung
  • Bit-genaues Read/Write mit µs-Timing
  • CRC8 Dallas-Prüfsumme zur Datenvalidierung
  • Fehlerbehandlung über den Typ TSensorError
FehlercodeBedeutung
seNoneKein Fehler
seNoSensorSensor nicht erkannt (kein Präsenzsignal)
seCRCErrorPrüfsummenfehler
seOutOfRangeTemperaturwert ausserhalb −55…+125 °C

Projektstruktur

FAN-Control-mit-ATMEL-328P-programmiert-in-AVRPascal/
├── Hardware/
│   ├── 700000008-SCHIEBER-V3.kicad_sch   # Schaltplan
│   ├── 700000008-SCHIEBER-V3.kicad_pcb   # PCB-Layout
│   └── 700000008-SCHIEBER-V3.kicad_pro   # KiCad Projektdatei
│
├── Software/
│   ├── P_700000008_V3_A.pas              # Hauptprogramm
│   ├── DS18B20.pas                       # 1-Wire Sensor Unit
│   ├── testDS18B20.pas                   # 1-Wire Sensor Test mit Ausgabe an UART
│   ├── P_700000008_V3_A.hex              # Flash-fertige Hex-Datei
│   ├── P_700000008_V3_A.elf              # ELF Debug-Binary
│   └── P_700000008_V3_A.bin              # Rohes Binärimage
│
├── images/
│   ├── render.jpg                        # PCB 3D-Render
│   └── bernicSeries350.jpg               # Gehäuse DIN-Schiene
│
├── LICENSE
└── readme.md

Voraussetzungen

Hardware

  • Zielhardware mit ATmega328PB
  • 24 V DC Versorgung
  • DS18B20 Temperatursensor
  • Abgasschieber mit geeignetem DC-Motor
  • Lüfter
  • Programmer: USBasp oder kompatibel, neu auch Arduino als ISP

Software

Build & Flash

Flashen (fertige Hex-Datei)

avrdude -c usbasp -p m328pb -P usb -U flash:w:Software/P_700000008_V3_A.hex

Hinweis: Den Partcode -p m328pb verwenden (nicht m328p), da es sich um den ATmega328PB handelt.

Fuse-Konfiguration

Die Fuse-Bits müssen zur Taktquelle passen:

FuseEmpfehlung
CKSELExterner 16 MHz Quarz
CKDIV8Deaktiviert (kein Vorteiler)
BODLEVELJe nach Anwendung (empfohlen: 2,7 V)

Beispiel (externer 16 MHz Quarz, BOD 2,7 V):

avrdude -c usbasp -p m328pb -P usb \
  -U lfuse:w:0xFF:m \
  -U hfuse:w:0xD9:m \
  -U efuse:w:0xFF:m

⚠️ Achtung: Falsche Fuse-Einstellungen können den Mikrocontroller unbrauchbar machen. Vor dem Setzen unbedingt mit dem Datenblatt abgleichen.

Projektstatus

BereichStatus
Hardware✅ Entwickelt
Firmware✅ Lauffähig
Taktquelle✅ Externer 16 MHz Quarz getestet
Flash-Prozess✅ USBasp / avrdude erfolgreich
Feldbetrieb🔄 In Erprobung

Mögliche Erweiterungen

  • Serielle Diagnoseausgabe (UART) für Temperatur- und Zustandslogs
  • Fehlererkennung mit Status-LED oder Summerton
  • Parametrierung von TempFan über Taster oder EEPROM
  • Watchdog-Timer für erhöhte Ausfallsicherheit
  • Stückliste (BOM) als PDF oder CSV

Sicherheitshinweis

Dieses Projekt ist kein zertifiziertes Sicherheitsprodukt und kein freigegebenes Seriengerät. Der Einsatz erfolgt ausschliesslich auf eigene Verantwortung – insbesondere bei Anwendungen mit Gasgeräten, Wärmequellen oder beweglichen Aktoren. Vor dem Praxiseinsatz müssen alle elektrischen, thermischen und sicherheitstechnischen Aspekte eigenständig geprüft werden.

Quellcode & Lizenz

Schaltplan, PCB-Layout und Firmware sind unter der MIT License auf Codeberg verfügbar: FAN-Control auf Codeberg


Dateien zum Projekt

Zeichnung und Fräsdaten zur privaten Verwendung. Für eine gewerbliche Nutzung bitte kurz anfragen.