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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-09T08:22:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=19146&amp;mode</id>
<entry>
<author><name><![CDATA[Alef2]]></name></author>
<updated>2017-09-09T08:22:35+01:00</updated>
<published>2017-09-09T08:22:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194721#p194721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194721#p194721"/>
<title type="html"><![CDATA[Re: Boost converter sterowany atmegą - stabilizacja napięcia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194721#p194721"><![CDATA[
Procesor nie zdąży zareagować, bo przerwanie, a co za tym idzie pomiar napięcia jest co 1ms. Co oznacza, że nastąpią 32 cykle PWM, zanim procesor będzie miał szanse zareagować. Przy takim opóźnieniu żaden PID nie pomoże, bo albo będzie bardzo duży błąd regulacji, albo układ będzie niestabilny.<br /><br />Układ ma szanse działać, pod warunkiem szybkiego pomiaru i szybkiej reakcji.<br />ADC może (lub powinien) pracować w trybie Free Running z czasem konwersji zbliżonym (najlepiej mniejszym) do okresu PWM. Dzięki temu nie tracimy czasu na oczekiwanie na konwersje i mamy zawsze aktualną wartość napięcia na wyjściu.<br />Regulacja (zmiana wypełnienia PWM'u) też powinna odbywać się z częstotliwością PWM'u, najlepiej synchronicznie z PWM'em wykorzystując przerwanie od przepełnienia timera. Jeśli nie przewidujesz stałego obciążenia przetwornicy, to w algorytmie sterowania, powinien znaleźć się fragment wyłączający przetwornicę (pomijający cykl) po przekroczeniu pewnego napięcia na wyjściu.<br /><br />Nie podałeś jaki prąd (minimalny i maksymalny) zamierzasz czerpać z przetwornicy, trudno więc ocenić trafność doboru cewki. Przy częstotliwości kluczowania 32kHz wydaje się trochę mała jej indukcyjność.<br /><br />W przerwaniu nie widzę w przerwaniu obsługi LCD, w którym miejscu jest?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14998">Alef2</a> — 9 wrz 2017, o 08:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-09-09T00:55:39+01:00</updated>
<published>2017-09-09T00:55:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194717#p194717</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194717#p194717"/>
<title type="html"><![CDATA[Re: Boost converter sterowany atmegą - stabilizacja napięcia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194717#p194717"><![CDATA[
<div class="quotetitle">micky napisał(a):</div><div class="quotecontent"><br />A czy przypadkiem nie wyświetlasz pomiaru w trakcie regulacji?<br /></div><br /><br />O Matko .... ale masakra - ..... no jeśli tak jest jak kolega micky pisze - to kolega autor powinien dostać linijką po gołej .... głowie <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> ... obsługa LCD w przerwaniu ??? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... a tam i ADC no i MEGA STRATA czasu i co się dziwić, że reakcja opóźniona - a więc napięcie leci w kosmos - zanim zdąży procek zareagować <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 wrz 2017, o 00:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-09-08T22:49:19+01:00</updated>
<published>2017-09-08T22:49:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194715#p194715</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194715#p194715"/>
<title type="html"><![CDATA[Re: Boost converter sterowany atmegą - stabilizacja napięcia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194715#p194715"><![CDATA[
A czy przypadkiem nie wyświetlasz pomiaru w trakcie regulacji?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 8 wrz 2017, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2017-09-08T19:39:06+01:00</updated>
<published>2017-09-08T19:39:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194691#p194691</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194691#p194691"/>
<title type="html"><![CDATA[Re: Boost converter sterowany atmegą - stabilizacja napięcia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194691#p194691"><![CDATA[
Pomierz sobie ile wykonuje się Twój kod na avr a potem odpowiesz sobie sam na pytanie czy używanie avra do sterowania przetwornica to dobry pomysł.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 8 wrz 2017, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elektronn]]></name></author>
<updated>2017-09-08T19:21:32+01:00</updated>
<published>2017-09-08T19:21:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194690#p194690</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194690#p194690"/>
<title type="html"><![CDATA[Boost converter sterowany atmegą - stabilizacja napięcia]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19146&amp;p=194690#p194690"><![CDATA[
Witam, <br /><br />Zrealizowałem przerywacz podwyższający napięcie z 5 V do 10 V, który jest sterowany atmegą a program napisałem w języku C, lecz mam problem ze stabilizacją napięcia wyjściowego przy zmianach obciążenia. Napięcie przy dużych zmianach obciążenia potrafi wzrosnąć na chwile nawet o 10 V. <br /><br />Sterowanie wypełnieniem PWM zrealizowałem w przerwaniach poprzez zwiększanie &quot;+/- 1&quot;, chciałem zrealizować programowy regulator PID lecz nie mogę sobie z tym poradzić. Robiliście może coś podobnego?<br /><br />Tutaj schemat układu: <br /><a href="https://obrazkiforum.atnel.pl/17610/4c23d7318736a091c5c960a4f818435c.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/17610/4c23d7318736a091c5c960a4f818435c.png" alt="Obrazek" /></a><br /><br />Atmega działa z f = 16 MHz a PWM zaprogramowałem z częstotliwością f = 32 kHz. Sterowanie mosfetem odbywa się poprzez driver IR2121. Zwiększanie/zmniejszenia wypełnienia (wartości zadanej) zrealizowane jest za pomocą dwóch przycisków. Napięcie wyjściowe mierzone jest poprzez przetwornik w przerwaniu od timera0 i porównywana jest z wartością zadaną. <br /><br />Oraz program z komentarzami:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt;<br />#include &quot;lcdhd44780.h&quot;<br /><br />#define kanal 5//wybór kanału ADC do pomiaru napięcia <br /><br />volatile uint16_t licznik = 0;//zmienna pomocnicza do odświeżania na LCD napięcia<br /><br />volatile uint16_t a = 420;//zmienna wartości zadanej <br /><br />volatile uint8_t blok = 0;//zmienna blokujaca dalsze zmniejszenie OCR1A<br /><br />volatile uint16_t wynik = 0;<br /><br />int main(void)<br />{<br />uint8_t moj = OCR1A;<br /><br />//deklaracje zmiennych do pomiaru napięcia <br />uint32_t dzies = 0;//czesc dziesietna napiecia<br />uint32_t ulam = 0;//czesc uklamkowa napiecia<br />uint32_t nap = 0;//zmienna przechowujaca zmierzone nap z przetwornika w postaci binarnej <br />uint32_t wynik = 0;//zmienna do której trafia wynik obliczen napiecia<br /><br />//ustawienia portów do przycisków zwiększających i zmniejszających wartośc zadaną <br />DDRC &amp;= ~(1&lt;&lt;PC1);<br />PORTC |= (1&lt;&lt;PC1);<br />DDRC &amp;= ~(1&lt;&lt;PC2);<br />PORTC |= (1&lt;&lt;PC2);<br /><br />//ustawienie wyjścia kanału PWM<br />DDRB |= (1&lt;&lt;PB1);<br /><br />//konfiguracja trybu PWM<br />TCCR1A |= (1&lt;&lt;WGM11);//ustawienie trybu fast pwm 9 bit<br />TCCR1B |= (1&lt;&lt;WGM12);<br />TCCR1A |= (1&lt;&lt;COM1A1);//set OC at TOP<br />TCCR1B |= (1&lt;&lt;CS10);//prescale = 1<br /><br />//konfiguracja TIMER0 do pomiaru napięcia <br />TCCR0 |= (1&lt;&lt;CS01)|(1&lt;&lt;CS00);//prescale = 64 czyli pomiar nap. w przerwaniu co 1ms<br />TIMSK |= (1&lt;&lt;TOIE0);//zezwolenie na przerwanie od przepełnienia<br /><br />//konfiguracja przetwornika ADC<br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;REFS1);//napiecie odniesienia wewnetrzne 2,56 V<br />ADCSRA |= (1&lt;&lt;ADEN);//wlaczenie ADC<br />ADCSRA |= (1&lt;&lt;ADPS0)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS2);//prescale 128<br /><br />lcd_init();//funkcja inicjalizacji wyświetlacza LCD<br /><br />sei();<br /><br />while(1)<br />{<br /><br />if(!(PINC &amp; (1&lt;&lt;PC1)))//Przycisk zwiększający wartośc zadaną<br />{<br />_delay_ms(80);<br />if(!(PINC &amp; (1&lt;&lt;PC1)))<br />{<br />a = a + 4;//zwiększanie wartości zadanej (napięcia)<br />if(a &gt;= 840) a = 840;//ograniczenie wartości zadanej <br />}<br />}<br />if(!(PINC &amp; (1&lt;&lt;PC2)))//Przycisk zmniejszający wartośc zadaną<br />{<br />_delay_ms(80);<br />if(!(PINC &amp; (1&lt;&lt;PC2)))<br />{<br />a = a - 4;//zmniejszanie wartości zadanej<br />if(a &lt;= 420) a = 420;//ograniczenie wartości zadanej <br />}<br />}<br /><br />moj = OCR1A;<br /><br />if(licznik &gt; 1000)//wyswietlanie wyniku co 1ms * 1000 = 1s<br />{<br />licznik = 0;<br /><br />//obsluga pomiaru napiecia<br />lcd_cls();//funckja czyszcząca wyświetlacz LCD<br />nap = ADCW;//przypianie wyniku napięcia w postaci binarnej <br />wynik = nap * 30UL * 4UL;//pomnozenie przez stałą<br />dzies = wynik/10000;//uzyskanie czesci całkowitej <br />ulam = (wynik/100) % 100;//uzyskanie części ulamkowej poprzez reszte z dzielenia <br /><br />//Wyswietlenie wyniku <br />lcd_letter(&quot;U = &quot;); //funkcja wyswietlająca tekst<br />lcd_number(dzies); //funkcja wyswietlająca liczby<br />lcd_letter(&quot;.&quot;);<br />lcd_number(ulam);<br />lcd_letter(&quot; V&quot;);<br /><br />//wyswietlenie na LCD wartości zmierzonej napięcia, wartości zadanej, oraz rejestru OCR1A<br />lcd_locate(1,0); //funcja lokalizacji kursora<br />lcd_number(a);<br />lcd_locate(1,5);<br />lcd_number(nap);<br />lcd_locate(1,10);<br />lcd_number(moj);<br />}<br />}<br />}<br /><br />ISR( TIMER0_OVF_vect )<br />{<br />licznik++;//zmienna do odmierzania czasu z jakim ma byc wyswietlany wynik na LCD<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;//wybranie kanału ADC (wykonanie maski 0xF8 po to zeby skasowac wczesniej ustawiony kanał a dopiero potem wybrac kanal)<br />ADCSRA |= (1&lt;&lt;ADSC);//start pomiaru poprzez ustawienie bitu ADSC<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));//oczekiwanie na koniec pomiaru (czyli na wyzerowanie bitu ADSC)<br /><br />if(ADCW &lt; a)//Warunek: Czy wartośc zmierzona jest mniejsza od wartości zadanej?<br />{<br />OCR1A = OCR1A + 1;//TAK wiec zwiększ wypełnienie PWM <br />blok = 0;<br />if(OCR1A &gt; 270) OCR1A = 270;//ograniczenie wypełnienia<br />}<br />else//Nie wiec zmniejsz wypełnienie PWM<br />{<br />if(blok != 1) OCR1A = OCR1A - 1;<br />if(OCR1A &lt; 1) <br />{<br />blok = 1;//Zablokowanie dalszago zmniejszenia OCR1A gdy jest zmniejsze od 1<br />OCR1A = 0;<br />}<br />}<br />return ADCW;//zwrocenie wyniku pomiaru w rejestrze ADCW(parze rejestrów ADCH i ADCL)<br />}[/syntax]<br /><br />Układ zmontowałem na płytce stykowej:<br /><a href="https://obrazkiforum.atnel.pl/17610/42e1c18f03d58877a5cbabd33a1e6e77.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/17610/42e1c18f03d58877a5cbabd33a1e6e77.jpg" alt="Obrazek" /></a><br /><br />Próbowałem zrealizowac regulator propocjonalny P ale układ nie działał kompletnie :/<br />próbowałem to zrobic tak:<br /><br />[syntax=c]wartosc_zmierzona = ADCW;<br />error = a - wartosc_zmierzona;<br /><br />if(ADCW &lt; a)//Warunek: Czy wartośc zmierzona jest mniejsza od wartości zadanej?<br />{<br />OCR1A = OCR1A + error;//TAK wiec zwiększ wypełnienie PWM <br />blok = 0;<br />if(OCR1A &gt; 270) OCR1A = 270;//ograniczenie wypełnienia<br />}<br />else//Nie wiec zmniejsz wypełnienie PWM<br />{<br />if(blok != 1) OCR1A = OCR1A - error;<br />if(OCR1A &lt; 1) <br />{<br />blok = 1;//Zablokowanie dalszago zmniejszenia OCR1A gdy jest zmniejsze od 1<br />OCR1A = 0;<br />}<br />}[/syntax]<br /><br />Z góry dziękuję za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17610">elektronn</a> — 8 wrz 2017, o 19:21</p><hr />
]]></content>
</entry>
</feed>