Witajcie!
Wiem że na Was zawsze mogę liczyć więc jestem pewien że i tym razem się nie zawiodę
A więc:
Mam układ zbudowany na bazie uc Atmega32 (8MHz). Do niego mam podłączonych kilka przycisków i cztery sterowniki silników krokowych. Ogólnie można powiedzieć że jest to coś w rodzaju maszyny CNC.
Program pisze w C i jego pierwszą wersję mam już praktycznie skończoną za wyjątkiem głównej pętli generującej impulsy kroku na silniki.
Pętla ta ma wygenerować podane ilości impulsów na każdy silnik (liA, liB, liC, liD) w stałym przedziale czasowym (czas_kr).
Impulsy te mają być równo "rozłożone" a wypełnienie przebiegów nie ma znaczenia, wystarczy tylko zbocze narastające.
Czyli jeszcze raz: podaje liA, liB, liC, liD i czas_kr i na wyjściu Atmegi mam na czterech oddzielnych pinach wygenerowaną odpowiednią liczbę impulsów w odpowiednim czasie, równo rozłożone.
Stworzyłem coś takiego:
Wszystko ładnie dział z małym wyjątkiem: pętla for daje bardzo duże opóźnienie!
Zwłaszcza jak NWW wyjdzie dosyć wysoki np 1000.
Macie może jakiś pomysł na ten mój "generator"
liA, liB, liC, liD wahają się w granicach 1 do 50 a czas_kr to ok 0.1 - 0.2s.
Pozdrawiam Wszystkich
Wiem że na Was zawsze mogę liczyć więc jestem pewien że i tym razem się nie zawiodę
A więc:
Mam układ zbudowany na bazie uc Atmega32 (8MHz). Do niego mam podłączonych kilka przycisków i cztery sterowniki silników krokowych. Ogólnie można powiedzieć że jest to coś w rodzaju maszyny CNC.
Program pisze w C i jego pierwszą wersję mam już praktycznie skończoną za wyjątkiem głównej pętli generującej impulsy kroku na silniki.
Pętla ta ma wygenerować podane ilości impulsów na każdy silnik (liA, liB, liC, liD) w stałym przedziale czasowym (czas_kr).
Impulsy te mają być równo "rozłożone" a wypełnienie przebiegów nie ma znaczenia, wystarczy tylko zbocze narastające.
Czyli jeszcze raz: podaje liA, liB, liC, liD i czas_kr i na wyjściu Atmegi mam na czterech oddzielnych pinach wygenerowaną odpowiednią liczbę impulsów w odpowiednim czasie, równo rozłożone.
Stworzyłem coś takiego:
// Tutak szukam Najmniejszego Wspólnego Dzielnika NWW
// Jest to potrzebne do równego rozłożenia impulsów:
a=li_A;
b=li_B;
c=li_C;
d=li_D;
iloczyn = a*b;
while(a!=b) if(a>b) a-=b; else b-=a;
b =iloczyn/a;
iloczyn = c*d;
while(c!=d) if(c>d) c-=d; else d-=c;
d =iloczyn/c;
iloczyn = b*d;
while(b!=d) if(b>d) b-=d; else d-=b;
NWW =iloczyn/b;
// główna pętla generująca impulsy na silniki w przedziale czasowym "czas_kr"
for (i=1 ; i<=NWW; i++)
{
if (i%(NWW/li_A)== 0) PORTC |=0x02;
if (i%(NWW/li_B)== 0) PORTC |=0x08;
if (i%(NWW/li_C)== 0) PORTC |=0x20;
if (i%(NWW/li_D)== 0) PORTC |=0x80;
// zerowanie pinów ABCD
PORTC &=0x55;
// opóźnienie
_delay_ms(czas_kr/NWW);
}
Wszystko ładnie dział z małym wyjątkiem: pętla for daje bardzo duże opóźnienie!
Zwłaszcza jak NWW wyjdzie dosyć wysoki np 1000.
Macie może jakiś pomysł na ten mój "generator"
liA, liB, liC, liD wahają się w granicach 1 do 50 a czas_kr to ok 0.1 - 0.2s.
Pozdrawiam Wszystkich
