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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-03-25T16:02:26+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=5404&amp;mode</id>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-25T16:02:26+01:00</updated>
<published>2014-03-25T16:02:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75709#p75709</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75709#p75709"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75709#p75709"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />zmienna = zmienna + 10;<br /></div>do tego samego doszedłem właśnie rano przy wizycie w wc że brakowało mi miejsca gdzie ma ta nowa wartość być umieszczona i że to tak w locie się nie dzieje :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 25 mar 2014, o 16:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-03-25T08:59:56+01:00</updated>
<published>2014-03-25T08:59:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75665#p75665</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75665#p75665"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75665#p75665"><![CDATA[
Działanie:<br /><em>++zmienna;</em><br />to jest to samo co:<br /><em>zmienna = zmienna + 1;</em><br /><br />Linia:<br /><em>zmienna + 10;</em><br />nic nie robi, a dopiero:<br /><em>zmienna = zmienna + 10;</em><br />lub:<br /><em>zmienna += 10;</em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 mar 2014, o 08:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-24T13:24:56+01:00</updated>
<published>2014-03-24T13:24:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75565#p75565</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75565#p75565"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=75565#p75565"><![CDATA[
Hej ponownie ja :] problem dlaczego mi nie reaguje T0 póki co odstawiłem i poszedłem w kierunku ręcznego ustawienia żeby co każdą zmianę OCRA nie wgrywać całego programu to też podpiąłem 4 mikroswitche pod 4 wejścia dla jednego chciałbym aby OCR był zwiększony o 1 a drugiego zwiększony o 10 i dla pozostałych dwóch gdy wciśnięty zmniejszony o 1 i zmniejszony o 10, wszystko jest fajnie przerwania się generują klawisze reagują tylko tylko problem jest przy zwiększeniu jeśli dam zwykłą inkrementację działa jak należy ale gdy próbóje zapisu &quot; zmienna +10&quot; dostaje komunikat że działanie nie przyniesie efektu, większe problemy udaję mi się jakoś rozwiązać a na prostych rzeczach się wykładam ;] jakby to rozwiązać? dodać zmienne z określonymi parametrami i je dodawać do poprzedniej wartości czy inną jeszcze droga?<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 02-01-2014<br /> *      Author: Administrator<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define PWM_1 (1&lt;&lt;PB7)<br />#define WEJ (1&lt;&lt;PD7)<br />#define LED_2 (1&lt;&lt;PD4)<br />#define LED_2_TOG PORTD ^= LED_2<br /><br />#define KL_1 (1&lt;&lt;PB0)<br />#define KL_2 (1&lt;&lt;PB1)<br />#define KL_3 (1&lt;&lt;PB2)<br />#define KL_4 (1&lt;&lt;PB4)<br /><br />#define KEY_DOWN1 !(PINB &amp; KL_1)<br />#define KEY_DOWN2 !(PINB &amp; KL_2)<br />#define KEY_DOWN3 !(PINB &amp; KL_3)<br />#define KEY_DOWN4 !(PINB &amp; KL_4)<br /><br />volatile uint16_t zmienna;<br />volatile uint8_t imp_na_sek;<br /><br />int main(void)<br />{<br />//wewnętrzny prescaler CPU<br />CLKPR = (1&lt;&lt;CLKPCE);<br />//prescaler = 1<br />CLKPR = 0;<br /><br />   //ustawienie czujnika<br />   //DDRD &amp;= ~WEJ; //ustawienie portu jako wejście<br />   DDRD |= LED_2 ; wbudowana led jako kontrolka<br />   PORTD |= WEJ | LED_2;//wybrany pin 7 do odczytu, podciagnięcie do Vcc<br /><br /><br />   DDRB |= PWM_1; //ustawienie portu B jako wyjście, pin 7<br /> PORTB |= KL_1 | KL_2 | KL_3 | KL_4 ; // podciągnięcie do Vcc klawiszy<br /><br />   //ustawienia licznika 0 tryb zwykłej pracy<br />   // ustawienie licznika 2 odczyt stanu licznika 0<br /><br />      TCCR0A = 0;<br />      TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00); // zewnętrzny zegar wejcie T0 (D7), rosnące zbocze<br />      //timer2 jako timer systemowy 10ms<br />      OCR2A = F_CPU/100/1024 -1 ; //77.125<br />      TCCR2A |= (1&lt;&lt;WGM21); //tryb CTC<br />      TCCR2B |= (1&lt;&lt;CS22) |(1&lt;&lt;CS21) |(1&lt;&lt;CS20); //preskaler 1024<br />      TIMSK2 |= (1&lt;&lt;OCIE2A); //włącz przerwania<br />      sei();<br /><br />   // ustawienie licznika 1 do PWM OCR na TOP, preskaler 1024<br />   TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);<br />   TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)| (1 &lt;&lt; CS12)| (1&lt;&lt;CS10) ;<br /><br />//przerwania<br />   PCICR |= (1&lt;&lt;PCIE0); //zezwolenie na przerwania PCINT<br />   PCMSK0 |= (1&lt;&lt;PCINT0) | (1&lt;&lt;PCINT1) | (1&lt;&lt;PCINT2) | (1&lt;&lt;PCINT3); // przerwania na portach B 0.1.2.3<br /><br />    while(1)<br />    {<br />        //zmienna= 250;<br />    OCR1A=zmienna;<br />    OCR1C=zmienna/4;<br />    }<br />}<br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />   //raz na 10ms<br />   static uint8_t licznik;<br />   licznik++;<br />   if(licznik &gt;= 100)<br />   {<br />      //raz 5 sekund<br />      licznik = 0;<br />      imp_na_sek = TCNT0; //odczytaj wartość licznika timera0<br />      TCNT0 = 0;<br />      LED_2_TOG;<br />    }<br /><br />}<br /><br />ISR(PCINT0_vect)<br />{<br />if (KEY_DOWN1)<br />{<br />_delay_ms(80);<br />if (KEY_DOWN1) {++zmienna;}<br />}<br />if (KEY_DOWN2)<br />{<br />_delay_ms(80);<br />if (KEY_DOWN2) {--zmienna;}<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 24 mar 2014, o 13:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-03-12T19:56:44+01:00</updated>
<published>2014-03-12T19:56:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=74030#p74030</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=74030#p74030"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=74030#p74030"><![CDATA[
Maksymalnie 65535 = 0xFFFF<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 12 mar 2014, o 19:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-11T18:39:21+01:00</updated>
<published>2014-03-11T18:39:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73873#p73873</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73873#p73873"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73873#p73873"><![CDATA[
jeszcze mam w sumie jedno pytanie odnoście Timera1, w DS mam cała tabelkę z trybami pracy, fast pwm mam 8,9 i 10 bitowy i zwykły fast pwm z ocr na top, jako że timer1 jest 16 bitowy rozumiem że i w tym trybie OCRA ma 16 bitów więc mogę do niego wpisać wartość większą niż 255 ale max 65,536<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 11 mar 2014, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-03-07T18:57:29+01:00</updated>
<published>2014-03-07T18:57:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73336#p73336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73336#p73336"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73336#p73336"><![CDATA[
Napisz najprostszy program przepisujący stan wejścia na wyjście i tak to sprawdź. Może wystarczy dodać tranzystor npn + rezystor.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 mar 2014, o 18:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-07T16:00:34+01:00</updated>
<published>2014-03-07T16:00:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73322#p73322</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73322#p73322"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73322#p73322"><![CDATA[
Dalej nic efekt taki jak poprzednio zmiana zbocza nie pomogła, co dziwniejsze podając impulsy bezpośrednio z czujnika na wejście uC również ich nie wychwytuje, i nie wiem czy to może wina uC że się nie wyrabia z ich łapaniem czy może wina zbudowanego tam układu do którego nie mam dokładnego schematu jak co jest podłączone, ale coś mi się wydaje że programowo to tego nie rozwiąże.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 7 mar 2014, o 16:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-06T00:27:58+01:00</updated>
<published>2014-03-06T00:27:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73174#p73174</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73174#p73174"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73174#p73174"><![CDATA[
to samo mi przyszło na myśl, bo kanał podpiąłem zaraz za czujnikiem a dalej leci on przez parę transoptorów bodajże. w piątek będę na uczelni sprawdzę jaki sygnał trafia na wejście. Jeszcze pytanie do długość impulsu jeśli zwiększam obroty również zwiększy się czas stąd pomysł z odwróceniem tego przez zapis 255 - imp_na_sek, myślisz że zda to egzamin? sprawdzę też pomysł z OC1A tylko nie wiem czy nie jest już zajęte przez coś<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 6 mar 2014, o 00:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-03-05T21:40:19+01:00</updated>
<published>2014-03-05T21:40:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73149#p73149</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73149#p73149"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73149#p73149"><![CDATA[
T0 nie zlicza. Możliwe, że dlatego, że na wejście podajesz szpilki. Spróbuj zmienić zbocze T0 na opadające.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 5 mar 2014, o 21:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-03-04T16:03:58+01:00</updated>
<published>2014-03-04T16:03:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73007#p73007</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73007#p73007"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=73007#p73007"><![CDATA[
ok świeżo po testach coś zaczęło działać, jest pwm na wyjściu tylko jest stały nagrałem filmik z wykresem jak on się zachowuje<br /><br />Czerwony wykres to sygnały z otrzymywane z czujnika, niebieski z wyjścia na PB7<br /><br /><a href="http://youtu.be/bR0odEvDcWA"  class="postlink">http://youtu.be/bR0odEvDcWA</a><br /><br />i jeszcze wersja programu z testu<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 02-01-2014<br /> *      Author: Administrator<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define PWM_1 (1&lt;&lt;PB7)<br /><br />volatile uint8_t zmienna;<br />volatile uint8_t imp_na_sek;<br /><br />int main(void)<br />{<br />//wewnętrzny prescaler CPU<br />CLKPR = (1&lt;&lt;CLKPCE);<br />//prescaler = 1<br />CLKPR = 0;<br /><br />   //ustawienie czujnika<br />   DDRD &amp;= ~(1&lt;&lt;PD7); //ustawienie portu jako wejście<br />   PORTD |= (1&lt;&lt;PD7);//wybrany pin 7 do odczytu, podciagnięcie do Vcc<br /><br />   DDRB |= PWM_1; //ustawienie portu B jako wyjście, pin 7<br /><br /><br />   //ustawienia licznika 0 tryb zwykłej pracy<br />   // ustawienie licznika 2 odczyt stanu licznika 0<br /><br />      TCCR0A = 0;<br />      TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS01)| (1&lt;&lt;CS00); // zewnętrzny zegar wejcie T0 (D7), rosnące zbocze<br />      //timer2 jako timer systemowy 10ms<br />      OCR2A = F_CPU/100/1024 -1 ; //77.125<br />      TCCR2A |= (1&lt;&lt;WGM21); //tryb CTC<br />      TCCR2B |= (1&lt;&lt;CS22) |(1&lt;&lt;CS21) |(1&lt;&lt;CS20); //preskaler 1024<br />      TIMSK2 |= (1&lt;&lt;OCIE2A); //włącz przerwania<br />      sei();<br /><br />   // ustawienie licznika 1 do PWM OCR na TOP, preskaler 1024<br />   TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;COM1C0) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);<br />   TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)| (1 &lt;&lt; CS12) | (1&lt;&lt;CS10);<br /><br /><br />    while(1)<br /><br />    {<br />    zmienna= 255 - imp_na_sek;<br />    OCR1A=zmienna;<br />    OCR1C=zmienna/2;<br />    }<br />}<br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />   //raz na 10ms<br />   static uint8_t licznik;<br />   licznik++;<br />   if(licznik &gt;= 100)<br />   {<br />      //raz 5 sekund<br />      licznik = 0;<br />      imp_na_sek = TCNT0; //odczytaj wartość licznika timera0<br />      TCNT0 = 0;<br />    }<br />}[/syntax]<br /><br />w pętli głównej przy zapisaniu [syntax=c]OCR1A=imp_na_sek;<br />    OCR1C=imp_na_sek/2;[/syntax] sygnał pwm zachowuje się tak samo<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 4 mar 2014, o 16:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-02-26T19:08:13+01:00</updated>
<published>2014-02-26T19:08:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72162#p72162</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72162#p72162"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72162#p72162"><![CDATA[
<div class="quotetitle">L.h.michalak napisał(a):</div><div class="quotecontent"><br />a czemu tutaj akurat OCR1A i OCR1C  do ustawiania wypełnienia i czasu?<br /></div><br />Bo tak jest w specyfikacji procesora przy opisie fast PWM dla trybu 15. Jak wybierzesz inny tryb to będzie inaczej. <br />50% możesz też generować na nóżce OC1A dla tego trybu i nie korzystać z innego rejestru do ustawiania wypełnienia. Wystarczy, że ustawisz bity COM1A1 i COM1A0 na 0 i 1. Wtedy przy każdym doliczeniu timera do OCR1A wyprowadzenie OC1A zmieni stan na przeciwny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 26 lut 2014, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-02-26T18:06:23+01:00</updated>
<published>2014-02-26T18:06:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72155#p72155</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72155#p72155"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72155#p72155"><![CDATA[
a czemu tutaj akurat OCR1A i OCR1C  do ustawiania wypełnienia i czasu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 26 lut 2014, o 18:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-02-25T19:13:53+01:00</updated>
<published>2014-02-25T19:13:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72032#p72032</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72032#p72032"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72032#p72032"><![CDATA[
<div class="quotetitle">L.h.michalak napisał(a):</div><div class="quotecontent"><br />[syntax=c]// ustawienie licznika 1 do PWM OCR na TOP, preskaler 1024<br />   TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;COM1C0) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);<br />   TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)| (1 &lt;&lt; CS12) | (1&lt;&lt;CS10);[/syntax]<br /></div><br />W tym trybie zresztą jak sam piszesz to OCR1A wyznacza TOP, więc powinno to wyglądać tak:<br />[syntax=c]OCR1A=imp_na_sek;<br />OCR1C=imp_na_sek/2;[/syntax]<br />To bardzo dobry tryb, bo OCR1A jest buforowany w przeciwieństwie do ICR1, a tutaj TOP ciągle się zmienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 lut 2014, o 19:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-02-25T16:47:59+01:00</updated>
<published>2014-02-25T16:47:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72014#p72014</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72014#p72014"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=72014#p72014"><![CDATA[
Kurczak brakuje mi pomysłów co jeszcze może mi stać na przeszkodzie działania tego ustrojstwa, dzisiaj również dostawałem równą linie na wyjściu dla Pwm, posprawdzałem jeszcze raz połączenia, przepiąłem wejście sygnału pod T0, sygnały dochodzą, program wydaje się być teoretycznie dobry, ten licznik 0 nie daje mi spokoju co mu może szkodzić. Może impulsy są za słabe? z tego  co z oscyloskopu odczytałem mają około 1.5V, ale jak teraz jeszcze patrze przy wklejaniu kodu nie zdziwiłbym się jakbym skopał przy ustawianiu T0 jako wejścia.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 02-01-2014<br /> *      Author: Administrator<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define PWM_1 (1&lt;&lt;PB7)<br /><br />volatile uint8_t imp_na_sek;<br /><br />int main(void)<br />{<br />//wewnętrzny prescaler CPU<br />CLKPR = (1&lt;&lt;CLKPCE);<br />//prescaler = 1<br />CLKPR = 0;<br /><br />   //ustawienie czujnika<br />   DDRD |= ~(1&lt;&lt;PD7); //ustawienie portu jako wejście<br />   PORTD |= (1&lt;&lt;PD7);//wybrany pin 7 do odczytu, podciagnięcie do Vcc<br /><br />   DDRB |= PWM_1; //ustawienie portu B jako wyjście, pin 7<br /><br /><br />   //ustawienia licznika 0 tryb zwykłej pracy<br />   // ustawienie licznika 2 odczyt stanu licznika 0<br /><br />      TCCR0A = 0;<br />      TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00); // zewnętrzny zegar wejcie T0 (D7), rosnące zbocze<br />      //timer2 jako timer systemowy 10ms<br />      OCR2A = F_CPU/100/1024 -1 ; //77.125<br />      TCCR2A |= (1&lt;&lt;WGM21); //tryb CTC<br />      TCCR2B |= (1&lt;&lt;CS22) |(1&lt;&lt;CS21) |(1&lt;&lt;CS20); //preskaler 1024<br />      TIMSK2 |= (1&lt;&lt;OCIE2A); //włącz przerwania<br />      sei();<br /><br />   // ustawienie licznika 1 do PWM OCR na TOP, preskaler 1024<br />   TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;COM1C0) | (1&lt;&lt;WGM11) | (1&lt;&lt;WGM10);<br />   TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)| (1 &lt;&lt; CS12) | (1&lt;&lt;CS10);<br /><br /><br />    while(1)<br /><br />    {<br />    ICR1=imp_na_sek;<br />    OCR1C=imp_na_sek/2;<br />    }<br />}<br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />   //raz na 10ms<br />   static uint8_t licznik;<br />   licznik++;<br />   if(licznik &gt;= 100)<br />   {<br />      //raz 5 sekund<br />      licznik = 0;<br />      imp_na_sek = TCNT0; //odczytaj wartość licznika timera0<br />      TCNT0 = 0;<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 25 lut 2014, o 16:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-02-24T18:26:29+01:00</updated>
<published>2014-02-24T18:26:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71849#p71849</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71849#p71849"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71849#p71849"><![CDATA[
<div class="quotetitle">L.h.michalak napisał(a):</div><div class="quotecontent"><br />Hmm co do bitów tak wiem że domyślnie są wszystkie wyzerowane, ale to mnie zdziwiło zerując jeden bit WGM pozostałe 3 dostają 1 ?<br /></div> Tu też się mylisz. Do ustawiania bitów używa się takiej konstrukcji:<br />[syntax=c]PORTB |= (1&lt;&lt;PB4); //tylko bit PB4 zostanie ustawiony, a pozostałe niezmienione<br />//co jest równoważne:<br />PORTB |= (1&lt;&lt;4);<br />PORTB |= 0b00010000; <br />PORTB = PORTB | 0b00010000; // | czegokolwiek z 0 nic nie zmienia[/syntax]<br />do zerowania:<br />[syntax=c]PORTB &amp;= ~(1&lt;&lt;PB4); //tylko bit PB4 zostanie wyzerowany, a pozostałe niezmienione<br />//co jest równoważne:<br />PORTB &amp;= ~(1&lt;&lt;4);<br />PORTB &amp;= ~0b00010000;<br />PORTB &amp;= 0b11101111; <br />PORTB = PORTB &amp; 0b11101111; // &amp; czegokolwiek z 1 nic nie zmienia[/syntax]<br />Jak zmieszasz jedno z drugim:<br />[syntax=c]PORTB |= ~(1&lt;&lt;PB4); //zły przykład, bo wszystkie inne bity zostaną ustawione a PB4 niezmieniony<br />//co jest równoważne:<br />PORTB |= ~(1&lt;&lt;4);<br />PORTB |= ~0b00010000; <br />PORTB |= 0b11101111; <br />PORTB = PORTB | 0b11101111;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 lut 2014, o 18:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-02-24T00:02:43+01:00</updated>
<published>2014-02-24T00:02:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71791#p71791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71791#p71791"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71791#p71791"><![CDATA[
Tak kolejna porcja wiedzy z datasheetów i przypuszczenia miałem prawidłowe, źle było adresowane wejście licznika 0 ( tak to jest korzystać z czyichś notatek i instrukcji) muszę je przepiąć pod T0. I tak próbowałem też tego przechwytywania ICr=imp_na_sek i OCR=imp_na_sek/2 ale skoro na wejściu nie było sygnału to szkoda żeby działało :] zabieram się za poprawki i ponowne testy.<br /><br />Hmm co do bitów tak wiem że domyślnie są wszystkie wyzerowane, ale to mnie zdziwiło zerując jeden bit WGM pozostałe 3 dostają 1 ? poprawię to chyba na standardowy sposób ustawiania 1 tylko dla tych potrzebnych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 24 lut 2014, o 00:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-02-21T18:27:54+01:00</updated>
<published>2014-02-21T18:27:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71399#p71399</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71399#p71399"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71399#p71399"><![CDATA[
1 i 1a. ICR jest wartością odpowiadającą za okres, a OCR za wypełnienie (z tym, że niekoniecznie  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ). Generalnie zawsze należy sprawdzić w specyfikacji jaki tryb został wybrany za pomocą bitów WGMxy. ICR powinno być większe od OCR. Do ICR wpisuj imp_na_sek a do OCR imp_na_sek/2<br />2. Jak chcesz zliczać impulsy sprzętowo to musisz wykorzystać dedykowane wejście T0, ale możesz też zliczać programowo, badając stan dowolnego z wejść.<br />3. Napisać najprostszy program do migania LEDem co sekundę. Preskaler można też zmienić podczas działania programu.<div class="quotetitle">L.h.michalak napisał(a):</div><div class="quotecontent"><br />[syntax=c]TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;COM1C0) | (1&lt;&lt;WGM11) | ~(1&lt;&lt;WGM10);[/syntax]<br /></div><br /><br />Nigdy nie używaj takiej konstrukcji. Czy wiesz, że samo:<br />[syntax=c]TCCR1A |= ~(1&lt;&lt;WGM10);[/syntax]<br />ustawia wszystkie bity poza WGM10.<br />Domyślnie większość bitów jest wyzerowana i nie trzeba się nimi martwić, a tylko ustawić te bity co mają mieć 1, a jak już chcesz wyzerować bity to zrób to w osobnej linijce.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 21 lut 2014, o 18:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-02-21T15:10:37+01:00</updated>
<published>2014-02-21T15:10:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71353#p71353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71353#p71353"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=71353#p71353"><![CDATA[
Witam ponownie ;] po kilku próbach i poprawkach i godzin przed książką i kodem kolejna porcja pytań<br /><br />1. problem przy ustawianiu PWM, przy ręcznym wpisywaniu ustawień OCR i ICR dostaje ładny wykres przebiegu natomiast przy przypisywaniu ze zmiennej dostaje ciągłą linie (zakładam że błąd jest w sposobie zapisywania do ICR/OCR lub złym funkcjonowaniu licznika) czy do zapisania zmiennej w rejestr wystarczy zwykłe [syntax=c]ICR3 = imp_na_sek[/syntax]  ?<br /><br />1a. Przy ustawieniu trybu fast pwm i ICR na top ICR odpowiada za okres impulsu a OCR za wypełnienie, czy na odwrót? u siebie chciałbym regulować okres a wypełnienie mieć stałe 50%<br /><br />2. przy ustawieniu licznika w tryb zwykłej pracy (czyli zliczanie impulsów) taktowanie musi być z wyjścia T0, czyli jak mam impulsy do zliczenia na wejściu D1 to i tak do wejścia T0 musze podpiąć zewnętrzny zegar? czy może impulsy mają trafiać na wejście T0<br /><br />3. Ciekawostka dotycząca samego układu at90usb1287 domyślnie jest dostarczany z kwarcem 8MHz i zprogramowanym preskalerem 8 co daje wyjściowe 1 MHz, jest jakiś sposób by sprawdzić aktualną częstotliwość pracy układu?<br /><br />dorzucę jeszcze kod całego programu w razie potrzeb<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 02-01-2014<br /> *      Author: Administrator<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#define LED_PIN (1&lt;&lt;PD2)<br />#define LED_TOG PORTD ^= LED_PIN<br />#define PWM_1 (1&lt;&lt;PB7)<br /><br />volatile uint8_t imp_na_sek;<br /><br />int main(void)<br />{<br />//wewnętrzny prescaler CPU<br />CLKPR |= (1&lt;&lt;CLKPCE);<br />//prescaler = 1<br />CLKPR = 0;<br /><br />   //ustawienie czujnika<br />   DDRD &amp;= ~(1&lt;&lt;PD1); //ustawienie portu jako wejście<br />   PORTD |=(1&lt;&lt;PIND1); //wybrany pin 0 do odczytu, podciagnięcie do Vcc<br /><br />   DDRB |= PWM_1; //ustawienie portu B jako wyjście, pin 7<br /><br /><br />  //ustawienia licznika 1<br /><br />      TCCR0A = 0;<br />      TCCR0B |= (1&lt;&lt;CS01); // wewnętrzny zegar, (preskaler 8)<br />      //timer2 jako timer systemowy 10ms<br />      OCR2A = F_CPU/100/1024 -1 ; //77.125<br />      TCCR2A |= (1&lt;&lt;WGM21); //tryb CTC<br />      TCCR2B |= (1&lt;&lt;CS22) |(1&lt;&lt;CS20); //preskaler 1024<br />      TIMSK2 |= (1&lt;&lt;OCIE2A); //włącz przerwania<br />      sei();<br /><br />    // ustawienie licznika 2 do PWM ICR na TOP<br />   TCCR1A |= (1&lt;&lt;COM1C1) | (1&lt;&lt;COM1C0) | (1&lt;&lt;WGM11) | ~(1&lt;&lt;WGM10);<br />   TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13)| (1 &lt;&lt; CS12) | (1&lt;&lt;CS10);<br /><br /><br />    while(1)<br /><br />    {<br />    ICR1=200;<br />    OCR1C=imp_na_sek;<br />    }<br />}<br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />   //raz na 10ms<br />   static uint8_t licznik;<br />   licznik++;<br />   if(licznik &gt;= 100)<br />   {<br />      //raz 5 sekund<br />      licznik = 0;<br />      imp_na_sek = TCNT0; //odczytaj wartość licznika timera0<br />      TCNT0 = 0;<br />    }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 21 lut 2014, o 15:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-01-30T21:25:21+01:00</updated>
<published>2014-01-30T21:25:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67517#p67517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67517#p67517"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67517#p67517"><![CDATA[
tak się zastanawiam dalej bo w sumie mógłbym te zliczone impulsy podzielić przez 3 i wpisywać do ICR3 i miałbym wtedy szerokośc impulsu mniej więcej dobraną która zakładam że będzie się zgrywała (choć w to wątpie, ale jakoś działać musi) i OCR3 ustawiać jako 1/2 ICR3 wtedy impuls miałby zawsze 50% wypełnienia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 30 sty 2014, o 21:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-01-28T16:39:21+01:00</updated>
<published>2014-01-28T16:39:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67087#p67087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67087#p67087"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=67087#p67087"><![CDATA[
Troche się zaczytałem ;] ok już tłumacze jaki jest konkretny cel w stosowaniu PWM. A więc głownym celem jest podanie obciążenia na turbine w odpowiednim momencie.<br /><a href="http://forum.atnel.pl/_obrazki/o/2355/7acab3cc73f06e8c25dfc6f4d5f7827c.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2355/7acab3cc73f06e8c25dfc6f4d5f7827c.png" alt="Obrazek" /></a><br /><br />kiedy łopata zbliża się do cienia wieży obciążenie ma być jak najmniejsze i dopiero kiedy wejdzie w cień wieży ma ono być dołączane, Przy stałej prędkości to nie jest trudne i tutaj wystarczyło by dobrać okreś trwania impulsu i wypełnienie 50%, jednak że to ma być aktywne sterowanie i zakładając że obroty mogą się zmieniać nie mogę użyć tutaj rozwiązania ze stałym okresem, im większe obroty tym mniejszy okres impulsu tak aby hmm zdążył się wyrobić między łopatami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 28 sty 2014, o 16:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-01-23T19:28:20+01:00</updated>
<published>2014-01-23T19:28:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66374#p66374</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66374#p66374"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66374#p66374"><![CDATA[
W wzorze ma być 100  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> jak 100Hz<br />Sztywny ten wzór nie jest bo jest jeszcze preskaler 1024 lub inny, ale obliczając sobie na oko musisz się zmieścić w OCR2A, który może mieć maksymalnie 255. Jeśli się nie udaje to wtedy przechodzimy na inną częstotliwość np. 1kHz, a licznik w przerwaniu musi zliczyć 1000 i wtedy musi mieć rozmiar 16bit (uint16_t). Licznik oczywiście można porównywać z większą liczbą uwzględniając pojemność zmiennej. Dla prędkości 1000 obr/min (przy 3 impulsach na obrót) wyjdzie 3*1000/60 = 50, a dla 3000 wyjdzie 3*3000/60 = 150, więc spokojnie się zmieści.<br /><br />Aby przenieść to na PWM to myślę że wystarczy wpisać wprost do OCR3A, a ICR3 powinien mieć stałą wartość np. 200 i wtedy dla 50 masz wypełnienie 50/200 = 25% dla 100 - 50% i dla 150 - 75%. Większa prędkość -&gt; większe wypełnienie i bardziej obciążysz turbinę. Oczywiście można jeszcze liczbę impulsów potraktować jakąś funkcją i wtedy wpisać do OCR3A. To już zależy co dokładnie ma się dziać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 sty 2014, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-01-22T19:08:37+01:00</updated>
<published>2014-01-22T19:08:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66199#p66199</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66199#p66199"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66199#p66199"><![CDATA[
Ok prosty i przejrzysty o to mi chodziło jeden jako licznik drugi w trybie CTC czyli liczy do OCR2A i przerwanie, pytanie mam co do wzoru <br />[syntax=c]OCR2A = F_CPU/1000/1024 -1 ; //100Hz[/syntax] jest to jakiś &quot;sztywny&quot; wzór czy trzeba go odpowiednio dobrać wg swoich parametrów aby te 10ms otrzymać ( dokładniej mnie zastanawia skąd się ten 1000 wziął) bo przy częstotliwości 16Mhz wychodzi mi tu 15 z groszami. Wartośc obrotów będzie się zmieniać może to być 1000 a może też być chyba 3000 obr/min nie więcej, więc w liczniku powinno się to zmieścić przeliczając na impulsy na sekunde, w przerwaniu rozumiem określany jest czas przechwycenia 1s gdybym chiciał np 5 czy 10 sekund najwygodniej jest zmienić myśle wartośc tutaj<br />[syntax=c]if(licznik &gt;= 100)[/syntax]<br />zamiast 100 odpowiednio dla 5s -500 i dla 10s - 1000<br /><br />drugie pytanie jak z tego przejśc do określenia pwm? mając już impulsy/sek mamy w sumie częstotliwość z której można policzyć okres (T=1/f) starczy wpisać to w rejestry kolejnego licznika ustawionego w tryb pwm? w dobrą strone myślę czy już coś pomieszałem?<br />PS. przyszedł mi już BB takżę będę dokładniej mógł zgłębić ten temat :]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 22 sty 2014, o 19:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-01-21T19:19:08+01:00</updated>
<published>2014-01-21T19:19:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66050#p66050</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66050#p66050"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=66050#p66050"><![CDATA[
Zapominamy o przechwytywaniu  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" />  Ten tryb pracy się tu nie nadaje. Na razie skup się na jednej rzeczy, czyli wyznaczeniu prędkości obrotowej. Masz 3 impulsy na obrót i około 2000 obr/min, czyli 3 * 2000 impulsów/min =  6000 impulsów/min =&gt; 100 impulsów/sek i tego się trzymasz. Jeden timer ma pracować jako licznik tzn., że taktowany jest z wejścia T...(wejście które posiada aką alternatywną funkcję), a nie razem z procesorem. Drugi timer należy skonfigurować aby generował przerwanie co 1 sekundę co nie zawsze się da, ale można sobie w przerwaniu zwielokrotnić mniejszy czas. Pierwszy z timerów zlicza sobie impulsy podawane na wejście, a drugi co sekundę odczytuje jego wartość i zeruje. Przykład:<br />[syntax=c]volatile uint8_t imp_na _sek;<br />int main()<br />{<br />   //LED<br />   DDRD |= (1&lt;&lt;DD7); //wyjście<br />   //timer0 jako licznik impulsów zewnętrznych<br />   TCCR0A = 0;<br />   TCCR0B |= (1&lt;&lt;CS02) | (1&lt;&lt;CS01); //zewnętrzny zegar, (opadające zbocze)<br />   //timer2 jako timer systemowy 10ms<br />   OCR2A = F_CPU/1000/1024 -1 ; //100Hz<br />   TCCR2A |= (1&lt;&lt;WGM21); //tryb CTC<br />   TCCR2B |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) |(1&lt;&lt;CS20); //preskaler 1024<br />   TIMSK2 |= (1&lt;&lt;OCIE2A); //włącz przerwania <br />   sei();<br /><br />   while(1)<br />   {<br />      if(impulsy_na_sek &gt; 100) PORTD |= 1&lt;&lt;PD7; //włącz obciążenie<br />      else PORTD &amp;= ~(1&lt;&lt;PD7); //wyłącz obciążenie<br />   }<br />   return 0;<br />}<br />ISR(TIMER2_COMPA_vect)<br />{<br />   //raz na 10ms<br />   static uint8_t licznik;<br />   licznik++;<br />   if(licznik &gt;= 100)<br />   {<br />      //raz sekundę<br />      licznik = 0;<br />      imp_na_sek = TCNT0; //odczytaj wartość licznika timera0<br />      TCNT0 = 0;<br />   }   <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 21 sty 2014, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[L.h.michalak]]></name></author>
<updated>2014-01-21T13:23:24+01:00</updated>
<published>2014-01-21T13:23:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65977#p65977</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65977#p65977"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65977#p65977"><![CDATA[
co mam rozumieć przez wejście przechwytywania? Jakiś oddzielny pin do niego? czy to po prostu to samo wejście przez które zliczam impulsy (PD0)choć to raczej by nie miało sensu. Preskaler mam na 256 wtedy będę miał 62500 impulsów na sekundę, aaa ok czytam i powoli mi się rozjaśnia, jeśli chcę aktualizować drugi licznik co 5-10 sekund to powinno starczyć, co do obliczeń pwm z datasheetu wyczytałem że te 2 wartości właśnie służa do określenia wypełnienia i okresu sygnału, więc pomyślałęm że będzie je dobrze ustawić obliczając częstotliwość i okres z prędkości obrotowej więc do tego skorzystałem z tego wzoru:<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />n = 60 / (ti * ni) <br />n - prędkość obrotowa [obr/min] <br />ti - czas trwania impulsu [s] <br />ni - ilość impulsów na obrót <br /><br />ti = i * p / F_CPU <br />ti - czas trwania impulsu [s] <br />i - ilość zliczonych impulsów w timerze <br />p - preskaler timera <br />F_CPU - częstotliwość taktowania procesora [Hz] <br /><br />czyli <br />n = (60 * F_CPU) / (i * p * ni)<br /></div><br /><br />wirnik ma 3 łopaty dlatego też pełny obrót następuje po 3 impulsach, podzielone przez 60 daje mi liczbę obrotów na sekundę czyli mam częstotliwość i okres ze wzoru 1/f, chyba że moje rozumowanie gdzieś wtedy zawiodło, a i jeszcze jedno do licznika w trybie pwm trzeba prescaler ustawiać?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2355">L.h.michalak</a> — 21 sty 2014, o 13:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-01-17T21:43:56+01:00</updated>
<published>2014-01-17T21:43:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65366#p65366</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65366#p65366"/>
<title type="html"><![CDATA[Re: aktywne sterowanie obciążeniem z pwm]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5404&amp;p=65366#p65366"><![CDATA[
Dla trybu przechwytywania należy użyć takiej konfiguracji:<br />[syntax=c]TCCR1B |= (1&lt;&lt;CS11);/* preskaler = 8 w zależności od potrzeby*/<br />TCCR1B &amp;= ~(1&lt;&lt;ICES1);/* opadające zbocze w zależności od potrzeby*/<br />TIMSK1 |= (1&lt;&lt;ICIE1);/* włącz generowanie przerwania  */<br />TCNT1 = 0; /*wyzerowanie timera*/[/syntax]<br />Twój kod ustawiania licznika 1 jest błędny w sensie tego co chcesz robić.<br />OCR1A to rejestr do porównywania i tu nie należy go używać tylko rejestr ICR1:<br />[syntax=c]ISR(TIMER1_CAPT_vect)<br />{<br /> impuls = ICR1; /*skopiowanie przechwyconej wartości*/<br />TCNT1 = 0; /*wyzerowanie timera*/<br />}[/syntax]<br />To działa w ten sposób, że timer1 sobie liczy impulsy i jak zmieni się stan na wejściu przechwytywania to wtedy aktualna wartość timera1 jest kopiowana do rejestru ICR1 (timer liczy dalej) i zostaje wygenerowane przerwanie które powoduje przeskok do funkcji ISR(TIMER1_CAPT_vect) gdzie spokojnie odczytujesz sobie wartość z ICR1 i zerujesz timer1. Preskaler trzeba tak dobrać, żeby przerwania występowały na tyle często, że timer1 nie przekręci się z 65535 na 0, bo wtedy impulsy nie odpowiadają stanowi faktycznemu. Dziwne jest to obliczenie dla PWM, bo wychodzi na to, że OCR3A = 1/ICR3<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 17 sty 2014, o 21:43</p><hr />
]]></content>
</entry>
</feed>