Witam Wszystkich
Chciałbym zbudować frezarkę CNC w oparciu o programowanie typu MACH 3. Na jego "wyjściu" podawany jest sygnał dir i step. Niestety ze względu na masę konstrukcji nie mogę zastosować silników krokowych.
Powstaje problem jak obsługiwać silnik DC z enkoderem za pomocą sygnału przeznaczonego dla siników krokowych.
Na elektrodzie znajduje się projekt takiego serownika:
https://www.elektroda.pl/rtvforum/topic1253786.html Lecz jest on dość stary, ma trochę błędów a do tego nie jest udostępniony kod programu w C tylko binarki.
Zalazłem wręcz idealny projekt, na którym można oprzeć całą część hardwarowa, lecz kod jest w assemblerze którego zupełnie nie znam:
http://elm-chan.org/works/smc/report_e.html
Jest kilka dużych problemów do rozwiązania takich jak:
-Zamiana impulsów na rozkaz dla silnika - czy zliczać je w odstępach czasu czy pojedynczo wrzucać do "modułu sterownika"
-Obsługa enkodera
-Rozwiązanie sterowania silnikiem za pomocą PWM, zastosowanie regulatora najprawdopodobniej PIDi regulacje jego parametrów
Wykorzystanie programu w asm nie jest rozwiązaniem ze względu na to że nie będę w stanie wykorzystać tej wiedzy(kodu programu) do następnych projeków - sterowanie serwem jako napędem do posówu tokarki, proporcjonalnie do kąta obrotu wrzeciona.
Najprawdopodobniej któryś użytkownik tego zacnego forum juz napisał tego typu program i mógłby się podzielić nim.
Dziękuje za pomoc
Właściwie oda linki które podałeś dotyczą tego samego projektu.
Jeśli chodzi o sterowanie ( schemat, blok mocy etc ... ) to można znaleźć w sieci schematy od UHU.
Z programem jest gorzej.
Jeśli chodzi o pojedyncze elementy jak obsługa enkoderów kwadraturowych, PID, sterowanie silnikiem DC nie jest problemem.
Problem pojawia się jeśli chcesz to wszystko połączyć. A to ze względu na szybkość procesorów ( dlatego właśnie sterownik serwa jaki znalazłeś jest napisany w asemblerze, aby uzyskać maksymalną wydajność. ).
Jeśli chodzi o realizację w języku C to wg. mnie najlepszą platformą będzie jakiś ARM.
Ad. poszczególnych bloków programowych to poszukaj. Gwarantuję że wszystko jest.
W razie czego mogę poszukać i wrzucić kawałki kodu.
Zanim zaczniesz kup albo wymontuj z jakiejś starej drukarki
trzy silniki krokowe, zrób jakieś proste sterowniki i spróbuj
"napędzić" to za pomocą MACH2 lub 3 w wersji demo.
Ja spróbowałem-totalna porażka.
Wystarczy że windows zacznie coś robić w "tle"-włączy dysk itp. sterowanie przez LPT dostaje "kota"-silniki wariują.
W instrukcji piszą żeby wyłączyć tryb oszczędzania energii,
wygaszanie ekranu i wszystko co można-nic nie pomaga.
Jakiś czas chodzi wszystko dobrze i raptem "kicha".
To może być do jakichś mało ważnych zadań ale jak silniki krokowe są dla ciebie za słabe to pewnie jakaś poważniejsza praca.
Dodano po 8 [minuty]:
PS.
A problemem też jestem zainteresowany.
W mojej firmie uruchamiam frezarkę 1500x2000mm
napędzaną silnikami krokowymi.
Być może za jakiś czas będę chciał zmienić na serwo, bo te krokowe są jednak wolne.
Na razie nie mam pomysłu na tanie rozwiązanie(można kupić gotowy system).
Witam
Spora konstrukcja nie musi wykluczyć silników krokowych, choć Serwo DC myślę, że jest lepszym i tak rozwiązaniem... jeśli nie posiadasz dużych silników to poszukaj przekładni tak aby mniejsze mogły to obsłużyć, pod warunkiem, że nie musi być to szybkie. Możesz użyć śrub napędowych, co już dość sporo powinno przełożyć siłę
Jeśli budujesz dużą frezarkę, choć podejrzewam, że raczej cyfrujesz starą maszynę, to niestety "trzeba włożyć żeby, wyjąć". Bezpieczniej jest w kupić duże silniki DC z zabudowanymi enkoderami, oraz normalne sterowanie. nie jest to tanie, ale idea jak wyżej i bezpieczeństwo!
Co do mach uważam ze działa ok, mam core 2 duo wiec możne dla tego nie odczuwam problemów, zrobiłem 2 sterowniki na atmaga 8 silników krokowych i działy ok.
Kompletna elektronika jest na stronie ELM (tej zagranicznej), gdy by sie pojawił problem z wydajnością zawsze można lepszego atmela znaleźć one chyba chodzą do 32mHz?
W ostateczności można zrobić budowę modułową, jeden procek od enkodera 2 od zliczania impulsów dir i stp a ostatni od PWM na silnik.
Nawet sam sterownik z PMW i PID odbierający zygnały np po UART o ile kroków ma się przesunąć byłby niezwykle przydatnym modułem do budowy większych systemów.
Co do wykorzystania tego - jestem studentem automatyki i zastanawiam się właśnie nad budową takiej obrabiarki na dyplom, warstwa fizyczna tzn mechanika nie jest problemem ponieważ koszty mieszczą sie w 1000 zł przy małej maszynie ( i dużej ilości kombinowania i własnej pracy), to już profesjonalna elektronika jest niewyobrażalnym wydatkiem
Mardook:
"Możesz użyć śrub napędowych, co już dość sporo powinno przełożyć siłę"- i koszty.
Za śrubę(z obróbką końcówek), nakrętkę i obudowy łożysk
zapłaciłem 3200zł.(do osi X)
Za oś Z z silnikiem krokowym 1000 zł.
Za dwie śruby w Y po 3400zł.
Koła zębate, paski, mocowania itp. ok.2000zł.
Prowadnice, wałki, podpory, sterowniki silników, zasilacze
ok.5000zł
A konstrukcja i projekt całej maszyny zrobiona w firmie-czego nie liczę.
Ale i tak w projekcie zippy postaram się udzielać bo jest interesujący.
Jak się coś z tego urodzi to zapraszam do sprawdzenia na mojej maszynie.
Co do wydajnosci dodam jeszcze ze kolejna wersja tego serwo kontrolera wyszła na attiny2313 taktowane na 16Mhz. Pierwsza wersja za at90s2313 w czasie pracy zużycie procesora było 40% Wiec problemem teraz jest tylko algorytm - tzn kod programu.
Może ktoś ze znajomością assemblera mógł by naświetlić jak dokładnie działa tamta aplikacja ?
http://elm-chan.org/works/smc/smc3.zip
Tak 16Mhz .. ale ckdiv8=1 więc 2Mhz ... na dodatek algorytmy PID zorganizowane są na zmiennych stałoprzecinkowych (chyba) wynika to z opisu konfiguracji.
Jeśli chcesz to wrzucę Ci PID-a ale ze zmiennym przecinkiem .. trzeba by sprawdzić ile czasu zajmuje algorytm. ( coś mi się kołacze że na pusto @ 18Mhz Atmega168 robił coś ok 100Khz ale nie jestem pewien. )
Enkoder to prosta sprawa albo układ rozpoznający kierunek na logice zewnętrznej i 2 przerwania + i - ( coś takiego widziałem gdzieś w sieci bodajże jakiś rosyjski klon UHU ) albo programowo.
Zauważ że autor na stronie ELM pominął układ kontroli prądu silnika. Warto się zastanowić zatem czy nie wypadało by projektu wzbogacić o tą funkcjonalność. ( Kopiować raczej niema sensu może więc lepiej zrobić coś o krok dalej. )
Odnośnie wydajności to sugerowałem się właśnie sterownikiem UHU ( tam jest też 2313 ale pracujący z kwarcem 24Mhz. )
Myślę że algorytm nie jest bardzo skomplikowany. Popatrz sobie na górze strony źródłowej masz schemat algorytmu. Jest to PID wzbogacony o kontrolę prędkości maksymalnej i kontrolę prądu ( w tym przypadku bez sprzężenia zwrotnego. )
Podłączę się do tematu.
Konstruuję sterownik silnika prądu stałego - serwonapęd.
W tym momencie mam gotowe podprogramy:
- odczyt pozycji z enkodera
- regulator PID (nie działa tak jakbym chciał, albo potrzebny jest tuning parametrów albo mam gdzieś błąd w kodzie)
W tym momencie silnik lubi oscylować wokół pozycji zadanej.
W tym momencie stanąłem na funkcjach generowania ruchu trapezoidalnego. Prawdę mówiąc nie wiem od czego zacząć. Domyślam się, że potrzebna w programie będzie prędkość aby określić max V i a.
Nigdy wcześniej nie programowałem, więc chyba i tak daleko z tym zaszedłem... Uprzejmie proszę o jakieś wskazówki jak zrobić pomiar prędkości. (coś próbowałem z sprawdzaniem różnicy stanu rejestru pozycji w parzystych i nieparzystych cyklach przerwania regulatora PID, ale nie działało to za dobrze).
Timer0 działa jako przerwanie 1kHz z pętlą sprawdzania pozycji i liczenia regulatora PID.
Timer1 działa jako PWM z f=15kHz.
Poszukuję też kogoś z Bydgoszczy chętnego udzielić korepetycji w tym temacie. Oczywiście odpłatnie. Czekam na PM od chętnych.
void Set_Input(int16_t inputValue)
{
pwm_value = inputValue; // Skalowanie wyniku -
if(pwm_value >= 0x0240) // Ograniczenie mocy silnika
{
pwm_value = 0x0240; // Jeśli przekroczono wartość maks, to ustaw maks
}
if(pwm_value < 0x00) //Wykluczenie pwm < od skutecznej wartości, ktora powoduje ruch silnika
{
pwm_value = 0x00; // Jeśli przekroczono wartość maks, to ustaw 0
}
OCR1A = pwm_value; // Wpisanie wart. PWM do rejestru porównującego
}
SIGNAL (INT0_vect) //obsługa przerwania
{
en_now = (ENC_PORT & (3 << 2)) >> 2; // odczyt portu i przesuniecie bitow na prawo
en_dir = (en_prev & 1) ^ ((en_now & 2) >> 1); // sprawdzenie kierunku obrotu
if(en_dir == 0)
{
en_pos++; // Kierunek obrotu w prawo: dodaj
}
else
{
en_pos--; // Kierunek obrotu w lewo: odejmij
}
en_prev = en_now; // Zapamiętaj ostatnią wartosc do porownania nast. razem
}
Tak odnośnie regulatora... przy silnikach poleciłbym Ci zastosować algorytm PI (bez D), czyli proporcjonalno-całkujący, bez różniczkowania. Daje to lepsze efekty, z powodu problemów z regulacją pełnego algorytmu.
Tutaj bym się nie zgodził, do regulacji serwonapędów stosuję się regulator PD, z tej przyczyny że przy PID masz dwa całkowania (silnik plus część całkująca regulatora) które to właśnie mogą powodować oscylacje i generalne problemy w regulacji.
Dzięki za pomoc choć nie było ona zbyt duża. W każdym razie dzięki. Udało się wszystko zrobić samemu choć momentami było ciężko.
Praca zrobiona i obroniona na piątkę Serwonapęd działa świetnie. Kto chce może zobaczyć na youtube. Szukajcie po nicku.