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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-03-02T17:39:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17769&amp;mode</id>
<entry>
<author><name><![CDATA[Marcin_5656]]></name></author>
<updated>2017-03-02T17:39:00+01:00</updated>
<published>2017-03-02T17:39:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17769&amp;p=183897#p183897</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17769&amp;p=183897#p183897"/>
<title type="html"><![CDATA[Problem z profilerem prędkości (PID)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17769&amp;p=183897#p183897"><![CDATA[
Cześć <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> , <br /><br />robię profiler prędkości(PID) do robota dwukołowego. Mam problem z wyliczeniem przejechanej trasy, tak aby robot przejechał dany kawałek po PROSTEJ i się zatrzymał. Umieszczam na dole kod z zaznaczonym,i miejscami gdzie mam problem. Wiem mniej więcej co ma tam być ale robot nie działa poprawnie. Czy byłby ktoś wstanie mi pomóc w kwestii prędkości/trasy do tego kodu ? <br /><br />Silniki są sterowane PWM <br />Średnica kół to 3.22 cm. <br />Rozstaw kół to 90 mm. <br />Ilość &quot;tików&quot; enkodera na obrót koła to 300 <br /><br /><br /><br />Wiem, że jest ogromny chaos z zmiennymi i tym gdzie powinny być(globalne/lokalne, rozmiar ich), ale to już sobie poprawię jak całość będzie działać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Kod: <br />[syntax=c]int docelowaPredkoscW = 100; //przykladowe<br /> int docelowaPredkoscX = 500; //przykladowe<br /><br />short int encX;<br />short int encW;<br /><br />short int dccX = 2;<br />short int dccW = 1;<br /><br />short int aktualnaPredkoscX = 0;// aktualnie zadana prędkość<br />short int aktualnaPredkoscW = 0;// aktualnie zadana prędkość<br /><br />short int regulacjaX;<br />short int   kpX=1;<br />short intkdX=2;<br /><br />short int regulacjaW;<br />short int   kpW=1;<br />short intkdW=1;<br /><br />volatile int encoder_R;<br />volatile int encoder_L;<br /><br />short int  lewyEnc=0;<br />short int  prawyEnc=0;<br />short int  zmianaEncL=0;<br />short int  zmianaEncP=0;<br />short int  lewyEncStary=0;<br />short int  prawyEncStary=0;<br /><br />void Enkodery(void)<br />{<br />prawyEnc = encoder_R; // aktualna wartosc z prawego enkoder<br />lewyEnc = encoder_L; // aktualna wartosc z lewego enkoder<br /><br />//rozniczka z polozenia -&gt; predkosc<br /><br />zmianaEncL = lewyEnc - lewyEncStary;<br />zmianaEncP = prawyEnc - prawyEncStary;<br /><br />lewyEncStary = lewyEnc;<br />prawyEncStary = prawyEnc;<br /><br />//predkosc w ruchu translacji i translacji<br />encX = (zmianaEncP + zmianaEncL);<br />encW = (zmianaEncP - zmianaEncL);<br />}<br /><br /><br />void AktualnaPredkosc()<br />{<br />//translacja<br />if( ) // &lt;===== // nie wiem co Tu wpisac //TODO// &lt;===== // nie wiem co Tu wpisac //TODO<br />{<br />docelowaPredkoscX = 0;<br />}<br /><br />if( aktualnaPredkoscX &lt; docelowaPredkoscX )<br />{<br />aktualnaPredkoscX += dccX;<br />if(aktualnaPredkoscX &gt; docelowaPredkoscX)<br />{<br />aktualnaPredkoscX = docelowaPredkoscX;<br />}<br />}<br /><br />else if( aktualnaPredkoscX &gt; docelowaPredkoscX )<br />{<br />aktualnaPredkoscX -= dccX;<br />if( aktualnaPredkoscX &lt; docelowaPredkoscX )<br />{<br />aktualnaPredkoscX = docelowaPredkoscX;<br />}<br />}<br /><br />//rotacja<br />if( ) // &lt;===== // nie wiem co Tu wpisac //TODO<br />{<br />docelowaPredkoscW = 0;<br />}<br /><br />if(aktualnaPredkoscW &lt; docelowaPredkoscW)<br />{<br />aktualnaPredkoscW += dccW;<br />if(aktualnaPredkoscW &gt; docelowaPredkoscW)<br />{<br />aktualnaPredkoscW = docelowaPredkoscW;<br />}<br />}<br /><br />else if(aktualnaPredkoscW &gt; docelowaPredkoscW)<br />{<br />aktualnaPredkoscW -= dccW;<br />if(aktualnaPredkoscW &lt; docelowaPredkoscW)<br />{<br />aktualnaPredkoscW = docelowaPredkoscW;<br />}<br />}<br />}<br /><br />void odchylenieX()<br />{<br />regulacjaX = aktualnaPredkoscX - encX;<br />}<br /><br />void odchylenieW()<br />{<br />regulacjaW = aktualnaPredkoscW - encX;<br /><br />//tutaj kod do ustalanie blędów<br />// uwzgledniajac czyjniki (lewy i prawy)<br />}<br /><br /><br />short int regulacjaXStara = 0;<br />short int regulacjaWStara = 0;<br /><br />void ComputePID()<br />{<br />short intPWMX = 0;<br />short intPWMW = 0;<br /><br />Enkodery(); //funkcja dotyczaca enkoderow, zmieranie z nich danych<br /><br />AktualnaPredkosc(); // aktualizacja prednkosci<br /><br />odchylenieW();<br />odchylenieX();<br /><br />PWMX = (kpX * regulacjaX) + (kdX * (regulacjaX - regulacjaXStara)); //regulator PD translacji<br />PWMW = (kpW * regulacjaW) + (kdW * (regulacjaW - regulacjaWStara)); //regulator PD rotacji<br /><br />regulacjaXStara = regulacjaX;<br />regulacjaWStara = regulacjaW;<br /><br />Left_Motor(PWMX - PWMW); //sterowaniem lewym sinikiem za pomocą PWM<br />Right_Motor(PWMX + PWMW); //sterowaniem prawym sinikiem za pomocą PWM<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12244">Marcin_5656</a> — 2 mar 2017, o 17:39</p><hr />
]]></content>
</entry>
</feed>