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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-12-28T19:48:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=14009&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-12-28T19:48:02+01:00</updated>
<published>2015-12-28T19:48:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=149036#p149036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=149036#p149036"/>
<title type="html"><![CDATA[Re: servo sg90]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=149036#p149036"><![CDATA[
<div class="quotetitle">ostr napisał(a):</div><div class="quotecontent"><br />Potrzebuje częstotliwosci 50Hz<br /></div><br />Zastanów się, aby zwiększyć licznik <em>i</em> do 200 przerwanie musi być wywoływane 200 razy częściej niż 50 razy na sekundę.<br /><br />Odnośnie _delay_us(up) to przeczytaj drugą uwagę <!-- m --><a class="postlink" href="http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html" >http://www.nongnu.org/avr-libc/user-man ... delay.html</a><!-- m --><br />Można zrobić to tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />void servo_pos(uint8_t position);<br /><br />int main(void)<br />{<br />uint8_t pos = 100;<br />uint8_t dir = 0;<br />while(1)<br />{<br />for(uint8_t i = 0; i &lt; 10; ++i)//czas pozostania na okreslonej pozycji to 10 * 20 ms = 0,2 s<br />{<br />servo_pos(pos);<br />}<br />//ruch w jedna strone zajmie 0,2 s * 100 krokow = 20 sekund<br />if(0 == dir &amp;&amp; pos &lt; 200) ++pos;<br />                if(1 == dir &amp;&amp; pos &gt; 100) --pos;<br />if(pos &gt;= 200) dir = 1;<br />if(pos &lt;= 100) dir = 0;<br />}<br />return 0;<br />}<br /><br />void servo_pos(uint8_t position)<br />{<br />if(position &lt; 100) position = 100; //ograniczenie<br />if(position &gt; 200) position = 200;<br />PORTC |= (1&lt;&lt;PC1);<br />for(uint8_t i = 0; i &lt; position; ++i)//np. 100 * 10us = 1 ms<br />{<br />_delay_us(10); //argument jest znany na etapie kompilacji<br />}<br />PORTC &amp;= ~(1&lt;&lt;PC1);<br />for(uint16_t i = 0; i &lt; 2000 - position; ++i)//np. (2000 - 100) * 10 us = 19 ms<br />{<br />_delay_us(10);<br />}<br />//razem 20 ms<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 gru 2015, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ostr]]></name></author>
<updated>2015-12-27T22:24:52+01:00</updated>
<published>2015-12-27T22:24:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148984#p148984</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148984#p148984"/>
<title type="html"><![CDATA[Re: servo sg90]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148984#p148984"><![CDATA[
Potrzebuje częstotliwosci 50Hz, 8000000/1024 = 7812,5 Hz/ 50 = 156 taka wartosc wpisywalem na poczatku do OCR0. Włączałem pin przy warunku 0 wyłączalem przy warunku 2 . Zmniejszyłem wartość OCR0 czterokrotnie zeby zwiekszyc rozdzielczosc, dlatego wartosc w OCR0 jest teraz 39. Zeby wysterowac serwo trzeba dawać impulsy o czasie od 1-2ms<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 12 minutach ]</span></strong><br /><br />Narazie chciałem zrobić to w inny sposob po porstu na delayach, w momencie kiedy wpisze recznie wartości tak jak ponizej, jest ok , serwo sie obraca, ale w momencie kiedy chce aby serwo obracało się powoli od jednej strony do drugiej, poprzez zwiększanie zadanego impulsu tak jak jest to zakomentowane, serwo obraca się powoli ale startuje w zupełnie innym położeniu o jakieś 40 stopni dalej. Próbowałem już różnymi pętlami, a nawet w tak prosty sposób jak poniżej i nadal ustawia się w złym położeniu, jest tu coś źle czego nie widzę ?<br /><br />[syntax=c]void servo_test (void)<br />{<br />static int up=700,down=1;<br />PORTC |= (1&lt;&lt;PC1);<br />_delay_us(up);<br />PORTC&amp;=~ (1&lt;&lt;PC1);<br />_delay_us(19300);<br />//up = up+1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3780">ostr</a> — 27 gru 2015, o 22:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-12-27T20:16:22+01:00</updated>
<published>2015-12-27T20:16:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148978#p148978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148978#p148978"/>
<title type="html"><![CDATA[Re: servo sg90]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148978#p148978"><![CDATA[
Nie napisałeś jaką chciałeś mieć częstotliwość, ale sądząc po warunku i == 200 to będzie 10 000 Hz (okres 0,1 ms). Ty masz teraz 195 Hz. <br />Proponuję preskaler 8 i wartość w OCR = 8 MHz / 8 / 10 kHz - 1 = 99.<br /><br />Skoro cały okres wynosi 20 ms, a masz warunek i == 200 to dla 2 ms powinien być warunek i == 20<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 27 gru 2015, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ostr]]></name></author>
<updated>2015-12-27T19:39:36+01:00</updated>
<published>2015-12-27T19:39:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148976#p148976</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148976#p148976"/>
<title type="html"><![CDATA[servo sg90]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14009&amp;p=148976#p148976"><![CDATA[
Witam , probuję napisać program do sterowania dwoma sg90, steruje się nimi poprzez pwm podając impuls od dlugosci od 1-2ms, całkowity okres 50Hz. Wykorzystuje atmege 32, timer 1 mam już zajęty także nie mogę sterować za pomocą fast pwm. Próbuję to zrobić poprzez tryb ctc . Taktowanie procesora 8Mhz, preskaler 1024,  do OCR0 wpisana na stałe wartość = 39. Serwo niestety nie rusza, źle policzyłem częstotliwość ? Poniżej przedstawiam część kodu. Rezultat jest taki że serwo jedynie 'pyka'<br /><br />[syntax=c]void pwm_init(void)<br />{<br />TIMSK |= (1&lt;&lt;OCIE0);<br />TCCR0 |= (1&lt;&lt;WGM01)| (0&lt;&lt;WGM00) | (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />OCR0 = 39;<br />DDRD |= (1&lt;&lt;PD4);<br /><br />}<br /><br />ISR(USART_RXC_vect)<br />{<br />data = UDR;<br />}<br /><br />ISR(TIMER0_COMP_vect)<br />{<br />static uint8_t i;<br /><br />if( i ==0)<br />{<br />PORTD |= (1&lt;&lt;PD4);<br />}<br /><br />if (i==2)<br />{<br />PORTD &amp;=~ (1&lt;&lt;PD4);<br />}<br /><br />i++;<br /><br />if (i == 200)<br />{<br />i=0;<br /><br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3780">ostr</a> — 27 gru 2015, o 19:39</p><hr />
]]></content>
</entry>
</feed>