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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-02-07T23:29:47+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17559&amp;mode</id>
<entry>
<author><name><![CDATA[Gelten]]></name></author>
<updated>2017-02-07T23:29:47+01:00</updated>
<published>2017-02-07T23:29:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=182028#p182028</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=182028#p182028"/>
<title type="html"><![CDATA[Re: Programowy PWM 9 bit na liczniku 16 bitowym.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=182028#p182028"><![CDATA[
Może pomyśl nad takim sposobem:<br />- tablica wychyleń serw;<br />- Timer1 w trybie FastPWM (z preskalerem 8), gdzie TOP to OCR1A;<br />- wykorzystanie przerwania od OCR1A i OCR1B;<br />- ustawienie OCR1A na 3 999;<br />- do rejestru OCR1B wpisujemy wartość wychylenia serwa (np 1023, 1456, - wartości te odpowiadają czasie trwania stanu wysokiego wyrażonego w mikrosekundach).<br /><br />W przerwaniu od OCR1A ustawiamy pin sterujący serwem np A1 na &quot;1&quot;, a do rejestru OCR1B wczytujemy wartość wychylenia z tablicy dla tego serwa. W przerwaniu od OCR1B ustawiany pin sterujący serwem A1 na &quot;0&quot;. W kolejnym przerwaniu od OCR1A zmieniamy pin i wartość OCR1B na kolejne serwo, np A2. W następnym przerwaniu od OCR1B ustawiany pin sterujący serwem A2 na &quot;0&quot;. I tak dalej, i tak dalej.<br /><br />Skąd się wzięła wartość 3999 w OCR1A:<br />1.) częstotliwość z preskalerem : 8 000 000 Hz / 8 = 1 000 000 Hz;<br />2.) ilość taktów Timer1, by uzyskać 50 Hz: 1 000 000 Hz / 50 Hz = 20 000;<br />3.) standardowe serwa przyjmują sygnał w zakresie od około 0.8 ms do około 2.2 ms, natomiast długość całej ramki to 20 ms.<br /><br />Mając te wszystkie informacje możemy założyć, że na obsługę jednego sygnału dla serwa, czas trwania jednego pełnego obiegu Timer1 to minimum 2.5 ms. Dzieląc 20 ms przez 2.5 ms otrzymujemy maksymalną ilość obsługiwanych serw równą 8. Chcąc sterować 5 serwami, wystarczy 20 ms (20 000 taktów Timer1) podzielić przez 5, co daje nam 4 ms (4 000 taktów Timer1). Pamiętając o tym, że zaczynamy liczyć od 0, a nie od 1, to zamiast do OCR1A wpisać 4 000, musimy wpisać 3 999. Mam nadzieję, że w miarę jasno się wyraziłem <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5228">Gelten</a> — 7 lut 2017, o 23:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-02-07T18:01:56+01:00</updated>
<published>2017-02-07T18:01:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181975#p181975</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181975#p181975"/>
<title type="html"><![CDATA[Re: Programowy PWM 9 bit na liczniku 16 bitowym.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181975#p181975"><![CDATA[
<div class="quotetitle">idzik15 napisał(a):</div><div class="quotecontent"><br />[syntax=c]TCCR1B |= ( (1&lt;&lt;CS11) | (1&lt;&lt;CS10) ); //preskaler=8[/syntax]<br /></div>i tu prawdopodobnie tkwi błąd bo to ustawienie odpowiada preskalerowi 64 a nie 8 przez co częstotliwość sygnału jest bardzo niska (przy wartości 511 rejestru porównania jeśli dobrze liczę to ok 0,5Hz)<br />Nie wiem też dla czego w rejestrze porównania masz wartość 511? skoro z obliczeń Ci wyszło 39?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 7 lut 2017, o 18:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wonsz]]></name></author>
<updated>2017-02-07T10:40:06+01:00</updated>
<published>2017-02-07T10:40:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181934#p181934</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181934#p181934"/>
<title type="html"><![CDATA[Re: Programowy PWM 9 bit na liczniku 16 bitowym.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181934#p181934"><![CDATA[
Dasz radę debouncing w przerwaniu zrobić? <br />Poza tym nie lubię while'ow w przerwaniu. Możesz mi powiedzieć czemu ten TCNT1 I ICR1  w dwóch miejscach zadajesz? Chyba że źle widzę bo w tapatalku nie działają mi syntaxy.<br /><br />Wysłane z mojego GT-I9301I przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2311">wonsz</a> — 7 lut 2017, o 10:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[maverick_as]]></name></author>
<updated>2017-02-07T07:33:22+01:00</updated>
<published>2017-02-07T07:33:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181919#p181919</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181919#p181919"/>
<title type="html"><![CDATA[Re: Programowy PWM 9 bit na liczniku 16 bitowym.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181919#p181919"><![CDATA[
Przy 5 serwach ,rozważ zastosowanie układu PCA9685 firmy NXP. Jest to 16 kanałowy, 12 bitowy kontroler PWM sterowany magistralą I2C.<br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9169">maverick_as</a> — 7 lut 2017, o 07:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[idzik15]]></name></author>
<updated>2017-02-07T00:07:05+01:00</updated>
<published>2017-02-07T00:07:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181907#p181907</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181907#p181907"/>
<title type="html"><![CDATA[Programowy PWM 9 bit na liczniku 16 bitowym.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17559&amp;p=181907#p181907"><![CDATA[
Witam,<br /><br />chcę zrealizować programowy PWM o rozdzielczości 9 bit, oraz częstotliwości 50Hz na liczniku 16 bitowym na atmedze32.<br />Moim dotychczasowym pomysłem było skorzystanie z trybu CTC. W momencie zliczenia do 511, wywoływane jest przerwanie.<br />uC jest taktowany zegarem 8MHz.<br />8MHz/8/512 = 1953<br />1953/50 = 39 taktów<br /><br />Dlaczego programowy? Bo potrzebuję PWM na 5 kanałach (dla 5 serw).<br /><br />[syntax=c]int main(void) {<br />    DDRD &amp;= ~(1&lt;&lt;PD5); <br />    PORTD |= (1&lt;&lt;PD5); <br />    DDRD &amp;= ~(1&lt;&lt;PD4); <br />    PORTD |= (1&lt;&lt;PD4); <br />   <br />    PWM_9bit(); <br />    sei();<br />    <br />    while(1)<br />    {<br />        if (bit_is_clear(PIND, PD4))<br />        {<br />            pwm_9bit=38;<br />            _delay_ms(10);<br />        }<br />        <br />        if (bit_is_clear(PIND, PD5))<br />        {<br />            pwm_9bit=pwm_9bit+1;<br />            _delay_ms(10);<br />        }<br />    }<br />}[/syntax]<br />[syntax=c]void PWM_9bit (void)<br />{<br />    DDRA |= (1&lt;&lt;PA4) | (1&lt;&lt;PA3) | (1&lt;&lt;PA2) | (1&lt;&lt;PA1) | (1&lt;&lt;PA0); //output<br />    TCCR1B |= ( (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)); // Tryb CTC<br />    TCCR1B |= ( (1&lt;&lt;CS11) | (1&lt;&lt;CS10) ); //preskaler=8<br />    //TCNT1 = 473; <br />    ICR1 = 511; <br />    TIMSK |= (1&lt;&lt;OCIE1A); //zezwolenie na przerwanie comp<br />}[/syntax]<br /><br />[syntax=c]ISR ( TIMER1_COMPA_vect ) //procedura obslugi przerwania<br />{<br />    static uint16_t cnt_9bit; //definicja naszego licznika PWM<br />    TCNT1 = 473; <br />    //ICR1 = 511;<br />    <br />    if(cnt_9bit&gt;=pwm_9bit) PORTA &amp;= ~(1&lt;&lt;PA0); else PORTA |= (1&lt;&lt;PA0);<br />    <br />    cnt_9bit++;<br />    <br />    while (cnt_9bit &gt; 511)<br />    {<br />        cnt_9bit=0;   <br />    }<br />}[/syntax]<br /><br />Niestety taki pomysł nie działa.<br /><br />Wcześniej na liczniku 8-bitowym zrealizowałem takiego PWM'a przy użyciu przerwania OVF (działa). <br />Czy tu ma to sens zastosować ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13563">idzik15</a> — 7 lut 2017, o 00:07</p><hr />
]]></content>
</entry>
</feed>