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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23463&amp;mode</id>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2020-12-02T14:30:00+01:00</updated>
<published>2020-12-02T14:30:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230079#p230079</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230079#p230079"/>
<title type="html"><![CDATA[Re: Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230079#p230079"><![CDATA[
Właściwie to o co dokładnie chodzi? O algorytm pomiaru mając czas między impulsami czy może sam pomiar tego czasu impulsu? Jakiego rzędu czasu (lub prędkości <br />obrotowej) orientacyjnie się spodziewasz przy pomiarze? Pytam, bo zrobiłem parę miesięcy temu prędkościomierz dla chomika i tam właśnie mierze czas między impulsami przy każdym obrocie. Wszystko znakomicie działa tyle, że pomiar jest do około 10-12km/h (odczyt z jakiegoś dowolnego pinu)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 2 gru 2020, o 14:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[karlowic]]></name></author>
<updated>2020-12-02T13:10:34+01:00</updated>
<published>2020-12-02T13:10:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230078#p230078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230078#p230078"/>
<title type="html"><![CDATA[Re: Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230078#p230078"><![CDATA[
Próbowałem rozgryźć ten kod ale dla mnie jest zbyt zakręcony. <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> <br /><div class="quotetitle">SK97 napisał(a):</div><div class="quotecontent"><br />muszę obliczyć prędkość obrotową. Pomiar musi być wykonany za pomocą liczenia czasu pomiędzy przerwaniami.<br /></div>Zastanawiam się czy te wymagania są konieczne, bo i tak na końcu program wyświetla częstotliwość obrotów (zmienna &quot;obroty_sek&quot;). Wydaje mi się, że nie trzeba robić skomplikowanego liczenia czasu pomiędzy przerwaniami. Prościej byłoby zliczyć ilość przerwań zewnętrznych (INT1) w określonym czasie ustalonym przez TIMER1. Zamiast dziewięciu wystarczą dwie, trzy zmienne (np.Licznik_przerwań, Liczba_ms, Wynik, ewentualnie Liczba_szczelin).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9685">karlowic</a> — 2 gru 2020, o 13:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2020-11-30T20:42:43+01:00</updated>
<published>2020-11-30T20:42:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230072#p230072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230072#p230072"/>
<title type="html"><![CDATA[Re: Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230072#p230072"><![CDATA[
No dobrze <br />Tak na pierwszy rzut oka na kod to w zmiennych które używasz w przerwaniu i w kodzie programu powinieneś używać volatile.<br />Zobacz do BB<br />Czyli na przykład jak się będzie zachowywała zmienna<br />volatile uint16_t pomiar_A;  <br />a jak <br /> uint16_t pomiar_A;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 30 lis 2020, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SK97]]></name></author>
<updated>2020-11-30T19:52:40+01:00</updated>
<published>2020-11-30T19:52:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230071#p230071</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230071#p230071"/>
<title type="html"><![CDATA[Re: Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230071#p230071"><![CDATA[
Tak, tak. Tylko niestety jestem zmuszony korzystać z mierzenia czasu pomiędzy występowaniem przerwań na INT1 a nie na ICP<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21076">SK97</a> — 30 lis 2020, o 19:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[JarekB]]></name></author>
<updated>2020-11-30T16:19:19+01:00</updated>
<published>2020-11-30T16:19:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230070#p230070</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230070#p230070"/>
<title type="html"><![CDATA[Re: Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230070#p230070"><![CDATA[
Zobacz na BB. W części poświęconej IR DEKODE masz pomiar czasu zrealizowany za pomocą ICP. A dokładny czas to prędkość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18188">JarekB</a> — 30 lis 2020, o 16:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SK97]]></name></author>
<updated>2020-11-30T15:44:26+01:00</updated>
<published>2020-11-30T15:44:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230069#p230069</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230069#p230069"/>
<title type="html"><![CDATA[Czas obrotu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23463&amp;p=230069#p230069"><![CDATA[
Cześć. <br /><br />Robię sobie taki mały projekcik, w którym muszę obliczyć prędkość obrotową. Pomiar musi być wykonany za pomocą liczenia czasu pomiędzy przerwaniami. Coś tam napisałem ale cały czas wyświetla mi &quot;0 rps&quot;. Do wejścia INT1 w Atmedze32 podłączyłem sobie inny uC, który mi zmienia sygnał co 200ms. <br /><br />Dzięki za pomoc  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;math.h&gt;<br /><br />#include &quot;SSD1306.h&quot;<br /><br />#define czestotliwosc 8000000 // częstotliwość taktowania zegara<br />#define num_szczelin 1 // wstawić liczbę szczelin w tarczy<br />#define transoptor (1&lt;&lt;PD3)<br /><br /><br />uint16_t stan_licznika;<br />uint16_t pomiar_A;<br />uint16_t pomiar_B;<br />uint8_t zbocze;<br />uint8_t num_przepelnienie;<br />uint8_t pomiar_sts;<br /><br />uint16_t num_cykli;<br />double czas_obrotu;<br />double obroty_sek;<br /><br />ISR(INT1_vect)<br />{<br />stan_licznika = (TCNT1H &lt;&lt; 7) || TCNT1L; // zabisanie wartości licznika<br />if(zbocze == 1) //jeśli jest to moment A<br />{<br />TIFR &amp;= ~(1 &lt;&lt; TOV1); // wyzerowanie flagi przepełnienia od przepełnienia TIMER1<br />TIMSK |= (1 &lt;&lt; TOIE1); // włączenie przerwania od przepełnienia TIMER1<br /><br />num_przepelnienie = 0; // zerowanie ilości przepełnień<br /><br />pomiar_A = stan_licznika; // zapisanie stanu licznika w momencie A<br />pomiar_sts = 0;<br />}<br />else<br />{<br />pomiar_B = stan_licznika; // zapisanie stanu licznika w momencie B<br />pomiar_sts = 1; // pomiar wykonano<br />TCNT1H = 0;<br />TCNT1L = 0; // zerowanie licznika<br />zbocze = 0;<br />}<br />zbocze++;<br />}<br /><br />ISR(TIMER1_OVF_vect)<br />{<br />num_przepelnienie++;<br />}<br /><br /><br />void init_transoptor(void)<br />{<br />// Ustawienia transoptora<br />DDRD |= (1 &lt;&lt; transoptor); // pin jako wejscie<br />PORTD |= (1 &lt;&lt; transoptor); // pull-up <br />}<br /><br />void init_przerwania(void)<br />{<br />// Ustawienia przerwań<br />GICR |= (1 &lt;&lt; INT1);<br />MCUCR |= (1 &lt;&lt; ISC11); // ustawienie wystąpienia przerwania na zbocze opadające INT1<br />}<br /><br />void init_timer(void)<br />{<br />// Ustawienia timera<br />TCCR1A |= 0;<br />TCCR1B |= (1&lt;&lt;CS10); // ustawienie preskalera na 1, bo większa dokładność<br />}<br /><br /><br />int main(void)<br />{<br /><br />init_transoptor();<br />init_przerwania();<br />init_timer();<br /><br />ssd1306_init(SSD1306_SWITCHCAPVCC, REFERESH_MID, 0);<br />ssd1306_cls();<br />ssd1306_puts(30, 20, &quot;Wersja 1&quot;, 2, 1, 0);<br />ssd1306_display();<br />_delay_ms(1000);<br />ssd1306_cls();<br />ssd1306_display();<br />sei();<br /><br />while (1)<br />{<br />if (pomiar_sts == 1) // jeśli pomiar jest gotowy<br />{<br /><br />num_cykli = (num_przepelnienie * czestotliwosc) + pomiar_B - pomiar_A; // ilość cykli pomiędzy momentami<br />czas_obrotu = (num_cykli / czestotliwosc) * num_szczelin; // obliczenie czasu pełnego obrotu<br /><br />obroty_sek = 1 / czas_obrotu; // ilość obrotów na sekundę<br />// wyświetlenie wyników<br />ssd1306_cls();<br />ssd1306_put_int(0, 32, obroty_sek, 2, 1, 0);<br /><br />ssd1306_puts(60, 32, &quot;rps&quot;, 2, 1, 0);<br />ssd1306_display();<br /><br />}<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21076">SK97</a> — 30 lis 2020, o 15:44</p><hr />
]]></content>
</entry>
</feed>