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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-04-23T15:14:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18231&amp;mode</id>
<entry>
<author><name><![CDATA[Situs]]></name></author>
<updated>2017-04-23T15:14:33+01:00</updated>
<published>2017-04-23T15:14:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187724#p187724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187724#p187724"/>
<title type="html"><![CDATA[Re: Ultradźwiękowy czujnik odległości oraz sterowanie serwem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187724#p187724"><![CDATA[
Tak się zlicza software'owo[syntax=c]#define ECHO PB1<br /><br />uint16_t licznik = 0 ;<br />while(PINB &amp; (1&lt;&lt;PB1))<br />{<br />    licznik++ ;<br />    _delay_us(0.9) ;  //trochę mniej od 1 us dla większej dokładności bo inkrementacja i petla też zajmuje<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: kilkunastu sekundach ]</span></strong><br /><br />w zmiennej licznik jest czas trwania stanu wysokiego w us<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14339">Situs</a> — 23 kwi 2017, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marshall94]]></name></author>
<updated>2017-04-23T12:58:29+01:00</updated>
<published>2017-04-23T12:58:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187712#p187712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187712#p187712"/>
<title type="html"><![CDATA[Re: Ultradźwiękowy czujnik odległości oraz sterowanie serwem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187712#p187712"><![CDATA[
No tak, obie funkcje korzystają z tego samego timera. Jako, że dopiero zaczynam zabawę z uC nie do końca wiem jak zliczać software'owo.<br />Skorzystałem natomiast z timera 8-bitowego Timer0 i wprowadziłem dodatkową zmienną która podczas przepełnienia licznika jest inkrementowana i funkcja działa właściwie tak samo jak w pierwszej wersji.<br /><br />[syntax=c]volatile uint8_t licznik;<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />licznik++;<br />}[/syntax]<br /><br />Nie wiem czy taki sposób zapisu jest dobry i jak ewentualnie mógłbym to zrobić lepiej, w każdym razie wydaje się, że działa tak jak powinno. Dziękuje za pomoc. Miałbym jeszcze pytanie do funkcji regulatora. Czy jest ona dobrze zapisana? Bo nie działa to do końca poprawnie mimo nastaw dobranych wcześniej działających na arduino.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16824">marshall94</a> — 23 kwi 2017, o 12:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Situs]]></name></author>
<updated>2017-04-23T08:54:02+01:00</updated>
<published>2017-04-23T08:54:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187700#p187700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187700#p187700"/>
<title type="html"><![CDATA[Re: Ultradźwiękowy czujnik odległości oraz sterowanie serwem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187700#p187700"><![CDATA[
W funkcji pomiar oraz serwo_init używasz tego samego timera, w funkcji pomiar użyj liczenia softwarowego<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14339">Situs</a> — 23 kwi 2017, o 08:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2017-04-23T07:58:22+01:00</updated>
<published>2017-04-23T07:58:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187696#p187696</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187696#p187696"/>
<title type="html"><![CDATA[Re: Ultradźwiękowy czujnik odległości oraz sterowanie serwem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187696#p187696"><![CDATA[
Witam<br />Tak na pierwszy rzut oka jeśli wszędzie masz &quot;uint'y&quot; to co robi to #define:<br />[syntax=c]#define BLAD_POMIARU            -1<br />#define BRAK_PRZESZKODY -2[/syntax]<br />?<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 23 kwi 2017, o 07:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marshall94]]></name></author>
<updated>2017-04-23T02:24:02+01:00</updated>
<published>2017-04-23T02:24:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187695#p187695</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187695#p187695"/>
<title type="html"><![CDATA[Ultradźwiękowy czujnik odległości oraz sterowanie serwem.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18231&amp;p=187695#p187695"><![CDATA[
Witam, próbuję stworzyć układ typu &quot;kulka na pochylni&quot;. Niestety przy próbie połączenia obsługi czujnika i serwomechanizmu pojawia się problem. Jestem w stanie obsłużyć sam czujnik i on działa poprawnie (sprawdzone przy pomocy wyświetlacza LCD), podobnie w przypadku serwomechanizmu mogę nim sterować w określonym zakresie. Niestety serwo nie chce się poruszać gdy poprzedzi je funkcja &quot;pomiar&quot; służąca do pomiaru trwania stanu wysokiego na pinie ECHO. Czy ktoś mógłby mi wyjaśnić dlaczego tak się dzieje? Ponadto nie jestem pewny czy dobrze napisana jest funkcja dla regulatora PID, ktoś mógłby mnie nakierować? Projekt wykonywany na atmega8, czujnik HCSR04.<br /><br />[syntax=c]/*<br /> * <br /> * Author: marshall94<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//dioda testowa<br />#define LED_PIN (1&lt;&lt;PB2)<br />#define LED_OFF PORTB &amp;= ~LED_PIN<br />#define LED_ON PORTB |= LED_PIN<br /><br />//czujnik<br />#define PORT PORTC<br />#definePINPINC<br />#define DDR DDRC<br />#define TRIGGERPC0 //Trigger<br />#define ECHOPC1 //Echo<br />#define BLAD_POMIARU-1<br />#defineBRAK_PRZESZKODY-2<br /><br />//serwo<br />#define LEWO_MAX 2280<br />#define PRAWO_MAX 3580<br />#define SRODEK 2930<br /><br />//DEKLARACJA FUNKCJI------------------<br />//czujnik<br />void czujnik_init();<br />void trigger();<br />uint16_t pomiar();<br /><br />//dioda testowa<br />void dioda_init();<br /><br />//serwo<br />void serwo_init();<br />uint16_t serwo(uint8_t kat);<br /><br />//regulator<br />uint8_t regulator(uint8_t w_zad, uint8_t pomiar);<br />//------------------------------------<br /><br />int main(void)<br />{<br />    //*********INICJALIZACJA***********<br />    dioda_init();//dioda testowa<br />    czujnik_init();//czujnik<br />    serwo_init();<br />    //*********************************<br /><br />    //***********ZMIENNE***************<br />    uint16_t r;<br />    uint8_t d;<br />    uint8_t w_zad = 32;<br />    uint8_t pid_out;<br />    //*********************************<br />    while(1)<br />    {<br />        trigger();//ROZPOCZECIE POMIARU<br />        r=pomiar();//OBLICZANIE POMIARU<br /><br />  if (r&gt;=0)//JEZELI NIE WYKRYTO BLEDU<br />  {<br />  d=(r/58.0);//KONWERSJA POMIARU NA CM<br />  }<br />  if (d&gt;=0 &amp;&amp; d&lt;=80)<br />  {<br />  LED_ON;<br />  pid_out = regulator(w_zad, d);//WYJSCIE Z REGULATORA<br />  OCR1A = serwo(pid_out);//WEJSCIE DO SERWA<br />  _delay_ms(50);<br /><br />  }<br />  else LED_OFF;<br />    }<br />}<br /><br />void dioda_init()<br />{<br />DDRB |= LED_PIN;<br />}<br /><br />void czujnik_init()<br />{<br />DDR|=(1&lt;&lt;TRIGGER);<br />}<br /><br /><br />void trigger()<br />{<br />//Impuls 10us<br /><br />PORT|=(1&lt;&lt;TRIGGER);//WYSOKI<br /><br />_delay_us(15);//Czekaj 15us<br /><br />PORT&amp;=~(1&lt;&lt;TRIGGER);//NISKI<br />}<br /><br />uint16_t pomiar()<br />{<br />uint32_t i,result;<br /><br />//Oczekiwanie na zbocze narastajace<br />for(i=0;i&lt;600000;i++)<br />{<br />if(!(PIN &amp; (1&lt;&lt;ECHO)))<br />continue;//Stan niski<br />else<br />break;//Wykryto zbocze narastajace<br />}<br /><br />if(i==600000)<br />return BLAD_POMIARU;//Przekroczony czas oczekiwania<br /><br />//Wykryto stan wysoki<br /><br />//Inicjalizacja Timer1<br />TCCR1A=0X00;<br />TCCR1B=(1&lt;&lt;CS11);//Prescaler = Fcpu/8<br />TCNT1=0x00;//Init counter<br /><br />//Oczekiwanie na zbocze opadajace<br />for(i=0;i&lt;600000;i++)<br />{<br />if(PIN &amp; (1&lt;&lt;ECHO))<br />{<br />if(TCNT1 &gt; 60000) break; else continue;<br />}<br />else<br />break;<br />}<br /><br />if(i==600000)<br />return BRAK_PRZESZKODY;//Przekroczony czas oczekiwania<br /><br />//Wykryte zbocze narastajace<br /><br />result=TCNT1;<br /><br />//Stop Timer<br />TCCR1B=0x00;<br /><br />if(result &gt; 60000)<br />return BRAK_PRZESZKODY;//Brak przeszkody<br />else<br />return (result&gt;&gt;1);<br />}<br /><br />uint8_t regulator(uint8_t w_zad, uint8_t pomiar)<br />{<br />//nastawy<br />float k = 0.25;<br />float k_i = 0.1;<br />float k_d = 0.08;<br /><br />//zmienne pomocnicze<br />float p,i,d;//czlony regulatora<br />int wyjscie;<br />float u;//uchyb regulacji<br />static float u_p = 0;//poprzedni uchyb regulacji<br />static float su = 0;//suma minionych uchybow regulacji<br /><br />//aktualny uchyb regulacji<br />u = w_zad - pomiar;<br /><br />//skladnik proporcjonalny<br />p = k*u;<br /><br />//skladnik calkowy<br />su=su+u;<br />i = k_i * su;<br /><br />//skladnik rozniczkowych<br />d = k_d*(u-u_p);<br />u_p = u;<br /><br />//OBLICZANIE PID<br />wyjscie = -(p+i+d)+90; //90 - rynna poziomo,<br /><br />return wyjscie;<br />}<br />uint16_t serwo(uint8_t kat)<br />{<br />uint16_t wychylenie;<br />if(kat&gt;121) kat=121;<br />if(kat&lt;58) kat = 58;<br />//normalizacja<br />wychylenie = (int)(1300/63)*(kat-58)+2280;<br />return wychylenie;<br />}<br /><br />void serwo_init()<br />{<br />  DDRB  |= (1 &lt;&lt; PB1); // set output to PB1<br />  TCCR1A = ((1 &lt;&lt; COM1A1) | (1 &lt;&lt; WGM11)); // clear OC1A on match + WGM mode 14<br />  TCCR1B = ((1 &lt;&lt; WGM12) | (1 &lt;&lt; WGM13) | (1 &lt;&lt; CS11)); // WGM mode 14 (Fast PWM) // and 8x prescaler<br />  ICR1  = 40000;  //set ICR1 to produce 50Hz frequency //(8000000 / 8 / 20000 = 50hz)<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16824">marshall94</a> — 23 kwi 2017, o 02:24</p><hr />
]]></content>
</entry>
</feed>