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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-10-11T17:00:05+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=23783&amp;mode</id>
<entry>
<author><name><![CDATA[magnetic]]></name></author>
<updated>2021-10-11T17:00:05+01:00</updated>
<published>2021-10-11T17:00:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=233824#p233824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=233824#p233824"/>
<title type="html"><![CDATA[Re: Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=233824#p233824"><![CDATA[
Po kilku miesiącach walki z tym kodem poddaje się, chyba spróbuję zrobić kod na IFach bo to nijak mi nie działa i nawet nie wiem od której strony się dobrać. Dzięki za info tak czy inaczej!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21265">magnetic</a> — 11 paź 2021, o 17:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2021-05-20T09:18:25+01:00</updated>
<published>2021-05-20T09:18:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232446#p232446</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232446#p232446"/>
<title type="html"><![CDATA[Re: Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232446#p232446"><![CDATA[
Ja właśnie chciałem dopytać, bo nigdzie flotów nie widzę a w kodzie są jakieś 1,123 i nie bardzo mogłem zrozumieć, jak to się zamienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 20 maja 2021, o 09:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-05-20T06:58:16+01:00</updated>
<published>2021-05-20T06:58:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232445#p232445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232445#p232445"/>
<title type="html"><![CDATA[Re: Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232445#p232445"><![CDATA[
Cytat z noty aplikacyjnej: &quot;To increase the accuracy the p_factor, i_factor, and d_factor are scaled with a factor 1:128. The result ofthe PID algorithm is later scaled back by dividing by 128. The value 128 is used to allow for optimizing inthe compiler.&quot;<br />Spokojnie, procek nie operuje na floatach, skalowanie odbywa się podczas kompilacji i wszystkie obliczenia są wykonywane na zmiennych całkowitych. Dlatego też funkcja pid_init nie przyjmuje tych współczynników jako parametrów tylko przypisywane są, przez makro, bezpośrednio do zmiennej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 20 maja 2021, o 06:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Tom277]]></name></author>
<updated>2021-05-20T06:49:48+01:00</updated>
<published>2021-05-20T06:49:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232444#p232444</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232444#p232444"/>
<title type="html"><![CDATA[Re: Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232444#p232444"><![CDATA[
[syntax=c]#define Q(x)            ((float)x * SCALE_FACTOR)[/syntax]<br /><br />Co to  jest, co tu się dzieje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=548">Tom277</a> — 20 maja 2021, o 06:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mario17]]></name></author>
<updated>2021-05-19T09:26:31+01:00</updated>
<published>2021-05-19T09:26:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232430#p232430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232430#p232430"/>
<title type="html"><![CDATA[Re: Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232430#p232430"><![CDATA[
<a href="http://ww1.microchip.com/downloads/en/Appnotes/Atmel-2558-Discrete-PID-Controller-on-tinyAVR-and-megaAVR_ApplicationNote_AVR221.pdf"  class="postlink">http://ww1.microchip.com/downloads/en/Appnotes/Atmel-2558-Discrete-PID-Controller-on-tinyAVR-and-megaAVR_ApplicationNote_AVR221.pdf</a><br /><br />pid.h<br />[syntax=c]#ifndef PID_H_<br />#define PID_H_<br /><br />#define SCALE_FACTOR    128<br />#define Q(x)            ((float)x * SCALE_FACTOR)<br /><br />typedef struct{<br />int32_t Kp;<br />int32_t Ki;<br />int32_t Kd;<br /><br />int32_t lim_min;<br />int32_t lim_max;<br /><br />int32_t lim_i_min;<br />int32_t lim_i_max;<br /><br />int32_t integrator;<br />int32_t error_prev;<br /><br />    int32_t out;<br />}PID_t;<br /><br />void pid_init(PID_t* pid);<br />void pid_reset_integrator(PID_t* pid);<br />int16_t pid_calculate(PID_t* pid, int16_t setpoint, int16_t measurement);<br /><br />#endif /* PID_H_ */[/syntax]<br /><br />pid.c<br />[syntax=c]#include &lt;inttypes.h&gt;<br />#include &quot;pid.h&quot;<br /><br />void pid_init(PID_t* pid){<br />    pid-&gt;integrator = 0;<br />    pid-&gt;error_prev = 0;<br />    pid-&gt;out = 0;<br />}<br /><br />void pid_reset_integrator(PID_t* pid){<br />pid-&gt;integrator = 0;<br />}<br /><br />int16_t pid_calculate(PID_t* pid, int16_t setpoint, int16_t measurement){<br />int32_t error;<br />int32_t p;<br />int32_t d;<br /><br />// error<br />error = setpoint - measurement;<br /><br />    // proportional<br />p = pid-&gt;Kp * error;<br /><br />// integral<br />pid-&gt;integrator = pid-&gt;integrator + pid-&gt;Ki * error;<br /><br />// integral anti-wind-up<br />if(pid-&gt;integrator &lt; pid-&gt;lim_i_min){<br />        pid-&gt;integrator = pid-&gt;lim_i_min;<br />}<br /><br />if(pid-&gt;integrator &gt; pid-&gt;lim_i_max){<br />        pid-&gt;integrator = pid-&gt;lim_i_max;<br />}<br /><br />// derivative<br />d = pid-&gt;Kd * (error - pid-&gt;error_prev);<br /><br />// output<br />pid-&gt;out = (p + pid-&gt;integrator + d);<br /><br />// output limits<br />if(pid-&gt;out &lt; pid-&gt;lim_min){<br />        pid-&gt;out = pid-&gt;lim_min;<br />}<br /><br />if(pid-&gt;out &gt; pid-&gt;lim_max){<br />        pid-&gt;out = pid-&gt;lim_max;<br />}<br /><br />pid-&gt;out = pid-&gt;out / SCALE_FACTOR;<br /><br />pid-&gt;error_prev = error;<br /><br />return pid-&gt;out;<br />}[/syntax]<br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;pid.h&quot;<br /><br />Timer_t timer0;<br />PID_t pid;<br />uint8_t pwm;<br /><br />void timer0_timeout(void);<br /><br />int main( void ){<br /><br />TCCR1A |= (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10) | (1&lt;&lt;COM1A1);<br />TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;CS10);<br />OCR1A = 0;<br /><br />timerSet(&amp;timer0, 10, timer0_timeout, TIMER_MODE_CONTINUOUS);<br />timerStart(&amp;timer0);<br /><br />    pid.Kp = Q(1.0);<br />    pid.Ki = Q(0.3);<br />    pid.Kd = Q(0.05);<br /><br />    pid.lim_min = Q(0);<br />    pid.lim_max = Q(1023);<br /><br />    pid.lim_i_min = Q(-1000);<br />    pid.lim_i_max = Q(1000);<br /><br />    pid_init(&amp;pid);<br /><br />sei();<br /><br />while(1){<br />TIMER_EVENT();<br />}<br />}<br /><br />void timer0_timeout(void){<br />int16_t setpoint = 50;<br />int16_t temp;<br /><br />temp = get_temp();<br /><br />pwm = pid_calculate(&amp;pid, setpoint, temp);<br /><br />OCR1A = pwm;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3695">Mario17</a> — 19 maja 2021, o 09:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[magnetic]]></name></author>
<updated>2021-05-18T20:46:41+01:00</updated>
<published>2021-05-18T20:46:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232425#p232425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232425#p232425"/>
<title type="html"><![CDATA[Regulator mocy grzałki / termostat]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23783&amp;p=232425#p232425"><![CDATA[
Czołem!<br />Niemalże skończyłem programować urządzenie które w kilku krokach podgrzewa wodę do zadanej temperatury. Na chwilę obecną zatrzymałem się na zero-jedynkowym uruchamianiu grzałki - i tu właśnie jest problem. Jeśli chcę podgrzać wodę do 30 stopni to grzałka włącza się na 100% i gdy woda uzyska temperaturę 30 stopni to się wyłącza, ale jak wiadomo dalej oddaje swoje ciepło, więc zamiast 30 stopni mam np 50. Kiedyś natrafiłem na gotową bibliotekę sterowania PID, ale nie mogę jej namierzyć. Jest ktoś w stanie podpowiedzieć, a najlepiej zarzucić jakimś kodem który mógłbym zmodyfikować pod siebie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21265">magnetic</a> — 18 maja 2021, o 20:46</p><hr />
]]></content>
</entry>
</feed>