<?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=4&amp;t=10013&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-01-04T09:02:47+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10013&amp;mode</id>
<entry>
<author><name><![CDATA[alkorinio]]></name></author>
<updated>2015-01-04T09:00:05+01:00</updated>
<published>2015-01-04T09:00:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112141#p112141</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112141#p112141"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112141#p112141"><![CDATA[
@kicajek<br />Ta część programu działa akurat dobrze (patrz pierwszy post), ale dzięki za pomysł.<br /><br />Odnośnie płynnej regulacji rozwiązałem to tak:<br />[syntax=c]i = (255*((cel_d*100/200)-100))/100;// omijamy arytmetykę zmiennoprzecinkową<br />// operując na liczbach o 100 razy większych[/syntax]<br />Działa bez zarzutu.<br /><br />Druga sprawa to taka, że większość wentylatorów (o ile nie wszystkie) ma taką przypadłość, że nie załącza się, gdy wypełnienie impulsu wynosi np. 1/255, ale gdy jest to dopiero 80/255. Wziąłem na to poprawkę pozostawiając nawet 100/255, także ostateczny kod wygląda tak:<br />[syntax=c]i = 100 + (155*((cel_d*100/200)-100))/100;// omijamy arytmetykę zmiennoprzecinkową<br />// operując na liczbach o 100 razy większych<br />// liczba 100 na początku jest równoważna z powyższym warunkiem[/syntax]<br />Należy pamiętać, że dolna granica, przy której obroty mają się zwiększać, to 20C (stad liczba 200 w algorytmie), a górna 40C.<br /><br />Temat zakończony, dzięki za pomoc! Gumeni dostaje plusa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5822">alkorinio</a> — 4 sty 2015, o 09:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[alkorinio]]></name></author>
<updated>2015-01-03T20:21:00+01:00</updated>
<published>2015-01-03T20:21:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112057#p112057</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112057#p112057"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112057#p112057"><![CDATA[
Zmienna cel_d jest typu uint16_t (przepraszam, nie napisałem).<br /><br />Ale rozumiem już, o co chodzi - MCU podczas żadnego działanie nie będzie widział liczby &lt;1. Spróbuję to obejść.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5822">alkorinio</a> — 3 sty 2015, o 20:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2015-01-03T20:05:49+01:00</updated>
<published>2015-01-03T20:05:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112047#p112047</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112047#p112047"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112047#p112047"><![CDATA[
Witam<br />A może zamiast:<br />[syntax=c]else if ((cel_d&gt;230) &amp;&amp; (cel_d&lt;=260))<br />                                        {<br />                                        i=170;<br />                                        OCR2=i;<br />...[/syntax]<br />dać:<br />[syntax=c]else if ((cel_d&gt;230) &amp;&amp; (cel_d&lt;=260))<br />                                        {<br />                                        i=( cel_d-230)*6;<br />OCR2 =i;[/syntax]<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 3 sty 2015, o 20:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gumeni]]></name></author>
<updated>2015-01-03T19:57:59+01:00</updated>
<published>2015-01-03T19:57:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112043#p112043</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112043#p112043"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112043#p112043"><![CDATA[
Ale nigdy z tego działania ((cel_d-200) / (400-200)) nie uzyskasz liczby większej od 1. cel_d jest pewnie typu uint8_t. Więc cel_d może być max 255. (255-200)/(400-200)=55/200&lt;1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3088">gumeni</a> — 3 sty 2015, o 19:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[alkorinio]]></name></author>
<updated>2015-01-03T19:53:34+01:00</updated>
<published>2015-01-03T19:53:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112040#p112040</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112040#p112040"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112040#p112040"><![CDATA[
Tak też podejrzewałem. Ale jeśli wynikiem tego działania byłoby np. <strong>25,81</strong>, to czy fakt, że zmienna jest typu uint16_t, nie powinien rzutować jej właśnie na typ uint16_t i pozostawić wartość <strong>25</strong>?<br /><br />Jeśli nie, to jak to ominąć?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5822">alkorinio</a> — 3 sty 2015, o 19:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gumeni]]></name></author>
<updated>2015-01-03T19:45:48+01:00</updated>
<published>2015-01-03T19:45:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112036#p112036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112036#p112036"/>
<title type="html"><![CDATA[Re: regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112036#p112036"><![CDATA[
Tak jak się domyślasz winna jest ta linia:<br />[syntax=c]i = 255*((cel_d-200) / (400-200))[/syntax]<br /><br />Wynikiem tego działania:<br />[syntax=c]((cel_d-200) / (400-200))[/syntax]<br />będzie liczba po przecinku. Która zostanie potraktowana jako 0. Wtedy:<br />[syntax=c]i = 255*0[/syntax]  <br />[syntax=c]i = 0[/syntax] <br />Aby część po przecinku nie została &quot;utracona&quot; musiałbyś wykonać jawne rzutowanie na typ float lub double. Ale gdzieś czytałem, że lepiej unikać tych typów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3088">gumeni</a> — 3 sty 2015, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[alkorinio]]></name></author>
<updated>2015-01-04T09:02:47+01:00</updated>
<published>2015-01-03T19:17:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112024#p112024</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112024#p112024"/>
<title type="html"><![CDATA[=ROZWIĄZANE= regulator temperatury z wentylatorem, ATmega16]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10013&amp;p=112024#p112024"><![CDATA[
Witam<br /><br />Przygotowuję dość prosty projekt zgodnie z opisem z tematu. Mam wentylator 12V, czujnik DS18B20. Wszystko jest podłączone i działa poprawnie (sprawdzałem oczywiście osobno na wszelakie sposoby). Czujnik temperatury obsługuję przez bibliotekę z Bluebooka, także nie będę podawał tutaj jej kodu. Dodam tylko, że temperatura odczytywana jest <strong>raz na 3 sekundy</strong>.<br /><br />Problem, który mam, pojawia się przy próbie płynnego sterowania obrotami wentylatora. Realizuję ją oczywiście przez <span style="text-decoration: underline">PWM</span>.<br />Utworzyłem sobie pomocniczą zmienną:<br />[syntax=c]cel_d = (cel*10) + cel_fract_bits;// zmienna badająca zmianę temperatury co do 0.1 C[/syntax]<br />Dla wyjaśnienia, zmienna <em>cel</em> to wartość całkowita temperatury, a zmienna <em>cel_fract_bits</em> to wartość dziesiętna temperatury.<br /><br />Gdy temperaturę zmieniam skokowo za pomocą tego fragmentu kodu, to wszystko działa prawidłowo, co potwierdza zarówno fizyczne działanie wentylatora, jak i wyświetlacz:<br />[syntax=c]if(cel_d&lt;=200)<br />{<br />i=0;<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}<br />else<br />if ((cel_d&gt;200) &amp;&amp; (cel_d&lt;=230))<br />{<br />i=100;<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}<br />else if ((cel_d&gt;230) &amp;&amp; (cel_d&lt;=260))<br />{<br />i=170;<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}<br />else<br />{<br />i=230;<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}[/syntax]<br /><br />Zaznaczam, że obroty rosną wraz ze wzrostem temperatury powyżej 20, 23 i 26 stopni C, i odpowiednio spadają.<br />Zmienna <em>i</em> jest typu <span style="text-decoration: underline">uint16_t</span>. Timer2 działa prawidłowo.<br /><br />Jednak gdy próbuję regulować temperaturę stopniowo, aby szerokość impulsu rozkładała się pomiędzy 0, a 255 dla zakresu temperatur 20-40 C, to program nie działa już prawidłowo:<br />[syntax=c]if (cel_d &lt;= 200)<br />{<br />i=0;<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}<br />else<br />{<br />i = 255*((cel_d-200) / (400-200));   //ta instrukcja ma na celu płynny dobór szerokości impulsu (temp min=20 C, temp max=40 C)<br />OCR2=i;<br />lcd_locate(1,9);<br />lcd_int(OCR2);<br />}[/syntax]<br />Podejrzewam, że winowajcą jest działanie <br />[syntax=c]i = 255*((cel_d-200) / (400-200))[/syntax]<br />powodujące nieprawidłowe przypisanie wartości do rejestru OCR2. Efekt jest taki, że OCR2 zawsze przyjmuje wartość 0 (widoczne na wyświetlaczu).<br /><br />Rozwiązanie jest zapewne proste, ale nie mogę na nie wpaść, także bardzo proszę o pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5822">alkorinio</a> — 3 sty 2015, o 19:17</p><hr />
]]></content>
</entry>
</feed>