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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-26T23:15:56+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=10824&amp;mode</id>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T23:15:56+01:00</updated>
<published>2015-02-26T23:15:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121131#p121131</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121131#p121131"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121131#p121131"><![CDATA[
No i wszystko gra ! Przyspiesz PWM (na etapie konfiguracji - co może być niestety dość mało elastyczne, albo wręcz niemożliwe dla takiego przypadku) i będzie ok. Ewentualnie zawsze możesz zrobić PWM programowe (nawet 1-o bitowe! <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) i też będzie działać, a przynajmniej prędkość łatwo ustalisz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 23:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T23:10:35+01:00</updated>
<published>2015-02-26T23:10:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121129#p121129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121129#p121129"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121129#p121129"><![CDATA[
Nie mam zielonego pojęcia jak zrobić tak, żeby silnik reagował od razu. Na filmie widać, że doskakuje do swojej pozycji.<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Poprawiony kod: <br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 26-01-2015<br /> *      Author: Adrian<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;HD44780.h&quot;<br /><br />volatile uint16_t pozycja=0;// pozycja licznika<br />volatile uint16_t stan=0;// stan z ADC<br />volatile uint8_t licznik=0;// opóźnienie sprzętowe... (2ms?)<br />volatile uint8_t impuls=2;// dwa impulsy na krok (0 i 1)<br /><br />#define M0 (1&lt;&lt;PC7) //definicja pinu C7<br />#define M0_1  (PORTC |= M0) //mikrodefinicja - jeden na M0<br />#define M0_0  (PORTC &amp;= ~M0) //mikrodefinicja - zero na M0<br />#define M1 (1&lt;&lt;PC6) //definicja pinu C6<br />#define M1_1  (PORTC |= M1) //mikrodefinicja - jeden na M1<br />#define M1_0  (PORTC &amp;= ~M1) //mikrodefinicja - zero na M1<br />#define M2 (1&lt;&lt;PC5) //definicja pinu C5<br />#define M2_1  (PORTC |= M2) //mikrodefinicja - jeden na M2<br />#define M2_0  (PORTC &amp;= ~M2) //mikrodefinicja - zero na M2<br /><br /><br />// WYJŚCIE ENABLE<br />#define ENABLE (1&lt;&lt;PC4) //definicja pinu C4<br />#define ENABLE_1  (PORTC |= ENABLE) //mikrodefinicja - jeden na ENABLE<br />#define ENABLE_0  (PORTC &amp;= ~ENABLE) //mikrodefinicja - zero na ENABLE<br /><br />//WYJŚCIE SLEEP<br />#define SLEEP (1&lt;&lt;PC3) //definicja pinu C3<br />#define SLEEP_1  (PORTC |= SLEEP) //mikrodefinicja - jeden na SLEEP<br />#define SLEEP_0  (PORTC &amp;= ~SLEEP) //mikrodefinicja - zero na SLEEP<br /><br />//WYJŚCIE DIR<br />#define DIR (1&lt;&lt;PC2) //definicja pinu C2<br />#define DIR_1  (PORTC |= DIR) //mikrodefinicja - jeden na DIR<br />#define DIR_0  (PORTC &amp;= ~DIR) //mikrodefinicja - zero na DIR<br /><br />//WYJŚCIE STEP<br />#define STEP (1&lt;&lt;PC1) //definicja pinu C1<br />#define STEP_1  (PORTC |=STEP) //mikrodefinicja - jeden na STEP<br />#define STEP_0  (PORTC &amp;= ~STEP) //mikrodefinicja - zero na STEP<br /><br />//WYJSCIE RESET<br />#define RESET (1&lt;&lt;PC0) //definicja pinu C0<br />#define RESET_1  (PORTC |= RESET) //mikrodefinicja - jeden na RESET<br />#define RESET_0  (PORTC &amp;= ~RESET) //mikrodefinicja - zero na RESET<br /><br />int main (void)<br />//inicjalizacja wyswietlacza<br />{<br />char str&#91;16&#93;;<br />LCD_Initalize();<br />LCD_Clear();<br />//--------------------------<br /><br />DDRC =0xff;// porty C jako out<br />DDRD |= (1&lt;&lt;PD7);// PD7 - sprzetowy PWM jako WYJSCIE dla TIMERA2<br /><br />// 0,0,0 - sterowanie pełnokrokowe<br />M0_0; //zero na M0<br />M1_0; //zero na M1<br />M2_0; //zero na M2<br />ENABLE_0; //zero na ENABLE<br />SLEEP_0; //zero na SLEEP<br />RESET_0; //zero na RESET<br />DIR_0; //jeden na DIR<br /><br />TCCR2 |= (1&lt;&lt;WGM20);<br />TCCR2 |= (1&lt;&lt;COM21);//clear the top<br />//TCCR2 |= (1&lt;&lt;CS22);//preskaler /256, f=43,2kHz<br />OCR2 =0;<br />TCCR0 |= (1&lt;&lt;CS02);// preskaler /256<br />TIMSK |= (1&lt;&lt;OCIE2); // przerwanie od Timera2<br />TIMSK |= (1&lt;&lt;TOIE0);// przerwanie od Timera0<br />TCNT0 = 212;// timer na 1 ms<br /><br />ADCSRA |= (1&lt;&lt;ADEN);// włączamy przetwornik<br />ADCSRA |= (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1);// preskaler /8, frequency 1MHz<br />//ADCSRA |= (1&lt;&lt;ADIE);// włączam przerwania od ADC<br />ADMUX |=  (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0);// wewnętrzny Vref, konwersja dla ADC0<br /><br />DDRA = 0x00;// porty ADC jako wejście<br /><br />sei();// globalne zezwolenie na przerwania<br /><br />LCD_WriteText(&quot;ADC start...&quot;);<br /><br />while(1)<br />{<br />if (licznik == 0 &amp;&amp; impuls == 2)<br />{<br />licznik = 2;<br />sprintf(str, &quot;ADC:%i,pos:%i&quot;, stan, pozycja);<br />//LCD_Clear();<br />LCD_Home();<br />LCD_WriteText(str);<br /><br />ADCSRA |= (1&lt;&lt;ADSC);// uruchamia pojedynczą konwersję<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));// czekam na zakończenie konwersji<br />stan = ADC/5;<br /><br />if (pozycja &lt; stan)<br />{<br />DIR_0;// w prawo<br />impuls = 0;// wyczysc licznik impulsów<br />OCR2 = 50;<br />TCCR2 |= (1&lt;&lt;CS22);// odpal PWM na krok<br />pozycja++;<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;+&quot;);<br />}<br /><br />if (pozycja &gt; stan)<br />{<br />DIR_1;// w prawo<br />impuls = 0;// wyczysc licznik impulsów<br />OCR2 = 50;<br />TCCR2 |= (1&lt;&lt;CS22);// odpal PWM na krok<br />pozycja--;<br />LCD_GoTo(0,1);<br />LCD_WriteText(&quot;-&quot;);<br />}<br />}<br />}<br />}<br /><br />ISR (TIMER2_COMP_vect)<br />{<br />impuls++;<br />if (impuls == 2) //jeżeli zrobi tyle krokow co ma zrobić<br />{<br />OCR2 = 0;<br />TCCR2 ^= (1&lt;&lt;CS22);<br />}<br />}<br /><br />ISR (TIMER0_OVF_vect)<br />{<br />if (licznik &gt; 0) //jeżeli zrobi tyle krokow co ma zrobić<br />licznik--;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 23:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T20:43:24+01:00</updated>
<published>2015-02-26T20:43:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121094#p121094</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121094#p121094"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121094#p121094"><![CDATA[
Sterowanie PWM jest niepraktyczne i osobiście nigdy tego nie robiłem przy krokowcach. Oczywiście da się, ale efekt będzie marny ze względu na bardzo skokowy zakres częstotliwości tego sygnału. PWM stosuję tylko do regulacji mocy, która jest dostarczana do silnika krokowego.<br />W Twoim przypadku w zasadzie wystarczy tylko włączać i wyłączać pwm (licząc wysłane kroki) i ustalać kierunek w zależności od tego czy liczba zliczonych kroków jest większa niż ADC czy mniejsza. Maksymalną prędkość dla silnika ustalasz już na etapie konfiguracji PWM'a. Pamiętaj że musi być dwa warunki: mniejszy niż, większy niż. Nie możesz użyć else ani kombinacji ze znakiem równości. Musisz dać szansę programowi aby ustawił się w miejscu, które okaże się wyrównaniem zmiennych i stamtąd silnik nie może uciec w którąś stronę, a znak &quot;=&quot; by na to nie pozwolił <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 20:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T19:49:28+01:00</updated>
<published>2015-02-26T19:49:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121077#p121077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121077#p121077"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121077#p121077"><![CDATA[
to jak to zrealizować na tym sterowniku sterując to PWMem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 19:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T19:45:04+01:00</updated>
<published>2015-02-26T19:45:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121075#p121075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121075#p121075"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121075#p121075"><![CDATA[
<div class="quotetitle">ProLogicTechnology napisał(a):</div><div class="quotecontent"><br />To wygląda jakby za każdą zmianą była inna wielkość kroku - czyli de facto zmiana wartości ADC o 1 zmienia o zmienną wartość kroku silnika<br /></div><br /><br />Nie, nie, to wartości dla cewek silnika. Odpowiednie ich kolejne włączanie powoduje po prostu obrót wałem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T19:21:41+01:00</updated>
<published>2015-02-26T19:21:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121070#p121070</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121070#p121070"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121070#p121070"><![CDATA[
widze, widzę, nie używasz PWM'a. Jeszcze chciałem zapytać o procedurę krok - jak ona działa? To wygląda jakby za każdą zmianą była inna wielkość kroku - czyli de facto zmiana wartości ADC o 1 zmienia o zmienną wartość kroku silnika<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 19:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T18:53:22+01:00</updated>
<published>2015-02-26T18:53:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121065#p121065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121065#p121065"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121065#p121065"><![CDATA[
W przerwaniach jest timer programowy, przerwania ustawione na 1ms. W pętli głównej badam czy licznik programowy doszedł do &quot;0&quot; jeśli tak to wpisuję tam wartość 2 (co odpowiada 2ms w tym przypadku) i wykonuję to co mam wykonać. W kilku(dziesięciu/set...) następnych przebiegach pętli sprawdzany jest licznik, a że pętla wykonuje się stosunkowo szybko więc warunek nie jest spełniony i z tego powodu nie wykonuje się nic co jest w nim zawarte. To jest właśnie program nieblokujący gdzie opóźnienia zadawane są timerem programowym (możesz sobie takich zrobić i 50 jeśli będzie taka potrzeba, choć na to są inne sposoby), a pętla sobie w kółko biegnie i nigdzie się na dłużej nie zatrzymuje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 18:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T18:39:12+01:00</updated>
<published>2015-02-26T18:39:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121061#p121061</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121061#p121061"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121061#p121061"><![CDATA[
Chyba widzę, w czym problem.<br />Otóż sterownik ustawia odpowiednie kroki, ja tylko podaję do niego sygnał PWM'a. Tutaj jest problem. Podajesz mu 2 ms między krokami. Jak tutaj to zrealizować?<br /><br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T15:50:17+01:00</updated>
<published>2015-02-26T15:50:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121045#p121045</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121045#p121045"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121045#p121045"><![CDATA[
Poniżej kompletny program w bascomie, który brał udział w filmie. Jego konstrukcja jest tak banalna, że nawet bez znajomości składni nie powinieneś mieć problemu z jego analizą. Te 2ms, które tam widzisz to opóźnienie i maksymalna prędkość dla wału silnika. Gdyby było ono mniejsze lub wcale to działo by się mniej więcej to co na na Twoim filmie. Przy takiej konstrukcji jak poniżej nawet błyskawiczne przekręcenie potencjometru w skrajną pozycję pozwoli silnikowi dojechać na swoich maksymalnych obrotach do celu. A propo's litanii w podprogramie KROK - są to dane dzięki którym silnik bipolarny pracuje w półkroku. &quot;Rotate&quot; to zwykłe przesunięcie bitowe z przeniesieniem.<br /><br />[syntax=basic4gl]'--------------------------------------<br />'Proporcjonalny ruch silnika krokowego<br />'SylwekK<br />'8.03.2013<br />'--------------------------------------<br />$regfile &quot;m8def.dat&quot;<br />$crystal = 8000000<br />$hwstack = 50<br />$swstack = 50<br />$framesize = 24<br />'--------------------------------------<br />Config Adc = Single , Prescaler = Auto , Reference = Avcc<br />'<br />Config Timer0 = Timer , Prescale = 64<br />On Timer0 Ti_prog<br />Enable Interrupts<br />'<br />Const Przerwanie = 131        '1ms  8000000/64/125 = 1000Hz<br />Counter0 = Przerwanie<br />Enable Timer0<br />'--------------------------------------<br />Ddrb = &amp;B00001111<br />Portb = 0<br />'<br />Dim Faza As Byte<br />Faza = 1<br />Dim Licz1 As Byte             'licznik programowy<br />Dim Xb As Byte ,              'zmienna pomocnicza<br />Dim Kb As Byte                'stan wyjść dla krokowego<br />Dim Pozycja As Byte           'pozycja silnika<br />Dim Stan As Word              'zmienna, od której zależy pozycja wału silnika<br />'--------------------------------------<br />'--------------------------------------<br />Licz1 = 0<br />Pozycja = 0                   'pozycja wału silnika krokowego<br />Do<br />'<br />'<br />'---<br />If Licz1 = 0 Then<br />   Licz1 = 2                  '2ms opóźnienia dla obrotów silnika<br />   '--<br />   Stan = Getadc(5) / 4       'zakres (tu 255 kroków)<br />   '--<br />   If Pozycja &lt; Stan Then<br />      Rotate Faza , Right<br />      Incr Pozycja<br />      Gosub Krok<br />   End If<br />   If Pozycja &gt; Stan Then<br />      Rotate Faza , Left<br />      Decr Pozycja<br />      Gosub Krok<br />   End If<br />End If<br />'---<br />'<br />'<br />'<br />Loop<br />End<br />'--------------------------------------<br />'--------------------------------------<br />' KROK<br />'------<br />Krok:<br />Select Case Faza<br />Case 1 : Kb = &amp;B00001001<br />Case 2 : Kb = &amp;B00000001<br />Case 4 : Kb = &amp;B00000101<br />Case 8 : Kb = &amp;B00000100<br />Case 16 : Kb = &amp;B00000110<br />Case 32 : Kb = &amp;B00000010<br />Case 64 : Kb = &amp;B00001010<br />Case 128 : Kb = &amp;B00001000<br />End Select<br />Xb = Pinb And &amp;B11110000<br />Portb = Xb Or Kb<br />Return<br />'--------------------------------------<br />'--------------------------------------<br />Ti_prog:<br />Counter0 = Counter0 + Przerwanie<br />If Licz1 &gt; 0 Then Decr Licz1<br />Return<br />'--------------------------------------<br />'--------------------------------------[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Rampa to płynne przyspieszenie/zwalnianie - bardzo istotny parametr przy pracy z silnikami krokowymi w profesjonalnych zastosowaniach. W zasadzie bez rampy każde większe urządzenie nie ma szans na prawidłową pracę ze względu na możliwość gubienia kroków przy gwałtownym starcie... fizyki się nie przeskoczy (bezwładność).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T15:15:06+01:00</updated>
<published>2015-02-26T15:15:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121037#p121037</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121037#p121037"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121037#p121037"><![CDATA[
Możesz jakoś jaśniej to zobrazować jak ma wyglądać to doganianie. Na jakimś Timerze ? <br />Co to jest opcja rampy ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 15:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2015-02-26T09:05:14+01:00</updated>
<published>2015-02-26T09:05:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121001#p121001</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121001#p121001"/>
<title type="html"><![CDATA[Re: AVR ATmega32 Problem - ATMega 32A Sterowanie potencjomet]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=121001#p121001"><![CDATA[
Czuję się wywołany do tablicy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Tłumaczyłem to zagadnienie już na tym forum w jakimś podobnym temacie, ale podpowiem jeszcze raz. Aby nie gubiło kroków należy zmieniać obroty silnika nie przekraczając jego maksymalnej prędkości. Najlepiej dokonać tego na podobnie jak dla opcji rampy na zmiennej doganiającej z tą różnicą, że tu nie przyspieszamy/zwalniamy (zmienna prędkość) tylko doganiamy licznik kroków, który pracuje ze stałą prędkością (optymalną dla obrotów silnika). Program z filmu pisałem jeszcze w bascomie i był bardzo krótki, też go tu na forum już umieszczałem o ile pamiętam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 26 lut 2015, o 09:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ProLogicTechnology]]></name></author>
<updated>2015-02-26T01:17:03+01:00</updated>
<published>2015-02-26T01:17:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=120993#p120993</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=120993#p120993"/>
<title type="html"><![CDATA[AVR ATmega32 Problem - ATMega 32A Sterowanie potencjometrem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10824&amp;p=120993#p120993"><![CDATA[
Witam, <br />mam mały problem ze sterowaniem silnika krokowego za pomocą potencjometru. <br />Postaram się szerzej opisać mój problem. <br />Podczas działania programu wartość ADC dość mocno skacze mimo zrobionego zabezpieczenia. Silnik gubi kroki. <br />Do celów testowych używam płytki prototypowej z procesorem ATMega32 i sterownika silników krokowych na układzie scalonym DRV8825. Analogicznym do tego sterownika: <a href="https://www.pololu.com/product/2133"  class="postlink">https://www.pololu.com/product/2133</a><br />Wrzucam schemat połączeń: <br /><a href="http://forum.atnel.pl/_obrazki/o/6843/58036773439975ab186edbac066968bf.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/6843/58036773439975ab186edbac066968bf.jpg" alt="Obrazek" /></a><br />Wrzucam także kod programu który posiada komentarze więc raczej nie będę musiał dokładnie opisywać i dodawać bardzo rozbudowanego schematu połączeń: [syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 26-01-2015<br /> *      Author: Adrian<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;HD44780.h&quot;<br /> <br />volatile uint16_t stara;// stara wartość ADC<br />volatile uint16_t ilekrokow;// ilość kroków wyliczona<br />volatile uint16_t licznik;// licznik ile zrobiło kroków w przerwaniu PWM<br /> <br />#define M0 (1&lt;&lt;PC7) //definicja pinu C7<br />#define M0_1  (PORTC |= M0) //mikrodefinicja - jeden na M0<br />#define M0_0  (PORTC &amp;= ~M0) //mikrodefinicja - zero na M0<br />#define M1 (1&lt;&lt;PC6) //definicja pinu C6<br />#define M1_1  (PORTC |= M1) //mikrodefinicja - jeden na M1<br />#define M1_0  (PORTC &amp;= ~M1) //mikrodefinicja - zero na M1<br />#define M2 (1&lt;&lt;PC5) //definicja pinu C5<br />#define M2_1  (PORTC |= M2) //mikrodefinicja - jeden na M2<br />#define M2_0  (PORTC &amp;= ~M2) //mikrodefinicja - zero na M2<br /> <br /> <br />// WYJŚCIE ENABLE<br />#define ENABLE (1&lt;&lt;PC4) //definicja pinu C4<br />#define ENABLE_1  (PORTC |= ENABLE) //mikrodefinicja - jeden na ENABLE<br />#define ENABLE_0  (PORTC &amp;= ~ENABLE) //mikrodefinicja - zero na ENABLE<br /> <br />//WYJŚCIE SLEEP<br />#define SLEEP (1&lt;&lt;PC3) //definicja pinu C3<br />#define SLEEP_1  (PORTC |= SLEEP) //mikrodefinicja - jeden na SLEEP<br />#define SLEEP_0  (PORTC &amp;= ~SLEEP) //mikrodefinicja - zero na SLEEP<br /> <br />//WYJŚCIE DIR<br />#define DIR (1&lt;&lt;PC2) //definicja pinu C2<br />#define DIR_1  (PORTC |= DIR) //mikrodefinicja - jeden na DIR<br />#define DIR_0  (PORTC &amp;= ~DIR) //mikrodefinicja - zero na DIR<br /> <br />//WYJŚCIE STEP<br />#define STEP (1&lt;&lt;PC1) //definicja pinu C1<br />#define STEP_1  (PORTC |=STEP) //mikrodefinicja - jeden na STEP<br />#define STEP_0  (PORTC &amp;= ~STEP) //mikrodefinicja - zero na STEP<br /> <br />//WYJSCIE RESET<br />#define RESET (1&lt;&lt;PC0) //definicja pinu C0<br />#define RESET_1  (PORTC |= RESET) //mikrodefinicja - jeden na RESET<br />#define RESET_0  (PORTC &amp;= ~RESET) //mikrodefinicja - zero na RESET<br /> <br />int main (void)<br />//inicjalizacja wyswietlacza<br />{<br />LCD_Initalize();<br />_delay_ms(1000);<br />LCD_Clear();<br />//--------------------------<br />stara = 3;<br /> <br />DDRC =0xff;// porty C jako out<br />DDRD |= (1&lt;&lt;PD7);// PD7 - sprzetowy PWM jako WYJSCIE dla TIMERA2<br /> <br />M0_1; //zero na M0<br />M1_0; //zero na M1<br />M2_1; //zero na M2<br />ENABLE_0; //zero na ENABLE<br />SLEEP_0; //zero na SLEEP<br />RESET_0; //zero na RESET<br />DIR_0; //jeden na DIR<br /> <br />TCCR2 |= (1&lt;&lt;WGM20);<br />TCCR2 |= (1&lt;&lt;COM21); //clear the top<br />TCCR2 |= (1&lt;&lt;CS20) ; //preskaler = 1<br />OCR2  =255;<br />TIMSK |= (1&lt;&lt;OCIE2); //<br /> <br />ADCSRA |= (1&lt;&lt;ADEN);// włączamy przetwornik<br />ADCSRA |= (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1);// preskaler /8, frequency 1MHz<br />ADCSRA |= (1&lt;&lt;ADIE);// włączam przerwania od ADC<br />ADMUX |=  (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0);// wewnętrzny Vref, konwersja dla ADC0<br /> <br />DDRA = 0x00;// porty ADC jako wejście<br /> <br />sei();// globalne zezwolenie na przerwania<br /> <br />LCD_WriteText(&quot;ADC start...&quot;);<br /> <br />while(1)<br />{<br />ADCSRA |= (1&lt;&lt;ADSC);// uruchamia pojedynczą konwersję<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));// czekam na zakończenie konwersji<br />_delay_ms(10);<br />}<br />}<br /> <br />ISR(ADC_vect)// obsługa przerwania ADC<br />{<br />char str&#91;16&#93;; //zapisanie wartosci 16-bitowej do tablicy<br />if (ADC &gt; stara+5 || ADC &lt; stara-5) //warunek, zeby silnik krecil sie w jakas strone jezeli<br />{//wartosc z ADC bedzie w przedziale +/- 5<br /> <br />if (ADC &gt; stara)<br />{<br />DIR_0;<br />}<br />else<br /> {<br /> DIR_1;<br /> }<br />sprintf(str, &quot;ADC: %i\n&quot;, ADC);<br />LCD_Clear();<br />LCD_WriteText(str);<br />ilekrokow = abs(ADC-stara);// kroki jako różnica pot old i new (tymczasowo)<br />licznik = 0;// zeruję licznik PWM'a<br />OCR2 = 50;// włączam PWM<br />stara = ADC;// zastępuję nową wartością<br />ADCSRA ^= (1&lt;&lt;ADIE); // zmiana stanu przerwania ADC<br />_delay_ms(3); //opoznienie po zmianie staniu przerwania<br />}<br />}<br /> <br />ISR (TIMER2_COMP_vect)<br />{<br />licznik++;<br />//_delay_ms(200);<br />if (licznik &gt; ilekrokow) //jeżeli zrobi tyle krokow co ma zrobić<br />{<br />OCR2 = 0;<br />ADCSRA ^= (1&lt;&lt;ADIE); // zmiana stanu przerwania ADC<br />}<br />}[/syntax]<br />Zależy mi właśnie na współpracy w działaniu (przekręceniu) potencjometru i obrotu silnika o podobny kąt obrotu potencjometru. <br />Zależy mi także na szybkości działania. Jak szybko przekręcę potencjometrem tak szybko musi wykonać obrót silnik. U mnie to za bardzo nie chce działać. <br />I teraz prośba czy mógłby mi ktoś sprawdzić ten kod i poprawić, podpowiedzieć co zrobiłem źle. <br /><br />Film z efektów działania i tutaj chciałem przeprosić za tą &quot;herezję&quot; czyli to okablowanie, które wisi w powietrzu.Jakby ktoś pytał to tak - mam zworki do płytki stykowej, które polecał Mirek. Ale wszystko jest podłączone zgodnie ze schematem, który podałem wyżej: <div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />A dążę to uzyskania dokładnie takiego efektu, który zrobił Pan Sylwek Kuna - użytkownik <strong>&quot;SylwekK&quot;</strong><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Dziękuję i pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6843">ProLogicTechnology</a> — 26 lut 2015, o 01:17</p><hr />
]]></content>
</entry>
</feed>