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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-01-17T21:20:21+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=10265&amp;mode</id>
<entry>
<author><name><![CDATA[PJS]]></name></author>
<updated>2015-01-17T21:20:21+01:00</updated>
<published>2015-01-17T21:20:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114614#p114614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114614#p114614"/>
<title type="html"><![CDATA[Re: Sterowanie serwomechanizmem przez potencjometr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114614#p114614"><![CDATA[
Trochę tak bez schematu, więc trudno mi się odnieść, ale czy linia:<br />[syntax=c]OCR1B=ICR1*(0.8+(1.4*ADCH/255)/20;[/syntax]<br />nie powinna wyglądać tak:<br />[syntax=c]OCR1B=ICR1*(0.8+(1.4*ADCH/255))/20;[/syntax]<br />lub ewentualnie tak:<br />[syntax=c]OCR1B=ICR1*(0.8+(1.4*(ADCH/255)))/20;[/syntax]<br /><br />Nie znam kompilatora więc tak trochę strzelam.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 10 minutach ]</span></strong><br /><br /><div class="quotetitle">cubus napisał(a):</div><div class="quotecontent"><br />Bo z tego co myśle to chodzi o to że procesor nie radzi sobie z bardzo małymi wartościami dla tego nie było żadnego odzewu od serwa przez większość zakresu ruchu potencjometru.<br /></div><br /><br />Mikrokontroler sobie radzi, jeśli stosuje się odpowiedni typ zmiennych. Jeśli masz int to raczej nie licz na to, że będziesz miał wyniki float (czyli z wartością po przecinku). Dlatego właśnie należy stosować w takich przypadkach mnożniki, które &quot;przesuwają&quot; przecinek. I tak np. dzieląc (dla wyniku int) 15/30 otrzymasz najprawdopodobniej 0, podobnie 12/30 da 0. Natomiast &quot;przesuwając&quot; przecinek pozbywasz się &quot;problemu zaokrągleń dla typu&quot; i mnożąc w tym przypadku tylko licznik przez dziesięć otrzymasz w wyniku 150/30=5 i 130/30=4, czyli odpowiednio przeskalowane wartości, które się od siebie różnią proporcjonalnie. To tak z grubsza i mam nadzieję, że niczego nie poknociłem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1614">PJS</a> — 17 sty 2015, o 21:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[cubus]]></name></author>
<updated>2015-01-17T20:39:45+01:00</updated>
<published>2015-01-17T20:39:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114602#p114602</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114602#p114602"/>
<title type="html"><![CDATA[Sterowanie serwomechanizmem przez potencjometr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10265&amp;p=114602#p114602"><![CDATA[
Witam, chciałem zrobić projekt na ArduinoUno, z prockiem ATmega328P, nie mogę zrobić tego w ArduinoIDE ponieważ dla prowadzącego jest to za proste  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> . Napisałem program którym z powodzeniem mogę sterować położeniem serwa programowo. Dodałem obsługę potencjometru z ADC i przerwaniami, jeżeli w pętli wpisze:<br />[syntax=c]if (ADCH&lt;128)<br />{<br />OCR1B=ICR1*0.8/20;<br />}<br />else<br />{<br />OCR1B=ICR1*2.2/20;<br />}[/syntax]<br /><br />To serwo reaguje, dla położeń potencjometru przed połową ustawia się w położeniu 0 stopni, jak przejdę połowę zasięgu potencjometru to leci do końca. Chciałem jednak aby ruch serwa był ściśle związany z pozycją potencjometru. To też wymyśliłem, że do wartości 0.8 dodam (1.4*(odczyt z ADC/255)). W takiej konfiguracji przez 80% zasięgu potencjometru nic się nie dzieje po czym serwo wykona ruch o mniej więcej 50 stopni. Nie wiem czy to wina mojego przeliczania, próbowałem już różnych konfiguracji bo myślałem, że procesor nie daje rady z dzieleniem tego na bieżąco. Oto cały kod: <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />volatile uint8_t ADCvalue;<br /><br />int main(void)<br />{<br />DDRB |= (1&lt;&lt;PB2);<br />//PWM<br />TCCR1A = 0;<br />// Prescaler<br />TCCR1B |= (1&lt;&lt;CS11);<br />ICR1 = 39999;<br />//Timer1 tryb - fastPWM 16bit, TOP ustawiany przez ICR1<br />TCCR1A |= (1&lt;&lt;WGM11);<br />TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13);<br />//Timer1 tryb - non inverting <br />TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1B1);<br /><br />DDRC |= (0&lt;&lt;PC0);<br />//ADC<br />//Prescaler do ADC - 128<br />ADCSRA |= (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2);<br />//Napiecie ustawione na AVCC<br />ADMUX |= (1 &lt;&lt; REFS0);<br />//Wybrany kanal ADC to A0 bity MUX3-MUX0(ADMUX) ustawione na 0<br />//Wybrany tryb ADC to Free Running mode bity ADTS2-ADTS0 (ADSRB) ustawione na 0<br />//Zmiana dokladnosci z 10 na 8 bitow<br />ADMUX |= (1&lt;&lt;ADLAR);<br />//Wlaczenie ADC<br />ADCSRA |= (1 &lt;&lt; ADEN) | (1&lt;&lt;ADATE);<br />//Właczenie obslugi przerwan<br />ADCSRA |= (1 &lt;&lt; ADIE);<br />sei();<br />//Rozpoczecie pomiarow przez ADC<br />ADCSRA |= (1 &lt;&lt; ADSC);<br /><br />while(1)<br />{<br />OCR1B=ICR1*(0.8+(1.4*ADCH/255)/20;<br />}<br /><br />}<br />ISR(ADC_vect)<br />{<br />ADCvalue = ADCH;<br />}[/syntax]<br /><br />Z góry dziękuje za odpowiedź i przepraszam jeżeli pytanie jest trywialne <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /><br /><br /><br />Edit: Poradziłem sobie z tym problemem przemnażając wartość ADCH przez 100 i dzieląc przez 25500. Mam natomiast jeszcze jedno pytanie: czy jest jakieś optimum tego rozwiązania? Bo z tego co myśle to chodzi o to że procesor nie radzi sobie z bardzo małymi wartościami dla tego nie było żadnego odzewu od serwa przez większość zakresu ruchu potencjometru. <br />Mam jeszcze błąd w kodzie, oczywiście powinno być [syntax=c]OCR1B=ICR1*(0.8+(1.4*ADCvalue*100/25500)/20;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7947">cubus</a> — 17 sty 2015, o 20:39</p><hr />
]]></content>
</entry>
</feed>