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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12823&amp;mode</id>
<entry>
<author><name><![CDATA[KoreX]]></name></author>
<updated>2015-09-01T21:17:08+01:00</updated>
<published>2015-09-01T21:08:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12823&amp;p=138896#p138896</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12823&amp;p=138896#p138896"/>
<title type="html"><![CDATA[Impuls STEP do sterownika silnika krokowego]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12823&amp;p=138896#p138896"><![CDATA[
Cześć, od jakiegoś czasu zajmuje się zagadnieniem generowania impulsu do sterownika silnika krokowego,<br />mam zewnętrzny sterownik reagujący na impuls &gt;2,5us i chce zrobić aby silnik startował i zatrzymywał się z rampą.<br />Obecnie jedyne rozwiązanie które udało mi się zrealizować opiera się na dwóch timerach, 1 - 16bit 2-8bit<br />Timer 1 zajmuje się generowaniem &quot;częstotliwości nośnej&quot; a timer 2 reguluje długość impulsu,<br />za każdym przerwaniem timera 1 zmieniam wartość OCR1A na wartość z tablicy która jest uzupełniana przy inicjalizacji programu(nie byłem w stanie wykonywać tych działań w przerwaniu bo się nie wyrabiałem) dzięki czemu zwiększam częstotliwość oraz uruchamiam timer 2 który po odliczeniu 4us wykonuje przerwanie w którym się wyłącza.<br />Działa to zgodnie z założeniami, tylko może ma ktoś pomysł jak zrobić to wykorzystując tylko Timer 16 bitów, albo jak zwiększyć ilość kroków ramy którą obecnie ogranicza wielkość tablicy.<br /><br />Oto mój kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;math.h&gt;<br />uint8_t d; // srednica rolki &#91;mm&#93;<br />uint8_t przelozenie; // przelozenie (1:2)0,5 gdy zmniejszamy obroty silnika, (2:1)2 gdy zwiekszamy (koło_silnika:koła_napędzanego)<br />uint16_t krokow_obrot; // podział korków sterownika (64 = 12800)<br />uint32_t czas_wykonania_w_cyklach; // czas ktory mamy na przesunięcie o zadana wartość &#91;cylk_zegarowy_8MHz&#93; --zmienna nieuzywana w V1<br />uint32_t czas_vmax;<br />uint32_t krokow_do_wykonania; // tutaj będzie liczona ilość kroków która silnik ma wykonać w czasie jednego &quot;cyklu&quot; przesunięcia<br />uint32_t krokow_accel;<br />volatile uint16_t krokow_wykonanych; // tutaj będzie przechowywana ilość wykonanych kroków<br />float przesuniecie_przycisk; // praca reczna, 1 x przycisk = &#91;mm&#93;<br />float kierunek_obrotow; // kierunek obrotów 0/1 &#91;0-PRAWE; 1-LEWE&#93;<br />volatile uint32_t v_max; // kierunek obrotów 0/1 &#91;0-PRAWE; 1-LEWE&#93;<br />uint32_t cykle_przeszle;<br />//volatile uint32_t rampa;<br />uint16_t krokow_pol;<br />uint16_t tablica&#91;500&#93;;<br />uint32_t pierwszy;<br />uint16_t czas;<br />uint16_t i;<br />uint8_t k;<br />uint8_t ready;<br /><br />//TCCR1B |= (1&lt;&lt;CS10); // prescaler = 1 //wlaczenie timera<br />//TCCR1B &amp;= ~(1&lt;&lt;CS10); // wyłączanie timera<br />//OCR1A = xx; - rejestr porownania<br />void inicjalizacja_timer(void)<br />{<br /><br />   DDRD |= (1&lt;&lt;PD5)|(1&lt;&lt;PD6); //<br />   DDRD |= (1&lt;&lt;PD2);<br />   DDRB |= (1&lt;&lt;PB3);<br />   PORTD |= (1&lt;&lt;PD2);<br />   PORTD &amp;= ~(1&lt;&lt;PD6);<br />   TCCR1B = (1&lt;&lt;WGM12); //timer1 w tryb CTC<br />   TCCR1A = (1&lt;&lt;COM1A0);<br />   TIMSK = (1&lt;&lt;OCIE1A);<br />   MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);   // zbocze opadajace PD2<br />   GICR |= (1&lt;&lt;INT0);            // odblokowanie INT0<br /><br />   TCCR0 |= (1&lt;&lt;COM00)|(1&lt;&lt;WGM01);<br />      TIMSK |= (1&lt;&lt;OCIE0);<br />      OCR0 = 15;<br />}<br /><br /><br /><br /><br /><br /><br /><br /><br />void dane_wejsciowe(uint16_t przesuniecie, uint32_t czaas)<br />{<br /><br />   d=100;<br />   przelozenie=1;<br />   krokow_obrot=12800;<br />   krokow_accel=600;<br />   czas_wykonania_w_cyklach = czaas * 16000;<br />   krokow_do_wykonania = 6400;<br />   //krokow_do_wykonania = (int)((przesuniecie/(M_PI*d)*krokow_obrot)/przelozenie);<br />   krokow_wykonanych=0;<br />   przesuniecie_przycisk=1; //mm<br />   kierunek_obrotow=0;<br /><br /><br />}<br /><br /><br />void obliczenia_krokow(void)<br />{<br /><br />   if(krokow_do_wykonania&lt;krokow_accel) // ustalanie zmiennych dla funkcji obliczajacej kroki<br />   {<br />      v_max=czas_wykonania_w_cyklach/(2*krokow_do_wykonania);<br />      pierwszy =sqrt((czas_wykonania_w_cyklach/2)*v_max);<br />      krokow_pol = krokow_do_wykonania/2;<br />      cykle_przeszle = pierwszy;<br /><br />   }<br />   else<br />   {<br />      krokow_pol = krokow_accel/2;<br />      czas_vmax= czas_wykonania_w_cyklach/(krokow_do_wykonania+krokow_accel)*(krokow_do_wykonania-krokow_accel);<br />      v_max=(czas_wykonania_w_cyklach-czas_vmax)/(2*krokow_accel);<br />      pierwszy =sqrt(((czas_wykonania_w_cyklach-czas_vmax)/2)*v_max);<br />      cykle_przeszle = pierwszy;<br /><br /><br />   }<br /><br /><br /><br /><br />   i=1;<br />   czas=pierwszy;<br />   if(czas&gt;65000)<br />   {<br />      czas=65000;<br />   }<br />   tablica&#91;0&#93;=czas;<br />   while(i&lt;krokow_pol)<br />   {<br />      czas = pierwszy*pierwszy/cykle_przeszle;<br />      if(czas&gt;65000)<br />      {<br />         czas=65000;<br />      }<br />      cykle_przeszle+=czas;<br />      tablica&#91;i&#93;=czas;<br />      i++;<br />   }<br /><br />}<br /><br /><br /><br /><br /><br /><br /><br />int main(void)<br />{<br /><br />   inicjalizacja_timer();<br />   dane_wejsciowe(100, 200);// &lt;------------------ dane_wejsciowe(czas, przesuniecie)<br />   obliczenia_krokow();<br />   sei();<br />   ready=1;<br />   while(1)<br />   {<br /><br /><br />   }<br /><br />}<br />ISR(INT0_vect)<br />{<br />   if(ready == 1)<br />   {i=1;<br />   krokow_wykonanych =1;<br />   OCR1A = tablica&#91;i&#93;;<br />   TCCR1B |= (1&lt;&lt;CS10); // prescaler = 1 //wlaczenie timera<br />   //wlaczamy zegar<br />   ready = 0;<br />   }<br />   //GICR &amp;= ~(1&lt;&lt;INT0);            // odblokowanie INT0<br /><br />}<br />ISR(TIMER1_COMPA_vect) {<br />   TCCR0 |= (1&lt;&lt;CS01);<br />   OCR1A = tablica&#91;i&#93;;<br />   krokow_wykonanych++;<br />   k=0;<br />   if(krokow_wykonanych&lt;krokow_pol)<br />   {<br />      i++;<br />   }<br />   if(krokow_wykonanych&gt;(krokow_do_wykonania-krokow_pol))<br />   {<br />      i--;<br />   }<br />   if(i==0)<br />   {<br />      TCCR1B &amp;= ~(1&lt;&lt;CS10); // wyłączanie timera<br />      ready = 1;<br /><br />   }<br /><br />}<br />ISR(TIMER0_COMP_vect)<br />   {<br />      if(k++==1){ // jeden takt timera<br />         TCCR0 &amp;= ~(1&lt;&lt;CS01);<br /><br />      }<br /><br /><br /><br />   }[/syntax]<br /><br />Pozdrawiam <br />KoreX<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=229">KoreX</a> — 1 wrz 2015, o 21:08</p><hr />
]]></content>
</entry>
</feed>