{"id":61,"date":"2026-09-22T15:39:40","date_gmt":"2026-09-22T13:39:40","guid":{"rendered":"https:\/\/cb-blog.ch\/?p=61"},"modified":"2026-10-22T15:57:35","modified_gmt":"2026-10-22T13:57:35","slug":"fan-control-luefter-und-schiebersteuerung","status":"publish","type":"post","link":"https:\/\/cb-blog.ch\/?p=61","title":{"rendered":"FAN-Control \u2013 L\u00fcfter- und Schiebersteuerung"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Kompakte Embedded-Steuerung f\u00fcr L\u00fcfter und Abgasschieber eines Gasdurchlauferhitzers \u2013 mit eigener Hardware in <strong>KiCad<\/strong> und Firmware in <strong>AVRPascal<\/strong> auf einem <strong>ATmega328PB<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00dcberblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>FAN-Control<\/strong> \u00fcberwacht den Betriebszustand eines Gasdurchlauferhitzers und steuert automatisch:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>den <strong>Abgasschieber<\/strong> (motorisch, via H-Br\u00fccke) \u2013 \u00f6ffnet beim Einschalten des Ger\u00e4ts<\/li>\n\n\n\n<li>den <strong>L\u00fcfter<\/strong> \u2013 schaltet temperaturabh\u00e4ngig zu<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Die Steuerung erkennt den Ger\u00e4tezustand \u00fcber ein <strong>Analogsignal<\/strong>, misst die <strong>Abgastemperatur<\/strong> mit einem DS18B20-Sensor und reagiert zus\u00e4tzlich auf einen <strong>manuellen Taster<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Systemarchitektur<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>24 V DC\n   \u2502\n   \u25bc\nSpannungsaufbereitung\n   \u2502\n   \u25bc\nATmega328PB (PD2\u2013PD7)\n   \u251c\u2500\u2500 PD3 \u25c4\u2500\u2500 LM358 (Analogsignal Ger\u00e4tezustand)\n   \u251c\u2500\u2500 PD4 \u25c4\u2500\u2500 DS18B20 (1-Wire Temperatursensor)\n   \u251c\u2500\u2500 PD7 \u25c4\u2500\u2500 Taster (manuell Ein\/Aus)\n   \u251c\u2500\u2500 PD5\/PD6 \u2500\u2500\u25ba DRV8871DDA (H-Br\u00fccke \u2192 Schieber-Motor)\n   \u2514\u2500\u2500 PD2 \u2500\u2500\u25ba AO3400A (MOSFET \u2192 L\u00fcfter)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Hauptkomponenten<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Bauteil<\/th><th>Bezeichnung<\/th><th>Funktion<\/th><\/tr><\/thead><tbody><tr><td>Mikrocontroller<\/td><td>ATmega328PB<\/td><td>Zentrale Steuerlogik<\/td><\/tr><tr><td>Temperatursensor<\/td><td>DS18B20<\/td><td>1-Wire Temperaturmessung<\/td><\/tr><tr><td>Motortreiber<\/td><td>DRV8871DDA<\/td><td>H-Br\u00fccke f\u00fcr Schieber-Motor<\/td><\/tr><tr><td>L\u00fcftertreiber<\/td><td>AO3400A<\/td><td>N-Kanal MOSFET zum Schalten des L\u00fcfters<\/td><\/tr><tr><td>Signalaufbereitung<\/td><td>LM358<\/td><td>Operationsverst\u00e4rker f\u00fcr Ger\u00e4te-Signal<\/td><\/tr><tr><td>Versorgung<\/td><td>24 V DC<\/td><td>Externe Versorgungsspannung<\/td><\/tr><tr><td>Geh\u00e4use<\/td><td>Bernic Series 350<\/td><td>DIN-Schienenmontage<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Geh\u00e4use<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"371\" height=\"277\" src=\"https:\/\/cb-blog.ch\/wp-content\/uploads\/2026\/10\/bernicSeries350.jpg\" alt=\"\" class=\"wp-image-65\" srcset=\"https:\/\/cb-blog.ch\/wp-content\/uploads\/2026\/10\/bernicSeries350.jpg 371w, https:\/\/cb-blog.ch\/wp-content\/uploads\/2026\/10\/bernicSeries350-300x224.jpg 300w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><figcaption class=\"wp-element-caption\">Bernic Series 350 \u2013 Geh\u00e4use f\u00fcr DIN-Schienenmontage<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Pin-Belegung (ATmega328PB)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Pin<\/th><th>Port<\/th><th>Richtung<\/th><th>Funktion<\/th><\/tr><\/thead><tbody><tr><td>PD2<\/td><td>D2<\/td><td>OUTPUT<\/td><td>L\u00fcfter Ein\/Aus (via AO3400A MOSFET)<\/td><\/tr><tr><td>PD3<\/td><td>D3<\/td><td>INPUT<\/td><td>Betriebssignal Durchlauferhitzer (via LM358)<\/td><\/tr><tr><td>PD4<\/td><td>D4<\/td><td>I\/O<\/td><td>DS18B20 1-Wire Datenleitung<\/td><\/tr><tr><td>PD5<\/td><td>D5<\/td><td>OUTPUT<\/td><td>DRV8871 IN1 \u2013 Motor Auf<\/td><\/tr><tr><td>PD6<\/td><td>D6<\/td><td>OUTPUT<\/td><td>DRV8871 IN2 \u2013 Motor Zu<\/td><\/tr><tr><td>PD7<\/td><td>D7<\/td><td>INPUT<\/td><td>Taster \u2013 manuell Schieber Ein\/Aus<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Firmware<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Zustandslogik<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Hauptschlaufe l\u00e4uft kontinuierlich mit einer Pause von <strong>250 ms<\/strong> pro Zyklus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Einschalten (SchieberOnOff = TRUE) wenn:\n    GEon = 1  (Durchlauferhitzer l\u00e4uft)\n    OR  Temperatur &gt; 40 \u00b0C\n    OR  Taster aktiv\n\nAusschalten (SchieberOnOff = FALSE) wenn:\n    GEon = 0  AND  Temperatur \u2264 40 \u00b0C\n    AND  Taster nicht aktiv<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Temperatur-Schwellwert:<\/strong> <code>TempFan = 40 \u00b0C<\/code> (konfigurierbar als Konstante im Quellcode)<\/li>\n\n\n\n<li><strong>Fehlertoleranz:<\/strong> Bei einem Lesefehler des DS18B20 (<code>seCRCError<\/code>, <code>seNoSensor<\/code>) bleibt der zuletzt g\u00fcltige Temperaturwert (<code>lastGoodTemp<\/code>) erhalten.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Motor-Ansteuerung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der DRV8871-Motortreiber wird \u00fcber zwei Ausg\u00e4nge angesteuert:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Befehl<\/th><th>IN1<\/th><th>IN2<\/th><th>L\u00fcfter<\/th><\/tr><\/thead><tbody><tr><td>Schieber AUF<\/td><td>HIGH<\/td><td>LOW<\/td><td>EIN<\/td><\/tr><tr><td>Schieber ZU<\/td><td>LOW<\/td><td>HIGH<\/td><td>AUS<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zwischen den Schaltzust\u00e4nden werden kurze Mikrosekunden-Pausen eingehalten, um Stromspitzen zu vermeiden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DS18B20 \u2013 eigene 1-Wire-Implementierung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Sensor wird \u00fcber <strong>direktes Port-Bit-Banging<\/strong> (DDRD \/ PORTD \/ PIND) ohne externe Bibliothek angesprochen. Die Implementierung beinhaltet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1-Wire Reset mit Pr\u00e4senzsignal-Erkennung<\/li>\n\n\n\n<li>Bit-genaues Read\/Write mit \u00b5s-Timing<\/li>\n\n\n\n<li><strong>CRC8 Dallas-Pr\u00fcfsumme<\/strong> zur Datenvalidierung<\/li>\n\n\n\n<li>Fehlerbehandlung \u00fcber den Typ <code>TSensorError<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Fehlercode<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td><code>seNone<\/code><\/td><td>Kein Fehler<\/td><\/tr><tr><td><code>seNoSensor<\/code><\/td><td>Sensor nicht erkannt (kein Pr\u00e4senzsignal)<\/td><\/tr><tr><td><code>seCRCError<\/code><\/td><td>Pr\u00fcfsummenfehler<\/td><\/tr><tr><td><code>seOutOfRange<\/code><\/td><td>Temperaturwert ausserhalb \u221255\u2026+125 \u00b0C<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Projektstruktur<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>FAN-Control-mit-ATMEL-328P-programmiert-in-AVRPascal\/\n\u251c\u2500\u2500 Hardware\/\n\u2502   \u251c\u2500\u2500 700000008-SCHIEBER-V3.kicad_sch   # Schaltplan\n\u2502   \u251c\u2500\u2500 700000008-SCHIEBER-V3.kicad_pcb   # PCB-Layout\n\u2502   \u2514\u2500\u2500 700000008-SCHIEBER-V3.kicad_pro   # KiCad Projektdatei\n\u2502\n\u251c\u2500\u2500 Software\/\n\u2502   \u251c\u2500\u2500 P_700000008_V3_A.pas              # Hauptprogramm\n\u2502   \u251c\u2500\u2500 DS18B20.pas                       # 1-Wire Sensor Unit\n\u2502   \u251c\u2500\u2500 testDS18B20.pas                   # 1-Wire Sensor Test mit Ausgabe an UART\n\u2502   \u251c\u2500\u2500 P_700000008_V3_A.hex              # Flash-fertige Hex-Datei\n\u2502   \u251c\u2500\u2500 P_700000008_V3_A.elf              # ELF Debug-Binary\n\u2502   \u2514\u2500\u2500 P_700000008_V3_A.bin              # Rohes Bin\u00e4rimage\n\u2502\n\u251c\u2500\u2500 images\/\n\u2502   \u251c\u2500\u2500 render.jpg                        # PCB 3D-Render\n\u2502   \u2514\u2500\u2500 bernicSeries350.jpg               # Geh\u00e4use DIN-Schiene\n\u2502\n\u251c\u2500\u2500 LICENSE\n\u2514\u2500\u2500 readme.md<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Voraussetzungen<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Hardware<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zielhardware mit <strong>ATmega328PB<\/strong><\/li>\n\n\n\n<li>24 V DC Versorgung<\/li>\n\n\n\n<li>DS18B20 Temperatursensor<\/li>\n\n\n\n<li>Abgasschieber mit geeignetem DC-Motor<\/li>\n\n\n\n<li>L\u00fcfter<\/li>\n\n\n\n<li>Programmer: <strong>USBasp<\/strong> oder kompatibel, neu auch Arduino als ISP<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Software<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.freepascal.org\/\" target=\"_blank\" rel=\"noopener\">AVRPascal \/ Free Pascal AVR Toolchain<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/avrdudes\/avrdude\" target=\"_blank\" rel=\"noopener\">avrdude<\/a> zum Flashen<\/li>\n\n\n\n<li><a href=\"https:\/\/www.kicad.org\/\" target=\"_blank\" rel=\"noopener\">KiCad<\/a> f\u00fcr \u00c4nderungen an der Hardware<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Build &amp; Flash<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Flashen (fertige Hex-Datei)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>avrdude -c usbasp -p m328pb -P usb -U flash:w:Software\/P_700000008_V3_A.hex<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hinweis:<\/strong> Den Partcode <code>-p m328pb<\/code> verwenden (nicht <code>m328p<\/code>), da es sich um den <strong>ATmega328PB<\/strong> handelt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fuse-Konfiguration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Fuse-Bits m\u00fcssen zur Taktquelle passen:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Fuse<\/th><th>Empfehlung<\/th><\/tr><\/thead><tbody><tr><td>CKSEL<\/td><td>Externer 16 MHz Quarz<\/td><\/tr><tr><td>CKDIV8<\/td><td>Deaktiviert (kein Vorteiler)<\/td><\/tr><tr><td>BODLEVEL<\/td><td>Je nach Anwendung (empfohlen: 2,7 V)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Beispiel (externer 16 MHz Quarz, BOD 2,7 V):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>avrdude -c usbasp -p m328pb -P usb \\\n  -U lfuse:w:0xFF:m \\\n  -U hfuse:w:0xD9:m \\\n  -U efuse:w:0xFF:m<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>Achtung:<\/strong> Falsche Fuse-Einstellungen k\u00f6nnen den Mikrocontroller unbrauchbar machen. Vor dem Setzen unbedingt mit dem Datenblatt abgleichen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Projektstatus<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Bereich<\/th><th>Status<\/th><\/tr><\/thead><tbody><tr><td>Hardware<\/td><td>\u2705 Entwickelt<\/td><\/tr><tr><td>Firmware<\/td><td>\u2705 Lauff\u00e4hig<\/td><\/tr><tr><td>Taktquelle<\/td><td>\u2705 Externer 16 MHz Quarz getestet<\/td><\/tr><tr><td>Flash-Prozess<\/td><td>\u2705 USBasp \/ avrdude erfolgreich<\/td><\/tr><tr><td>Feldbetrieb<\/td><td>\ud83d\udd04 In Erprobung<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00f6gliche Erweiterungen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Serielle Diagnoseausgabe (UART) f\u00fcr Temperatur- und Zustandslogs<\/li>\n\n\n\n<li>Fehlererkennung mit Status-LED oder Summerton<\/li>\n\n\n\n<li>Parametrierung von <code>TempFan<\/code> \u00fcber Taster oder EEPROM<\/li>\n\n\n\n<li>Watchdog-Timer f\u00fcr erh\u00f6hte Ausfallsicherheit<\/li>\n\n\n\n<li>St\u00fcckliste (BOM) als PDF oder CSV<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Sicherheitshinweis<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Dieses Projekt ist <strong>kein zertifiziertes Sicherheitsprodukt<\/strong> und <strong>kein freigegebenes Serienger\u00e4t<\/strong>. Der Einsatz erfolgt ausschliesslich auf eigene Verantwortung \u2013 insbesondere bei Anwendungen mit Gasger\u00e4ten, W\u00e4rmequellen oder beweglichen Aktoren. Vor dem Praxiseinsatz m\u00fcssen alle elektrischen, thermischen und sicherheitstechnischen Aspekte eigenst\u00e4ndig gepr\u00fcft werden.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Quellcode &amp; Lizenz<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Schaltplan, PCB-Layout und Firmware sind unter der <strong>MIT License<\/strong> auf Codeberg verf\u00fcgbar: <a href=\"https:\/\/codeberg.org\/staibisser\/Schieber-KICAD-AVRPASCAL\/src\/branch\/master\" target=\"_blank\" rel=\"noopener nofollow\">FAN-Control auf Codeberg<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div class=\"wp-block-group cb-downloads is-layout-flow wp-block-group-is-layout-flow\">\n<h2 class=\"wp-block-heading cb-downloads-title\">Dateien zum Projekt<\/h2>\n\n\n\n<div class=\"wp-block-file cb-file\"><span class=\"cb-dl-ext\">ZIP<\/span><a id=\"wp-block-file--media-3514d7ac-3aaa-4680-9ef5-63e739b4bdb2\" href=\"https:\/\/cb-blog.ch\/wp-content\/uploads\/2026\/09\/Schieber-KICAD-AVRPASCAL-master.zip\">Schieber-KICAD-AVRPASCAL-master<\/a><span class=\"cb-dl-meta\">ZIP \u00b7 3.2 MB<\/span><a href=\"https:\/\/cb-blog.ch\/wp-content\/uploads\/2026\/09\/Schieber-KICAD-AVRPASCAL-master.zip\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-3514d7ac-3aaa-4680-9ef5-63e739b4bdb2\">Download Projekt<\/a><\/div>\n\n\n\n\n\n<p class=\"cb-downloads-note wp-block-paragraph\">Zeichnung und Fr\u00e4sdaten zur privaten Verwendung. F\u00fcr eine gewerbliche Nutzung bitte kurz anfragen.<\/p>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kompakte Embedded-Steuerung f\u00fcr L\u00fcfter und Abgasschieber eines Gasdurchlauferhitzers \u2013 mit eigener Hardware in KiCad und Firmware in AVRPascal auf einem ATmega328PB. \u00dcberblick FAN-Control \u00fcberwacht den Betriebszustand eines Gasdurchlauferhitzers&hellip;<\/p>\n","protected":false},"author":1,"featured_media":66,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,9],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hardware","category-software"],"_links":{"self":[{"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=61"}],"version-history":[{"count":7,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":77,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions\/77"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=\/wp\/v2\/media\/66"}],"wp:attachment":[{"href":"https:\/\/cb-blog.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cb-blog.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}