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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-09-02T18:30:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=23320&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2020-09-02T18:30:44+01:00</updated>
<published>2020-09-02T18:30:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228849#p228849</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228849#p228849"/>
<title type="html"><![CDATA[Re: PWM - ustalanie dwóch wartości napięcia na dwóch pinach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228849#p228849"><![CDATA[
<div class="quotetitle">xpatrgk napisał(a):</div><div class="quotecontent"><br />Jest mozliwosc wystawienia dwóch róznych wartosci napięcia na dwoch roznych pinach przy pomocy jednego kanału pwm?<br /></div><br /><br />Widzę, że nie za bardzo rozumiesz zasadę działania sprzętowego PWM. Nie napisałeś, o jaki dokładnie ATtiny chodzi ani jaką częstotliwością go taktujesz, więc trudno tu przedstawić działający kod, ale tak naprawdę raczej nie będziesz potrzebował ani dwóch timerów ani przerwania. Na przykład dla ATtiny2313 można zrobić mniej więcej tak (nie mam możliwości przetestownia):[syntax=c]#include &lt;avr/io.h&gt;<br /><br />void pwmInit();<br /><br />int main(void)<br />{<br />    uint8_t pwmLeft = 0, pwmRight = 0;<br />    pwmInit();<br />    while (1) <br />    {<br />        // obliczenie pwmLeft<br />        // pwmLeft = ?<br />        // obliczenie pwmRight<br />        // pwmRight = ?<br />        OCR0B = pwmLeft;<br />        OCR0A = pwmRight;<br />        // reszta kodu<br />    }<br />}<br /><br />void pwmInit()<br />{<br />    //inicjalizacja PWM<br />    // piny OC0A (PB2) i OC0B (PB3) jako wyjścia<br />    DDRB |= (1&lt;&lt;PB3) | (1&lt;&lt;PB2);<br />    <br />    // ustawienie TIMER0 w tryb Fast PWM<br />    TCCR0A |= (1&lt;&lt;WGM01) | (1&lt;&lt;WGM00);        // tryb Fast PWM<br />    TCCR0A |= (1&lt;&lt;COM0A1) | (1&lt;&lt;COM0B1);      // sposób generowania PWM - zeruj przy porównaniu<br />    TCCR0B |= (1&lt;&lt;CS02);                    // preskaler = 256<br />}[/syntax]<br /><br />...chyba, że koniecznie potrzebujesz podziału przez 200 lub musisz użyć innych pinów. Wtedy będzie musiał generować programowo w przerwaniu, tylko nieco inaczej, niż to próbowałeś zrobić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 2 wrz 2020, o 18:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miki53]]></name></author>
<updated>2020-09-02T16:58:48+01:00</updated>
<published>2020-09-02T16:58:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228847#p228847</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228847#p228847"/>
<title type="html"><![CDATA[Re: PWM - ustalanie dwóch wartości napięcia na dwóch pinach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228847#p228847"><![CDATA[
Przepraszam ale coś mi się wydaje że w pierwszej części <br />postu z kodem wypisałem bzdury i proszę nie brać<br />tego kodu pod uwagę  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18503">miki53</a> — 2 wrz 2020, o 16:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[miki53]]></name></author>
<updated>2020-09-02T13:38:18+01:00</updated>
<published>2020-09-02T13:38:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228843#p228843</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228843#p228843"/>
<title type="html"><![CDATA[Re: PWM - ustalanie dwóch wartości napięcia na dwóch pinach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228843#p228843"><![CDATA[
Witaj xpatrgk<br /><br />Gdybyś spróbował coś takiego<br /><br />[syntax=c]ISR( TIM1_COMPA_vect )<br />{<br />        static uint8_t cnt; // definicja naszego licznika PWM<br /> <br /> <br />        // bezpośrednie sterowanie wyjściami kanałów PWM<br />        if(cnt &gt;= pwmLeft) PORTB |= (1&lt;&lt;PB2); else PORTB &amp;= ~(1&lt;&lt;PB2);<br /> <br />        if(cnt_1 &gt;= pwmRight) PORTB |= (1&lt;&lt;PB1); else PORTB &amp;= ~(1&lt;&lt;PB1);<br /> <br />        cnt++;  // zwiększanie licznika o 1<br />        cnt_1++;  // zwiększanie licznika o 1[/syntax]<br /><br />Miałbyś dwie zmienne niezależnie dla każdego wyjścia sterowane z jednego PWM<br />I myślę że tu powinna zajść zmiana ( kombinuję bez sprawdzania na sucho więc<br />mogę się mylić )<br />[syntax=c]while (1)<br />        {<br />            //tutaj co 100ms zapisywane sa wartosci do zmiennych, gdy do pwmLeft wpisze sie stala wartosc (np. 100) to analogiczna wartosc napiecia jest ustalana<br />            //natomiast gdy co 100ms wpisywane są odpowiednie przeliczane wartosci x i y to wtedy na obu pinach pojawia sie to samo napiecie<br /> <br />...<br /> <br />             pwmLeft = 100;  // dla y<br />             pwmRight = 100; // dla x<br />             pwmLeft = y;<br />             pwmRight = x;<br />        }<br /> <br />}[/syntax]<br /><br />nie sprawdzałem lecz biorę to na chłopski rozum <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=18503">miki53</a> — 2 wrz 2020, o 13:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xpatrgk]]></name></author>
<updated>2020-09-02T09:22:38+01:00</updated>
<published>2020-09-02T09:22:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228842#p228842</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228842#p228842"/>
<title type="html"><![CDATA[PWM - ustalanie dwóch wartości napięcia na dwóch pinach]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23320&amp;p=228842#p228842"><![CDATA[
Witam, mam problem z PWM na mikrokontrolerze Attiny. A dokładniej chciałem przy pomocy sprzętowego pwm (1kanał Oc0 PB2) wysterowac dwa rozne napiecia na dwoch pinach. Czesciowo mi to zadziałało, a konkretniej gdy ustalane wartosci są inne i zmienne w czasie po probie przypisania ich do pwm wystawiane są takie same wartości pwm (te same napięcia). Natomiast gdy do jednej wpisze jedną stałą wartosc, a do drugiej wartosc przeliczaną co 100ms to wszystko działa poprawnie. Jest mozliwosc wystawienia dwóch róznych wartosci napięcia na dwoch roznych pinach przy pomocy jednego kanału pwm? Wykorzystałem kod z bluebooka. Kod załączam na dole.<br /><br />Celem jest ustalanie dwóch różnych napiec, na dwoch roznych pinach przy pomocy jednego kanału. Gdy wpisuje dwie rozne przeliczone wartosci do zmiennych to wystawiane jest takie same napiecie. Natomiast gdy do jednej wpisuje stałą wartosc a do drugiej przeliczoną to wtedy wystawiane są poprawne napięcia. Spotkał się ktoś z takim przypadkiem i wie w czym leży problem?<br />Z góry bardzo dziękuję za pomoc. <br />Pozdrawiam, Patryk<br /><br />[syntax=c]...<br /><br />volatile uint8_t pwmLeft, pwmRight;<br /><br />void pwmInit()<br />{<br />//inicjalizacja pwm - SPRZĘTOWY PWM - 1 KANAŁ OC0 (PB2)<br />//ustawienie końcówki OC0A (PB2) sprzętowy PWM jako WYJŚCIE<br />DDRB |= (1&lt;&lt;PB2); //PWM L<br />DDRB |= (1&lt;&lt;PB1); // PWM R<br /><br />// ustawienia TIMER0 w Fast PWM<br />TCCR0A |= (1&lt;&lt;WGM01)|(1&lt;&lt;WGM00);// tryb Fast PWM<br />TCCR0A |= (1&lt;&lt;COM0A1);// clear at TOP<br />TCCR0B |= (1&lt;&lt;CS00);// preskaler = 1<br />OCR0A=255;<br /><br />//ustawienie kierunku pinów jako wyjścia<br />DDRB |= (1&lt;&lt;PB2);<br />DDRB |= (1&lt;&lt;PB1);<br />//ustawienie stanow wysokich<br />PORTB |= (1&lt;&lt;PB2);<br />PORTB |= (1&lt;&lt;PB1);<br /><br />//ustawienie TIMER1 w tryb CTC<br />TCCR1B |= (1&lt;&lt;WGM12);// tryb  CTC<br />TCCR1B |= (1&lt;&lt;CS10);// preskaler = 1<br />OCR1A= 199;// dodatkowy podział częsttotliwości przez 200<br />TIMSK1 |= (1&lt;&lt;OCIE1A);// zezwolenie na przerwanie CompareMatch<br />}<br /><br />int main(void)<br />{<br /> . ...<br /><br />        pwmInit();<br /><br />...<br /><br />        while (1)<br />{<br />            //tutaj co 100ms zapisywane sa wartosci do zmiennych, gdy do pwmLeft wpisze sie stala wartosc (np. 100) to analogiczna wartosc napiecia jest ustalana<br />            //natomiast gdy co 100ms wpisywane są odpowiednie przeliczane wartosci x i y to wtedy na obu pinach pojawia sie to samo napiecie<br /><br />...<br /><br />             pwmLeft = 100;<br />             //pwmLeft = y;<br />             pwmRight = x;<br />        }<br /><br />}<br /><br />ISR( TIM1_COMPA_vect )<br />{<br />static uint8_t cnt; // definicja naszego licznika PWM<br /><br /><br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt &gt;= pwmLeft) PORTB |= (1&lt;&lt;PB2); else PORTB &amp;= ~(1&lt;&lt;PB2);<br /><br />if(cnt &gt;= pwmRight) PORTB |= (1&lt;&lt;PB1); else PORTB &amp;= ~(1&lt;&lt;PB1);<br /><br />cnt++;// zwiększanie licznika o 1<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21121">xpatrgk</a> — 2 wrz 2020, o 09:22</p><hr />
]]></content>
</entry>
</feed>