<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=22&amp;t=22382&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-07-05T11:58:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=22382&amp;mode</id>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-07-05T11:58:22+01:00</updated>
<published>2019-07-05T11:58:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220245#p220245</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220245#p220245"/>
<title type="html"><![CDATA[Re: Sterownik ukladu chlodzenia na bazie czujnika produkcji ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220245#p220245"><![CDATA[
Są sterowane każda osobno -podajesz zasilanie tylko na konkretna cewkę a 2 koniec zwarty do masy na stałe czy pół sekwencja - iskra idzie parami na dwa cylindry i do modułu doprowadzasz stałe zasilanie i wybierasz która para ma zadziałać ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 5 lip 2019, o 11:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-07-05T11:31:00+01:00</updated>
<published>2019-07-05T11:31:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220243#p220243</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220243#p220243"/>
<title type="html"><![CDATA[Re: Sterownik ukladu chlodzenia na bazie czujnika produkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220243#p220243"><![CDATA[
Wrzuć foto i jakieś numery jak są. Zobaczymy co to.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Jak nie działa pompa wody, to wentylatorem chodzącym po wyłączeniu silnika ostudzisz tylko chłodnicę. Dla silnika nie ma to żadnego znaczenia.<br />A nawet jakbyś dał elektryczną pompę, to termostat przełączy ci obieg odcinając chłodnicę.<br /></div><br />Weź pod uwagę ze termostat jest w tym silniku jest na szczycie kolektora ssącego - ciepły płyn zawsze będzie szedł do góry a zimny na dół. Wiec schładzając sama chłodnice masz jeszcze kilka minut zanim termostat się zamknie(silnik dalej przecież oddaje ciepło) co wystarczy aby obiegiem grawitacyjnym wystudzić go o kilka stopni. Akurat w tym silniku nie jest to aż tak istotne(w końcu to żeliwo) ale są silniki (np ford dohc 2.0/2.3 sierra/scorpio czy choćby 1.4 rover znany z poloneza) gdzie jest to dość istotne i zaniedbanie tego może wpływać na awarie uszczelki pod głowicą. A skoro ma tego pilnować mikroprocesor to czemu tego nie wykorzystać<br /><br /><div class="quotetitle">mpo napisał(a):</div><div class="quotecontent"><br />czy w oryginalną kopułkę powstawiam czujniki halla.<br /></div><br />Zobacz czy nie ma gotowych rozdzielaczy z takim czujnikiem. Problem jest tylko taki ze zapewne trzeba to ściągać  od Wuja Sama za ciężkie $<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 5 lip 2019, o 11:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-07-05T09:36:41+01:00</updated>
<published>2019-07-05T09:36:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220238#p220238</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220238#p220238"/>
<title type="html"><![CDATA[Re: Sterownik ukladu chlodzenia na bazie czujnika produkcji]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220238#p220238"><![CDATA[
Wiem ze na termistorze nie uzyska się precyzyjnych pomiarów w całym zakresie temperatur ze względu na jego charakterystykę, a silnikowi jest obojętne czy wentylator załączy się przy 86 czy 87 stopniach. Nie mniej w wytycznych projektowych przyjąłem wymagana rozdzielczość  pomiaru 1 stopnia. Co do diod prostowniczych to jest to prymitywne rozwiązanie ale skuteczne - przetwornice trzeba kupić albo zbudować a ja budowałem z tego co miałem na stanie - dlatego wykorzystałem tez gotowy panel z wyświetlaczami 7 segmentowymi i MP4020 których mam sporo- od czegoś w końcu trzeba zacząć a jak działa to można modyfikować. Zakłóceniami transmisji się nie przejmuje - będę podpinał przy wyłączonym silniku gdyż tak jak pisałem służy wyłącznie do ustawień, ewentualnie na tej podstawie np mogę sprawdzić sobie fabryczny wskaźnik temperatury na desce rozdzielczej. Na ta chwile na pewno dojdzie jeszcze jedna modyfikacja- jedno wyjście sterujące zostanie poświęcone na podtrzymanie zasilania sterownika po wyłączeniu zapłonu - po zgaszeniu auta dobrze żeby silnik był jeszcze chłodzony aż temperatura nie zejdzie lub przez ustalony czas w zależności co nastąpi szybciej. Wtedy tez dokonam pozostałych przeróbek programowych -podciągnięcie nie używanych pinów do VCC i powalczę z trybem uśpienia. Sprawdzę tez i dokonam obliczeń dla napięcia odniesienia 2,56V czy ma to sens i wyjdą jakieś sensowne pomiary. Masa dla czujnika temperatury jest oczywiście brana ze sterownika a nie z silnika czy nadwozia. Konstruktywna krytyka i pomysły zawsze mile widziane  <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" /> .<br /><br /><br />Zapłon w tym small blocku robisz na tego typu cewkach GM ? Zdjęcia poglądowe oczywiście, potrzebne 2 szt po jedna na stronę<br /><!-- m --><a class="postlink" href="http://opelczesci.com.pl/pl/p/CEWKA-ZAPLONOWA-ASTRA-F-VECTRA-OMEGA-2.0-8V/562" >http://opelczesci.com.pl/pl/p/CEWKA-ZAP ... 2.0-8V/562</a><!-- m --><br /><!-- m --><a class="postlink" href="http://www.partner-autoczesci.pl/produkt/113.html" >http://www.partner-autoczesci.pl/produkt/113.html</a><!-- m --><br />i do tego sterownik, czy raczej może idziesz w stronę gotowego fordowskiego EDIS 8  który dość fajnie się steruje? Czy jeszcze coś innego ? Ja akurat ze względu na dostępność i posiadanie części postawiłbym na cewki produkcji bmw o numerze 12 13 1 247 281 gdyż tez chętnie pozbył się tego rozdzielacza zapłonu z mopara. Może kiedyś jak już będzie to jeździło i będzie jeszcze czas i chęci.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 5 lip 2019, o 09:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-07-03T22:31:33+01:00</updated>
<published>2019-07-03T22:31:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220199#p220199</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220199#p220199"/>
<title type="html"><![CDATA[Sterownik ukladu chlodzenia na bazie czujnika produkcji BMW]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22382&amp;p=220199#p220199"><![CDATA[
<a href="https://obrazkiforum.atnel.pl/2545/32789e700938e070a11cfa7bfd9f391c.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/32789e700938e070a11cfa7bfd9f391c.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/197e03b485d66a54f7b2c84b1d399462.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/197e03b485d66a54f7b2c84b1d399462.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/98a9383d535a557fd1fbd7c6f9588936.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/98a9383d535a557fd1fbd7c6f9588936.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/6bde38e993760527da4acede4c6d5069.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/6bde38e993760527da4acede4c6d5069.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/259cb4d5bd542a0f9b1e9713bc135ac9.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/259cb4d5bd542a0f9b1e9713bc135ac9.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/42433a49b7ebed16624f2ceaed3639b3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/42433a49b7ebed16624f2ceaed3639b3.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/177bba60326ba6466142758b4c42f090.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/177bba60326ba6466142758b4c42f090.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/0f0ce2b82045896d85a65bf219778d07.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/0f0ce2b82045896d85a65bf219778d07.jpg" alt="Obrazek" /></a><br /><a href="https://obrazkiforum.atnel.pl/2545/b8d8f6a3482274cb3aaec5683be9005a.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/b8d8f6a3482274cb3aaec5683be9005a.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/fdde1552a7fb8f945c85377bd204c694.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/fdde1552a7fb8f945c85377bd204c694.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/201e368732fe7ace61e94d2a86a0e242.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/201e368732fe7ace61e94d2a86a0e242.jpg" alt="Obrazek" /></a><br /><br />Witam<br />Dziś przedstawiam projekt sterownika układu chłodzenia na bazie termistora produkcji BMW o numerze 13 62 1 703 993. Najpierw trochę danych o samym czujniku i jego zastosowaniu gdyż pewnie wiele osób zastanawia się czemu konkretnie akurat ten.<br />Jest to podwójny czujnik temperatury zawierający 2 niezależne czujniki typu NTC o rezystancji odpowiednio ok 2,2K i 6,5K w 20 stopniach. Pierwszy z nich przekazuje temperaturę do komputera sterującego praca silnika a drugi do zegara na desce rozdzielczej. We wcześniejszych wersjach modelu BMW E36 (oraz innych modelach produkowanych w tym samym czasie (tj do około roku 2000) stosowano dwa osobne czujniki  czyli termistor 2,2K w kolorze niebieskim o numerze części 13 62 1 709 966 oraz termistor 6,5K w kolorze czarnym o numerze  części 12 62 1 710 535. Jedynym chyba wyjątkiem jest bardzo rzadka wersja 323TI której wyprodukowano ok 15,5 tys egzemplarzy pod sam koniec produkcji modelu.<br />Projekt ten powstał na potrzeby swapu(wymiany) silnika o oznaczeniu kodowym M43B18(1.8L) na small block V8 o pojemności 318 cid tj 5.2L produkcji Chryslera/Jeepa do nadwozia wspomnianego BMW. Podczas instalowania silnika okazało się iż fabryczny wentylator wiskotyczny nie wejdzie(zarówno BMW  jak i Jeep maja wentylatory mechaniczne a nie elektryczne jak większość samochodów) i należało użyć wentylatora elektrycznego który jednak musi być jakoś sterowany. Dodatkowo do dyspozycji była tylko 1 dziura w kolektorze ssącym  a potrzebny był jeszcze  przecież czujnik do zegarów w kabinie aby kontrolować temperaturę. Można oczywiście zastosować jakiś czujnik na wężu od chłodnicy i tym podobne protezy ale za pomocą 1 czujnika można wysterować tylko 1 wentylator oraz nie ma możliwości konfiguracji temperatury - są to czujniki  a dokładniej termostaty ON-OFF ustawione na konkretne temperatury. Fabryczna chłodnica nie ma miejsca na instalacje dodatkowych czujników gdyż nie ma takiej potrzeby w wykonaniu seryjnym. Tutaj sytuacja jest inna - nie możemy zastosować mechanicznego wentylatora gdyż będzie się obracał w chłodnicy a do podłączania i wysterowania elektrycznego zarówno silnik jak i komponenty nadwozia nie są przystosowane(chyba ze mowa o wersji z klimatyzacja ale te wentylatory tez  sterowane z komputera silnika bmw który to usuwamy wraz z silnikiem). O samym silniku można przeczytać tutaj :<br /><!-- m --><a class="postlink" href="http://dodgeram.org/tech/gas/specs/5_2v8.htm" >http://dodgeram.org/tech/gas/specs/5_2v8.htm</a><!-- m --><br />silnik ma jeszcze trochę większego brata o pojemności 5.9L i wielkiego brata całej rodziny magnum czyli V10 o pojemności 8.0L znanego z  Dodge Vipera/Dodge Rama <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Gdyby ktoś się zastanawiał po co to wszystko :<br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=50wJFv7p8p0" >https://www.youtube.com/watch?v=50wJFv7p8p0</a><!-- m --><br />zło, zło, samo zło. Ludzie kiedy dodajesz gazu zabierają w popłochu dzieci z ulicy, kury przestają się nieść, krowy dawać mleko a gimbaza zapomina co to fejsbuk i telefon dotykowy.<br />Tutaj fabryczna wersja e36 V8 (z innym silnikiem niż mój) jak jest ktoś ciekawy - bardzo rzadka wersja - wyprodukowano zaledwie 221szt !<br /><!-- m --><a class="postlink" href="http://www.gieldaklasykow.pl/alpina-b8-4-6-1995-skierniewice/" >http://www.gieldaklasykow.pl/alpina-b8- ... erniewice/</a><!-- m --><br /><br />Opracowałem wiec sterownik na bazie atmega 8 do w/w projektu który wykorzystuje zbędny termistor 2,2K w czujniku  13 62 1 703 993 do kontroli chłodzenia  silnika i posiada 4 niezależne wyjścia typu otwarty kolektor z programowalna temperatura. Dzięki temu można wysterować np 3 wentylatory oraz np lampkę kontrolna na desce rozdzielczej sygnalizująca przekroczenie ustawionej temperatury. Kanały działają  w pełni niezależnie od siebie. Dodatkowo istniej możliwość (po zmianie oprogramowania i dołożeniu kilku elementów) wysterowania wentylatorów elektrycznych z nowszych modeli BMW(npE46) które są już sterowane płynnie tj za pomocą sygnału PWM. Można również użyć innych czujników NTC  niż opisany po zmianie funkcji wyliczającej temperaturę i ewentualnej korekcie opornika w dzielniku oporności. Tyle tytułem wstępu po co to komu i do czego <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wszystko składa się z 3 elementów <br />1)Płytki zasilania  oraz dzielników napięciowych wykorzystywanych przy dopasowaniu sygnałów sterujących jeep-bmw(nie wchodzą w skład tego modułu)<br />2) Właściwego sterownika <br />3) Panela zewnętrznego do konfiguracji urządzenia zbudowanego na bazie panelu frontowego z dekodera polsatu Echostar 717 z którego wykorzystuje 3 przyciski i 4 segmentowy 7 znakowy wyświetlacz LED. Moduł ten działa na bazie attiny 2313.<br />Dwa pierwsze moduły są dopasowane do zabudowania w fabrycznej osłonie przewodów instalacji silnikowej  produkcji BMW. Było tam sporo miejsca a nie miałem pomysłu jak i gdzie to zabudować inaczej. Wiązkę elektryczna i tak musiałem &quot;uszyc&quot;  od nowa na bazie instalacji bmw i tej wyciętej z jeepa wiec od razu wykorzystałem okazje i połączyłem to w całość. Urządzenie do konfiguracji jest w osobnej obudowie gdyż nie jest potrzebne do normalnej pracy jedynie do konfiguracji i podglądu.<br /><br />Od strony elektrycznej pierwsza płytka zapewnia wstępne filtrowanie napięcia z instalacji oraz obniżenie tego napięcia za pomocą diod prostowniczych do około 8 V aby zmniejszyć grzanie 7805. Sterownik na bazie atmegi za pomocą transoptorów steruje wejściami układu MP4020(4 darlingtony mocy). Układ pomiarowy składa się z termistora  i opornika 326R(dzielnik napięcia) oraz tranzystora tez sterowanego przez optoizolator. Okazało się bowiem ze przy tak dużych zmianach oporności (około 18K przy minus 20 do około 100R w 130 stopniach)aby otrzymać sensowne wyniki  w interesującym mnie zakresie pracy 20-115 stopni trzeba iść na kompromis - albo duża wartość oporności i mało precyzyjne pomiary albo mala wartość która zwiększa precyzje pomiaru ale powoduje znowu przepływ większego prądu przez termoelement, jego podgrzanie i  w konsekwencji zafałszowanie wyniku. Głównym ograniczeniem jest tutaj niskie napięcie 5V którym zasilamy czujnik. Postanowiłem to obejść za pomocą tranzystora - podaje on napięcie na termistor po chwili dokonuje się pomiar i odcinamy zasilanie aby go nie potrzebnie nie nagrzewać. W realu okazało się to nie potrzebne, nie mniej w celu zwiększenia dokładności pomiaru można to robić podobnie jak odcinać na czas pomiaru transmisje I2C. Wartość z dzielnika napięciowego która mierzymy jest odseparowana za pomocą  LM358 od wejścia mikrokontrolera. Całość popychana kwarcem o częstotliwości 4433619 - taki akurat miałem. Sam panel konfiguracyjny jest  podłączony za pomocą gniazda typu DB9 i komunikuje się za pomocą właśnie TWI. Użyłem fabrycznego oprogramowania  sterującego wyświetlaczem do którego &quot;dorobiłem&quot; dodatkowe znaki liter do wyświetlenia sprawdzając wszystkie możliwe 255 kombinacji. Przyciski działają tradycyjnie poprzez zwarcie do masy. Sam panel z dekodera wymagał sporej ingerencji przy pakowaniu go w obudowę - szlifowanie o ok 2mm na wysokość, wlutowania wyższych przycisków, usunięcia oryginalnego kabla, odbiornika podczerwieni, podwójnej diody led i 1 kondensatora oraz przeniesienia 2 innych na druga stronę. 2 oporniki do linii komunikacyjnych są w obudowie na dodatkowej płytce z bo na pcb sterownika nie było już miejsca za bardzo.<br /><br />Od strony programowej sterownik działa na bazie zmodyfikowanego menu z  mojego wcześniejszego projektu (zegarka z dekodera). Sterowaniem  zależnościami czasowymi zajmuje się timer 0 w trybie licznika. Za każdym obiegiem pętli programowej sprawdzane są flagi  oraz fakt wciśnięcia klawisza i przejście do menu.<br />Po włączeniu zasilania sterownik odczytuje z eepromu zaprogramowane nastawy i zaczyna pomiar temperatury. Pomiar jest wykonywany kilka razy na sekundę. Następnie na podstawie wartości ADC jest obliczana temperatura już w stopniach a po 15 pomiarach jest wyciągana średnia która następnie jest porównywana z zapisanymi wartościami i w zależności od jej wartości są sterowane wyjścia. Dodatkowo wprowadzona została 2 stopniowa histereza. Po wpięciu panela jest na nim wyświetlana aktualna wartość temperatury w formacie dwie cyfry znak stopnia i C. Przy liczbach większych niż 99 znak stopnia znika. Wciśniecie przycisku 2 pokazuje stan wyjść sterujących w formacie zer lub jedynek np 1000 oznacza aktywne wyjście 1 a 1010 aktywne 1 i 3 itd. Wciśniecie przycisku 3 pokazuje aktualna wartość ADC  w formacie 0xxx.<br /> Wciśniecie pierwszego przycisku wyświetla napis menu i  następuje przejście w tryb ustawień - pokazuje się 1020 - wyjście 1 i możemy przyciskami +/- ustawić temperaturę która powoduje aktywacje wyjścia. Możliwe nastawy 0 lub zakres 20-101stopni. Po ustawieniu wciskamy znowu pierwszy klawisz i pokazuje się 2020 itd aż do 4. Jeżeli ustawimy 0 stopni kanał jest nie aktywny, a w widoku aktywnych kanałów jest kreska (zamiast 0 lub 1). Potem pokazuje się napis ON lub OFF -jest to opcja uruchomienia specjalnego trybu bezpiecznego chłodzenia - jeżeli układ wykryje uszkodzenie w obwodzie czujnika pomiarowego tzn przerwę lub zwarcie czyli wartości wyjdą po za zakresy domyślne na dłużej niż 3 sekundy  automatycznie aktywuje WSZYSTKIE wyjścia( w tym te dezaktywowane) w celu ochrony silnika przed przegrzaniem. Na ten czas jest wyświetlany na wyświetlaczu komunikat cool fail. Po &quot;powrocie&quot; czujnika i 3 sekundach poprawnych odczytów wróci do normalnej pracy i aktywuje wyjścia w oparciu o aktualną temperaturę. Po kolejnym wciśnięciu przycisku pokazuje się END i układ zapisuje dane do eepromu i rozpoczyna normalna prace. <br />Jest to pierwsza wersja tego urządzenia. Z tym ze jeżeli sprawdzi się po odpaleniu silnika to zostaje gdyż ciężko przewidzieć na obecna chwile jak będzie to pracowało w środowisku pełnym zakłóceń( rozdzielacz zapłonu jest mechaniczny do tego dochodzi prostowanie prądu na diodach w alternatorze) oraz wysokiej i niskiej temperatury - pod maska może być około 80-90 stopni ponieważ żeliwne silniki grzeją się jak reaktory atomowe;) Jeżeli  okaże ze będą problemy to kolejna wersja zostanie zainstalowana w kabinie bądź obok komputera sterującego w specjalnej fabrycznej kieszeni. Na pewno będzie już wyposażona w  lepsze odniesienie napięcia pomiarowego na TL431 i zapewne LCD. Timer 2 jest zostawiony do wersji przyszłościowych i sterowania PWM gdyby była taka potrzeba. Wrzuciłem również kilka zdjęć ze swapu dla ewentualnie zainteresowanych montażem amerykańskiej technologi w niemieckim nadwoziu. Generalnie jest to dopiero w jakiś 50 % zrobione jeżeli chodzi o mechanikę ale projekt pomału drobnymi kroczkami idzie na przód gdyż problemów takich jak budowa sterownika jest jeszcze kilka...<br /><br />[syntax=&quot;c&quot;]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;I2C/I2C.h&quot;<br /><br />#define OUT1 (1&lt;&lt;PD0) //definicje wyjsc sterujacych MP4020<br />#define OUT2 (1&lt;&lt;PD1)<br />#define OUT3 (1&lt;&lt;PD3)<br />#define OUT4 (1&lt;&lt;PD2)<br />#define KEY1 (1&lt;&lt;PB0) //definicje klawiszy<br />#define KEY2 (1&lt;&lt;PD6)<br />#define KEY3 (1&lt;&lt;PD7)<br />#define kanal_pomiarowy 3 // pomiar na wejsciu 3 czyli pinie PC3<br />#define NTC (1&lt;&lt;PB1)   // definicje sterowania czujnika NTC za pomoca tranzystora<br />#define pomiar_on    PORTB |=  NTC<br />#define pomiar_off   PORTB &amp;=~(NTC)<br /><br />uint8_t alarm1,alarm2,alarm3,alarm4 ,cool_fail; //zmienne przechowuj¹ce temp alarmu i aktywacji wejsc<br />uint8_t EEMEM e_alarm1, e_alarm2, e_alarm3,e_alarm4, e_cool_fail;//jw eeprom<br />volatile uint8_t flag_10_ms ;//flagi 10ms<br />volatile uint16_t Timer1, Timer2 ;<br />volatile uint8_t global=0  ;<br />volatile uint8_t cy1,cy2,cy3,cy4 ;     //zmienne do wyswietlania<br />volatile uint8_t  KEYA, KEYB, KEYC ;   //ZMIENNE WCISMIECIA KLAWISZA<br />uint8_t key1_lock, key2_lock, key3_lock ;<br />const uint8_t cyfry_progmem[] PROGMEM ={<br />0x3F, 0x09, 0x6E, 0x6D, 0x59, 0x75, 0x77, 0x29, 0x7F, 0x7D, 0x00,<br />//0    1    2     3      4     5     6     7     8     9   10/nic<br />0xBB,  0x76, 0xC3, 0x9F, 0xC2, 0xC0,   0xC6, 0xF8,    0xFB, 0xF2, 0xCF, 0x96   };<br />// M   E     n     U     r     Kreska   C    stopien  A     F      d    L<br />// 11  12    13    14    15    16 ?     17    18      19    20   21    22<br />                                 // dodatkowe znaki od 11 w gore<br />uint8_t wyniki_pomiaru[15];   // tablica przechowujaca wyniki i wyliczajaca srednia z 15 pomiarow<br />uint8_t liczba , temperatura;<br />uint16_t suma ;<br />void timer0_init(void);<br />uint8_t temperatura_set( uint8_t dana);<br />void wyjscia_procesora_init(void);<br />void OUT_SET(void);<br />void pokaz_dane(uint8_t A, uint8_t B, uint8_t C, uint8_t D);<br />void klawisz_wcisniety (uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void));<br />void funkcja1 (void);<br />void funkcja2 (void);<br />void funkcja3 (void);<br />void pomiat_adc_init(void);<br />uint16_t pomiar_adc(void);<br />uint8_t temperatura_konwersja(uint16_t adc);<br />void cool_fail_on(void);<br /><br />int main(void)<br />{<br />pomiat_adc_init() ;        // inicjalizacja pomiaru napiecia z dzielnika rezystorowego<br />wyjscia_procesora_init() ; // ustawienie wejscia-wyjscia pinów procesora<br />sei() ;                   // zezwolenie na przerwania<br />timer0_init() ;          //inicjalizacja timera 0 do pracy tryb normal co 10ms<br />i2cSetBitrate(50) ;      //ustawienie predkosci i2c<br />pokaz_dane(11,11,11,11) ; // wyczyszczenie ekranu<br />pomiar_on ;  //testowe zalaczenie pomiaru<br />eeprom_read_block(&amp;alarm1, &amp;e_alarm1, sizeof(alarm1)); //odczyt wartosci zapamietanych w eeprom<br />eeprom_read_block(&amp;alarm2, &amp;e_alarm2, sizeof(alarm2));<br />eeprom_read_block(&amp;alarm3, &amp;e_alarm3, sizeof(alarm3));<br />eeprom_read_block(&amp;alarm4, &amp;e_alarm4, sizeof(alarm4));<br />eeprom_read_block(&amp;cool_fail, &amp;e_cool_fail, sizeof(cool_fail));<br />if(cool_fail==0xFF)cool_fail=0;// jezeli jest 0 to z eepromu odczyta 0XFF;<br /><br />while(1)<br />{<br />klawisz_wcisniety (&amp;key1_lock, &amp;PINB, KEY1, funkcja1 ); // dodaje 1 do zmiennej KEYA<br />klawisz_wcisniety (&amp;key2_lock, &amp;PIND, KEY2, funkcja2 ); //dodaje 1 do zmiennej KEYB<br />klawisz_wcisniety (&amp;key3_lock, &amp;PIND, KEY3, funkcja3 ); //dodaje 1 do zmiennej KEYC<br /><br />if (!global)   // global rowny 0 normalna praca sterownika<br />{<br />if (global==0 &amp;&amp;(KEYB))<br />   {<br />   global=10;<br />pokaz_dane((PORTD&amp;OUT1)? 1:(alarm1)?0:16, (PORTD&amp;OUT2)? 1:(alarm2)?0:16, (PORTD&amp;OUT3)? 1:(alarm3)?0:16, (PORTD&amp;OUT4)? 1:(alarm1)?0:16);<br />//pokazuje stan wyjsc MP4020 za pomoca sprawdzenia warunkowego i pokazuje czy jest on/off<br />//kiedy off sprawdza warunkiem czy alarm jest ustawiony ale nieaktywny wtedy 0<br />//jak wylaczony to pokazuje kreske<br /> KEYB=0;<br /> global=0;<br />_delay_ms(1000);<br />_delay_ms(1000);<br />_delay_ms(1000);<br /> }<br /><br />    if (global==0 &amp;&amp;(KEYC))<br /> {<br />     global=10;<br /> uint16_t data=ADCW;<br />     pokaz_dane(19,data/100,data/100,data %10);  //pokazuje ADC z indeksem A na poczatku<br /> KEYC=0;<br /> global=0;<br />_delay_ms(1000);<br />_delay_ms(1000);<br />_delay_ms(1000);<br />     }<br /><br /><br />// if (flag_10_ms) //jezeli jest flaga 10ms<br />           //      {<br />       //      flag_10_ms = 0;  //zerowanie flagi<br />            //     }<br /><br /> if (!Timer1) //co 150ms<br /> {<br />Timer1=15;<br />  wyniki_pomiaru[liczba]= temperatura_konwersja (pomiar_adc());<br />//za³adowanie wyniku pomiaru  do tablicy po konwersji adc na temperature w stopniach<br />  liczba++;  // indeks plus 1<br />  if (liczba &gt;13) liczba=0; //jezeli jest 15 zacznij napelniac od zera<br /><br />        if (!liczba)<br />          { // kiedy liczba równa 0 dokonaj konwersji temperatury co 16 pomiarow<br />    suma =wyniki_pomiaru[14]+wyniki_pomiaru[13]+wyniki_pomiaru[12]+wyniki_pomiaru[11]<br />    +wyniki_pomiaru[10]+wyniki_pomiaru[9]+wyniki_pomiaru[8]+wyniki_pomiaru[7]+wyniki_pomiaru[6]<br />    +wyniki_pomiaru[5]+wyniki_pomiaru[4]+wyniki_pomiaru[3]+wyniki_pomiaru[2]+wyniki_pomiaru[1]<br />    +wyniki_pomiaru[0]; // suma 16 pomiarów<br />    temperatura=suma/16 ; //temperatura = srednia artmetyczna z 16 wynikow<br />          }<br /> }<br /><br /> if (!Timer2)  // co 3 s<br /> {<br />  Timer2=300;<br />     if ((ADCW&gt;672 || ADCW&lt;95)&amp;&amp; (cool_fail))<br />        {<br />        cool_fail_on();<br />           //jezeli jest zwarcie lub przerwa i jest aktywowany tryb cool fail to uruchamia go<br />      // zerowanie tablicy aby nie pokazywalo po powrocie temperatury z kosmosu<br />       for(uint8_t i=0;i&lt;15;i++) wyniki_pomiaru[i]=0;<br />       }<br /><br />     else<br />  {// jezeli cool_fail nie jest aktywny  wykonuje normalna prace<br />   OUT_SET(); // ustawienie wyjsc sterujacych w zaleznosci od stanu<br />  //konwersja i wys³anie temperatury na wyswietlacz<br />           if(temperatura&lt;100) pokaz_dane(temperatura/10,temperatura%10,18,17);<br />                        //pokazuje temperature znak stopien  i znak c<br />                   else pokaz_dane(temperatura/100,temperatura/10,temperatura%10,17);<br />        // pokazuje 3 cyfry temperatury bez znaku stopien ze znakiem c na koncu<br />   }<br /> }<br />} // koniec global=0<br />//tutaj zaczyna sie menu ustawien<br /> if ((KEYA==1) &amp;&amp; !(global)) //pierwsze nacisniecie klawisza przy global rowny 0<br />    {<br /> pokaz_dane(11,12,13,14);//wyswietl menu<br /> _delay_ms(1000);<br /> _delay_ms(1000);<br /> KEYA = 0  ;<br /> global ++ ;<br /> }<br /><br /> if (global==1) // ustawiamy alarm 1 domyslnie     75 85 95 100<br />  {<br />    pokaz_dane(1, alarm1/100, alarm1/10,alarm1 %10);<br />    alarm1=temperatura_set(alarm1) ;<br />  }<br /><br /> if (KEYA)  // jezeli pierwszy klawisz wcisniety idziemy dalej<br />  {<br />  global++ ;<br />  KEYA = 0 ;<br />   }<br /><br /> if (global==2)   // ustawiamy alarm2<br />   {<br />   pokaz_dane(2,alarm2/100,alarm2/10,alarm2 %10);<br />   alarm2=temperatura_set(alarm2) ;<br />      }<br /><br /> if (global==3)// ustawiamy alarm3<br />      {<br />  pokaz_dane(3,alarm3/100,alarm3/10,alarm3 %10);<br />  alarm3=temperatura_set(alarm3) ;<br />      }<br /><br />if (global==4)   // ustawiamy alarm 4<br />      {<br />   pokaz_dane(4,alarm4/100,alarm4/10,alarm4 %10);<br />   alarm4=temperatura_set(alarm4) ;<br />      }<br /><br />if (global==5)   // ustawiamy ON lub OFF przy wykryciu braku czujnika -aktywacja<br /> {<br />     if(!cool_fail) pokaz_dane(10,0,0,20); //off<br />     if(cool_fail) pokaz_dane(10,10,0,13); //on<br />     if  (KEYB) cool_fail^=1; // zwiekszamy o 1<br />     if  (KEYC) cool_fail^=1; //zmniejszamy o 1<br />     KEYC=KEYB = 0 ;<br /> }<br /><br /> if (global&gt;5)<br />   { //  zapisujemy nasze ustawione alarmy do eepromu<br />  eeprom_write_block(&amp;alarm1, &amp;e_alarm1, sizeof(alarm1));<br />  eeprom_write_block(&amp;alarm2, &amp;e_alarm2, sizeof(alarm2));<br />  eeprom_write_block(&amp;alarm3, &amp;e_alarm3, sizeof(alarm3));<br />  eeprom_write_block(&amp;alarm4, &amp;e_alarm4, sizeof(alarm4));<br />  eeprom_write_block(&amp;cool_fail, &amp;e_cool_fail, sizeof(cool_fail));<br />  pokaz_dane(10,12,13,21); // napis END<br />                  _delay_ms(1000);<br />                  _delay_ms(1000);<br />   // zerujemy global  i zmienne klawiszy<br />   KEYA=0 ;KEYB =0 ;KEYC=0; global = 0 ;<br />   }<br />}//koniec int i while<br />}<br /><br />// przerwanie podstawy czasu 10ms tryb normal timer 0<br />ISR( TIMER0_OVF_vect )<br />{<br />uint16_t x;<br /> TCNT0=213;            // ³adowanie licznika na poczatek 213<br /> flag_10_ms=1 ;        // ustawienie flagi 10ms<br /> x=Timer1;             // 3timery programowe<br /> if(x) Timer1 = --x;<br /> x=Timer2;<br /> if(x) Timer2 = --x;<br />}<br /><br />void timer0_init(void)<br />{<br />TCNT0=213; // ³adowanie licznika na poczatek 213<br />TCCR0 |=(1&lt;&lt;CS00)|(1&lt;&lt;CS02); //preskaler 1024<br />TIMSK |=(1&lt;&lt;TOIE0); // zezwolenie przerwania dla przepe³nienia licznika<br />}<br /><br />uint8_t temperatura_set( uint8_t dana)<br />{<br />if  (KEYB)dana++ ; // zwiekszamy o 1<br />if  (KEYC)dana-- ; // zmniejszamy o 1<br />if ((dana&gt;101) || (1==dana)) dana=20  ; //jezeli temperatura jest wiekszaniz 101zerujemy<br />if (dana&lt;=19 &amp;&amp; dana&gt;1  ) dana = 0 ;<br />KEYC=KEYB = 0 ;<br />return dana;<br />}<br /><br />void OUT_SET(void)<br />{<br />// ustawienie wyjsc w zaleznosci od temperatury i on/off kana³u<br />//jezeli temperatura jest wieksza lub rowna i jest inna niz 0 uaktywnij wyjscie<br />// jezeli temperatura jest mniejsza o 2 stopienie wylacz - histereza sterowania przekaznikiem<br />  if (temperatura&gt;=alarm1 &amp;&amp; (alarm1))     PORTD |=OUT1 ;<br />  else if((temperatura-1)&gt;alarm1 &amp;&amp; (alarm1)) PORTD &amp;=~(OUT1);<br /><br />  if (temperatura&gt;=alarm2 &amp;&amp; (alarm2))     PORTD |=OUT2;<br />  else if((temperatura-1)&gt;alarm2 &amp;&amp; (alarm2)) PORTD &amp;=~(OUT2);<br /><br />  if (temperatura&gt;=alarm3 &amp;&amp; (alarm3))     PORTD |=OUT3;<br />  else if((temperatura-1)&gt;alarm3 &amp;&amp; (alarm3)) PORTD &amp;=~(OUT3);<br /><br />  if (temperatura&gt;=alarm4 &amp;&amp; (alarm4))        PORTD |=OUT4;<br />  else if((temperatura-1)&gt;alarm4 &amp;&amp; (alarm4))  PORTD &amp;=~(OUT4);<br />}<br /><br />void wyjscia_procesora_init(void)<br />{<br />PORTB |= KEY1 ; // przyciski -wejscia podciagniete do VCC<br />PORTD |= KEY2 | KEY3 ;<br />DDRD|= OUT1| OUT2| OUT3| OUT4 ; // sterowanie MP4020 wyjscia stan niski<br />// sterowanie tranzystorem  i czujnikiem NTC<br />DDRB |=NTC ;  //wyjscie stan niski<br />}<br /><br />void pokaz_dane(uint8_t A, uint8_t B, uint8_t C, uint8_t D)<br />{<br />TWI_start();<br />TWI_write(0x70); //3 bajty sta³e<br />TWI_write(0x00);<br />TWI_write(0x07);<br />TWI_write(pgm_read_byte(&amp;cyfry_progmem[A]));//4 bajty data<br />TWI_write(pgm_read_byte(&amp;cyfry_progmem[B]));<br />TWI_write(pgm_read_byte(&amp;cyfry_progmem[C]));<br />TWI_write(pgm_read_byte(&amp;cyfry_progmem[D]));<br />TWI_stop();<br />}<br />void funkcja1 (void)      //fukcje dodaja 1 w przypadku wcisniecia klawisza<br />{<br />KEYA= 1;<br />}<br />void funkcja2 (void)<br />{<br />    KEYB ++;<br />}<br />void funkcja3 (void)<br />{<br />    KEYC++;<br />}<br /><br />void klawisz_wcisniety (uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void))<br />{<br />register uint8_t key_press = (*KPIN &amp; key_mask);<br />if (!*klock &amp;&amp; ! key_press)<br />{<br />*klock = 1;<br />if (kfun) kfun();<br />}<br />else if (*klock &amp;&amp; key_press) (*klock)++ ;<br />}<br /><br />void pomiat_adc_init(void)<br />{<br />ADMUX |=(1&lt;&lt;REFS0); //napiecie odniesienia vcc<br />ADCSRA |= (1&lt;&lt;ADEN) |(1&lt;&lt;ADPS2); // wlaczenie przetwornika  oraz preskaler 16 ???<br />}<br /><br />uint16_t pomiar_adc(void)<br />{<br />ADMUX =(ADMUX &amp; 0xF8)|kanal_pomiarowy; // uruchomienie pomiaru i zwrot 10 bitów wyniku<br />ADCSRA |=(1&lt;&lt;ADSC);<br />while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ( ADCW );<br />}<br /><br />void cool_fail_on(void)<br />{<br />   PORTD |=OUT1|OUT2|OUT3|OUT4 ;<br />   pokaz_dane(17,0,0,22);  //napis cool<br />   _delay_ms(950);<br />  pokaz_dane(20,19,1,22); //napis fail<br />   _delay_ms(950);<br /><br />}[/syntax]<br />Program do poprawnego działania wymaga biblioteki I2C z blubooka i funkcji wyliczającej temperaturę z wartości przetwornika ADC której tutaj nie publikowałem.  Wszystkie duże elementy i śruby są rzecz jasna zabezpieczone dodatkowo klejem. Sam sterownik nie jest jeszcze w 100 % zrobiony ponieważ na obecną chwile nie wiem jeszcze ile i jakich wentylatorów użyje docelowo w projekcie.<br />Zapomniałem tez podłączyć nie używanych pinów do VCC. Flaga 10_ms miała być początkowo użyta do sterowania tranzystorem ale ostatecznie zostawiłem ja na zaś<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 3 lip 2019, o 22:31</p><hr />
]]></content>
</entry>
</feed>