logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu

nuclear 10 Lip 2025 11:48 3207 13

TL;DR

  • Sterownik CNC na STM32H725 z FreeRTOS, Ethernetem i obsługą 4 osi z możliwością rozbudowy do 5, przeznaczony do frezarki CNC.
  • Kluczowe operacje czasu rzeczywistego działają w module wykonawczym, a impulsy osi generują szeregowo połączone liczniki STM32 z trybem preload i buforowaniem segmentów.
  • Program obsługuje 4 osie, z możliwością rozszerzenia do 5, oraz dodaje kody G2.1 i G3.1 dla łuków w dowolnej płaszczyźnie równoległej do osi Z.
  • Sterownik działa stabilnie w frezarce, a aplikacja na PC w C# .NET Windows Forms parsuje G-code, liczy prędkości i wysyła proste polecenia.
  • Na Linuksie przez MONO działa wersja z ograniczeniami, bo nie działa wizualizacja 3D, a do poprawy pozostają PCB, krańcówki i sprzętowy emergency stop.
Wygenerowane przez model językowy.
📢 Słuchaj (AI):
  • Cześć

    Chciałbym przedstawić kolejny mój projekt, tym razem jest to sterownik CNC.


    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu

    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu

    Jest już na rynku masa różnego rodzaju sterowników obrabiarek CNC, jak zwykle jednak chciałem zrobić coś własnego.

    Najważniejsze założenia projektowe:
    - Umiejscowienie całości kluczowych czasowo operacji w module wykonawczym.
    - Połączenie modułu z PC przy użyciu interfejsu ethernet.
    - Współbieżna obsługa 4 osi z możliwością rozszerzenia do 5.
    - Możliwość w przyszłości dodania obsługi enkoderów na osiach.
    - Sterowanie falownikiem z regulacją obrotów.
    - Aplikacja na PC pracująca w środowisku Windows.

    Zdecydowałem się na użycia mikrokontrolera STM32H725 - mocny, ma dużo liczników i w przystępnej cenie.
    Standardowo już użyłem systemu FreeRTOS i bibliotek które juz we wcześniejszych projektach stosowałem. Najważniejszym dla mnie było generowanie impulsów sterujących przy maksymalnym wykorzystaniu zasobów sprzętowych w celu uzyskania jak największej stabilności czasowej.
    W tym celu zastosowałem szeregowe połączenie liczników, master służy do generowania sygnału o zmiennej częstotliwości co odpowiada szybkości przesuwu, sygnał ten następnie napędza zestaw liczników - po jednym dla każdej osi, oraz dodatkowo jeden synchronizujący.
    W ten sposób uzyskałem łatwy podział miedzy kierunkiem a szybkością ruchu. Polega to na ustawieniu dla danego odcinka ruchu odpowiednio rejestrów ARR i PSC dla każdego licznika osi oraz liczniku synchronizującym. W efekcie uzyskujemy określoną liczbę impulsów dla każdej osi.
    Licznikiem master natomiast możemy dowolnie sterować prędkością pokonywania tego odcinka. Dzięki użyciu trybu preload dla liczników uzyskujemy możliwość załadowania parametrów następnego odcinka zanim bieżący się skończy - ładujemy nowe wartości w przerwaniu między ostatnim impulsem a końcem odcinka.
    W efekcie odcinki są wykonywane bez jakichkolwiek zaburzeń czasowych.
    Moduł otrzymuje z PC proste rozkazy, czyli tylko odcinki i łuki, wszystko już we współrzędnych maszynowych. Następnie łuki są dzielone na krótkie odcinki, i wraz z prostymi odcinkami są przeliczane na ustawienia rejestrów i buforowane.
    Każdy odcinek ma również wyliczone wcześniej prędkość początkową, końcową i maksymalną.

    Oprogramowanie na PC postanowiłem napisać w C# .net Windows Forms, w środowisku Visual Studio. Wybór ten wynikał z prostoty pisania rozbudowanej aplikacji z GUI i jednocześnie brakiem konieczności wykonywania krytycznych czasowo operacji.
    Głównym zdaniem tej aplikacji jest parsowanie kodu G-Code i przetwarzanie do prostych poleceń wysyłanych do modułu zewnętrznego.
    Przetwarzanie składa się z kilku etapów, pierwszym jest konwersja kodu G-code ze stringa do tablicy poleceń, jest na tym etapie sprawdzana poprawność składni, np czy wszystkie polecenia są obsługiwane, zmienne zdefiniowane a pętle i wyrazenia warunkowe odpowiednio pozamykane.
    Kolejnym etapem jest przetwarzanie poleceń do postaci proste - wyliczane są wyrażenia matematyczne, wykonywane pętle i podprogramy. Na tym etapie również wyliczana jest maksymalna prędkość dla każdego prostego polecenia (odcinki i łuki). Wyliczone fragmenty są umieszczane w buforze fifo.
    Ostatnim etapem jest skanowanie bufora fifo w celu wyliczenia dozwolonej prędkości przy przechodzeniu między segmentami przy uwzględnieniu kąta miedzy tymi segmentami, odległości do końca bufora i dozwolonych przyspieszeń. Po wyliczeniu szybkości początkowej i końcowej
    segmenty są już pakowane i wysyłane do modułu sterującego.

    Program obsługuje większość standardowych wyrażeń G-Code, ponadto dodałem nowy kody G2.1 i G3.1 - realizują one łuki w dowolnej płaszczyźnie równoległej do osi Z - przydatne np przy frezowaniu dekorów.
    Drugą funkcjonalnością dodatkową jest automatyczny pomiar nierówności powierzchni - sondowany jest zadany obszar a zmierzona siatka poprawek jest przesyłana do modułu wykonawczego. Poprawki te są następnie uwzględniane przy wszystkich ruchach w tym obszarze. Funkcja powstała z
    myślą o precyzyjnym frezowaniu płytek PCB ale można jej użyć również do grawerowania.

    Sterownik działa stabilnie, używam go od jakiegoś czasu w swojej frezarce i jestem z niego zadowolony. Przy użyciu biblioteki MONO aplikacja uruchamia się również na linuksie z ograniczoną funkcjonalnością - nie działa tylko wizualizacja 3D.

    Co zrobiłbym inaczej:
    W zasadzie chyba tylko drobne poprawki w PCB, obwód od krańcówek możnaby ulepszyć i może rozważyć całkowicie sprzętową obsługę emergency stop i hard limit, z pominięciem uC ale to już dmuchanie na zimne.

    Co jeszcze chciałbym zrobić:
    Przede wszystkim jako że często piszę kod ręcznie chciałbym poprawić edytor kodu, dodać kolorowanie składni, skróty klawiszowe itp. Drugą rzeczą do poprawy jest wizualizacja 3D - na razie jest dość toporna.
    Rozważam też inne podejście, czyli zastąpienie mojej aplikacji na PC jakąś wtyczką do LinuxCNC, natomiast na razie nie wiem jeszcze czy to jest możliwe i jak się za to zabrać ale może kiedyś w to popatrzę.

    Program powstawał z myślą o konkretnej płytce PCB, ale nic nie stoi na przeszkodzie żeby uruchomić go na innym sprzęcie, np na jakimś EVM jako że na PCB w zasadzie poza uC są tylko bufory i izolatory na wejściach i wyjściach więc do eksperymentów można je pominąć. Można też próbować użyć innego uC, ważne jest przede wszystkim żeby dysponował odpowiednią ilością liczników - 1 master + 1 slave 32bit + Ilość osi x 1slave + 2 (sterowanie szybkością i i HAL). Wysoce wskazane jest te zeby posiadał FPU jako że spora część obliczeń, przede wszystkim prędkość i konwersja łuków na odcinki, jest właśnie realizowana na zmiennych float.

    Kod i wzór PCB w formacie KiCAD: https://github.com/r-gal/CNC
    Program sterujący na PC : https://github.com/r-gal/CNC_app


    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu
    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu
    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu
    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu

    Fajne? Ranking DIY
    O autorze
    nuclear
    Poziom 16  
    Offline 
    Specjalizuje się w: technika cyfrowa, fpga, arm
    nuclear napisał 194 postów o ocenie 144, pomógł 18 razy. Mieszka w mieście Siepraw. Jest z nami od 2003 roku.
  • #3 21602939
    TechEkspert
    Redaktor
    Posty: 7047
    Pomógł: 16
    Ocena: 5457
    Robi wrażenie! można też pokazać na filmie jak pracuje maszyna.
    Projekt kojarzy mi się ze sterowaniem robotami wieloosiowymi i connected motion.

    Patrząc na maszyny amatorskie, które wykorzystywały LPT, rzadziej RS-232, później USB to wykorzystanie Ethernet odbieram jako bardzo dobry pomysł i tak powinny łączyć się obecnie sterowniki z PC. Chyba, że mamy środowisko innego rodzaju i natywny jest Modbus/Profibus itp.
  • #4 21602981
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    tesla97 napisał:
    Jaka jest maksymalna częstotliwość kroku?

    Przy obecnej implementacji teoretycznie jest to 75kHz. W praktyce nie jest to już zakres użyteczny gdyż ziarnistość regulacji prędkości rośnie do absurdalnych wartości - w zakresie powyżej 20khz mozna ustawić juz tylko wartości 75,50,37,30,25,21 kHz. Do sterowania silnikami krokowymi moim zdaniem to w zupełności wystarczy.
    Jezeli byłaby taka potrzeba to można by trochę jeszcze uzyskać w licznikach slave, jednocześnie trzeba by już przenieść program do pamięci ram żeby się szybciej wykonywał.
  • #6 21603613
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    Jako że projekt hobbistyczny to czasu poświęconego na to nie wyceniam, gdybym miał to orbić komercyjnie to ładnych kilka sztuk w cenie jak z linka bym musiał sprzedać zby to się opłacało. Co do ceny materiałów to myślę że w okolicy 200zł można się zamknąć, czy to robiąc od podstaw płytkę czy też wykorzystując np Nucleo i dorabiając płytkę z buforami.
    Przy okacji przypomniało mi to że w planach mam dodać manipulator na kablu
  • #7 21603623
    Jacekser
    Poziom 26  
    Posty: 1116
    Pomógł: 27
    Ocena: 329
    Kolega samodzielnie programowo realizuje trajektorię dla G-kodu, jak rozumiem?
    nuclear napisał:
    Rozważam też inne podejście, czyli zastąpienie mojej aplikacji na PC jakąś wtyczką do LinuxCNC,...

    A może MACH, jak to zaimplementował CS-LAB? Jest do niego dostępne (MACH3) SDK.
    Tak czy inaczej – gratuluję projektu!
  • #8 21604124
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    TechEkspert napisał:
    można też pokazać na filmie jak pracuje maszyna.


    Trochę wiórów:




    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu
    Płytki PCB też wychodzą całkiem sensownie:
    Sterownik CNC na STM32H725 z FreeRTOS, Ethernet i obsługą 4-5 osi – prezentacja projektu

    Jacekser napisał:
    Kolega samodzielnie programowo realizuje trajektorię dla G-kodu, jak rozumiem?


    Nie jestem pewny czy dobrze rozumiem pytanie - w końcu G-code już definiuje trajektorię, Ja tylko go przetwarzam na odcinki proste i wyznaczam prędkości,


    Jacekser napisał:
    A może MACH, jak to zaimplementował CS-LAB? Jest do niego dostępne (MACH3) SDK.
    Tak czy inaczej – gratuluję projektu


    Raczej wolałbym zostać przy darmowych rozwiązaniach, dlatego też na MACH nawet nie patrzyłem zbyt dokładnie.
  • #9 21604171
    TechEkspert
    Redaktor
    Posty: 7047
    Pomógł: 16
    Ocena: 5457
    Co to za napęd wrzeciona?
    Czy ten złoty przycisk w tle to zatrzymanie awaryjnie?
  • #10 21604204
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    TechEkspert napisał:
    Co to za napęd wrzeciona?
    Czy ten złoty przycisk w tle to zatrzymanie awaryjnie?


    Wrzeciono to Vevor 1.5kW z chłodzeniem wodnym. Złoty przycisk to czujnik wysokości narzędzia, wyłącznik awaryjny to ten czerwony po prawej na obudowie.
  • #11 21604451
    Jado_one
    Poziom 22  
    Posty: 650
    Pomógł: 43
    Ocena: 12
    Witam,
    Piękny projekt! :-) No i co najważniejsze - kompleksowy, bo i procesor, i aplikacja.
    Własne projekty mają to do siebie, że zawsze spełniają wszystkie nasze potrzeby, a gotowce zawsze czegoś nie mają albo działa to inaczej niż byśmy chcieli.
    Ciekaw jestem ile czasu zajęło jego stworzenie?
    Czy napisanie aplikacji na PC, czy napisanie kodu na STM'a było trudniejsze?
    Czy planujesz dodanie lokalnego małego wyświetlacza z chociażby bieżącymi parametrami położenia, itp...?
    Projekt mnie zainteresował, bo niebawem będę robił coś podobnego (też na STM32H7xx - piękne procesory swoją drogą ;-)) , tyle że sterownik do tokarki CNC (może to nawet za dużo powiedziane - zdaje się, że można to nazwać bardziej elektroniczną gitarą do tokarki). Nie za bardzo można użyć gotowca, bo do nacinania gwintów potrzebna jest synchronizacja z obrotami wrzeciona. Zwłaszcza, że działam notorycznie pod linuxem ;-)
    Trochę podpatrzę jak rozwiązałeś zasilanie procesora - bo jeszcze nie robiłem własnej płytki na STM32H7, a tam można zasilanie zrobić na kilka sposobów.
    Jakieś dalsze plany rozbudowy sterownika? Sterowanie ręczne (zadajnik pozycji chyba się to nazywa) by się z pewnością przydało.
    Sonda touch?
    W każdym razie gratuluję udanej realizacji :-)
  • #12 21604465
    TechEkspert
    Redaktor
    Posty: 7047
    Pomógł: 16
    Ocena: 5457
    Komunikacja jest po TCP czy UDP?
  • #13 21604777
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    Jado_one napisał:

    Ciekaw jestem ile czasu zajęło jego stworzenie?


    Ciężko powiedzieć ile dokładnie ale niemało, Kod zacząłem pisać jakis rok temu ale robiłem to z doskoku bo i innymi projektami się zajmowałem, nie jest to tez pierwsza wersja, dwa razy porzucałem zamysł i zaczynałem w zasadzie od nowa.

    Jado_one napisał:

    Czy napisanie aplikacji na PC, czy napisanie kodu na STM'a było trudniejsze?


    Na to pytanie tez nie mam jednoznacznej odpowiedzi, obie części miały swoje trudniejsze fragmenty. W kodzie na STM dużo czasu mi zajęło dostrojenie całego tego zestawu liczników tak żeby to pracowało dokładnie, czyli żeby wszystko się zgadzało co do impulsu, żeby wszystkie liczniki osi startując w tym samym momencie na koniec odcinka miały wartość 0 i to przy dowolnych kombinacjach ilości impulsów na odcinek. Kilka podejść też miałem do kwestii konwersji łuków na odcinki, finalnie stanęło na wersji w której generuję łuk w płaszczyźnie XY a potem go traktuję macierzą obrotu co pozwoliło mi na obsługę łuków w dowolnej płaszczyźnie.
    Aplikacja na PC z kolei wiązała się z koniecznością doszkolenia się w tym środowisku które nie jest dla mnie naturalne - wolę pracować "niżej". Tutaj było sporo pracy ze względu na całe GUI, trochę projektowania też zajęła obsługa kompensacja grubości narzędzia - wyliczanie nowej trajektorii na przejściach miedzy kolejnymi segmentami, trochę geometrii trzeba było tu przetworzyć.

    Jado_one napisał:

    Czy planujesz dodanie lokalnego małego wyświetlacza z chociażby bieżącymi parametrami położenia, itp...?

    Jest taki pomysł, płytka nawet ma przygotowane złącze dla wyświetlacza alfanumerycznego lcd, ale na razie nie jest to dla mnie najważniejsze. Początkowo rozważałem opcję pracy bez użycia PC w szczególnych zastosowaniach ale odszedłem od tego pomysłu na czas nieokreślony.

    Jado_one napisał:

    Projekt mnie zainteresował, bo niebawem będę robił coś podobnego (też na STM32H7xx - piękne procesory swoją drogą ) , tyle że sterownik do tokarki CNC (może to nawet za dużo powiedziane - zdaje się, że można to nazwać bardziej elektroniczną gitarą do tokarki). Nie za bardzo można użyć gotowca, bo do nacinania gwintów potrzebna jest synchronizacja z obrotami wrzeciona. Zwłaszcza, że działam notorycznie pod linuxem
    Trochę podpatrzę jak rozwiązałeś zasilanie procesora - bo jeszcze nie robiłem własnej płytki na STM32H7, a tam można zasilanie zrobić na kilka sposobów.


    W sumie sterownik do frezarki czy tokarki to na jedno wychodzi w ogólnej konstrukcji, może trzeba by niektóre komendy G-code doimplementować. Synchronizacja z obrotami wrzeciona to w teorii nie problem - wrzeciono jest traktowane jako oś obrotowa i sterowane jak każda inna oś. przykładowo dajesz rozkaz G1 X100 A360 to powoduje przesunięcie noża o 100mm przy jednoczesnym obrocie wrzeciona o 360stopni. Mój sterownik to potrafi i sądzę że większość instniejących na rynku tez powinna.
    STM32H7xx faktycznie są fajne, możliwości masa a cena przystępna - przemigrowałem z STM32F4xx jak STM32H7xx stały się tańsze. Zasilanie akurat zrobiłem najprościej jak się da - nie wykorzystałem wbudowanej przetwornicy tylko użyłem wbudowanych LDO czyli domyślnego źródła zasilania.

    Jado_one napisał:

    Jakieś dalsze plany rozbudowy sterownika? Sterowanie ręczne (zadajnik pozycji chyba się to nazywa) by się z pewnością przydało.
    Sonda touch?

    Ręczny zadajnik pozycji to teraz chyba nr 1 w kolejce do zrobienia bo mi tego brakuje. Sondy na razie nie planuję, robię głównie w drewnie i tu pozycjonowanie "na papierek" w zupełności wystarczy. Mam pomiar długości narzędzia, i próbkowanie powierzchni przewodzących samym narzędziem (np do frezowania PCB) i to mi póki co wystarczy.

    TechEkspert napisał:
    Komunikacja jest po TCP czy UDP?

    Miałem dylemat czego użyć, w końcu zdecydowałem się na UDP z programową kontrolą transmisji. Każde polecenie ma swój numer kolejny i w razie potrzeby jest ono retransmitowane - tzn jak nie dostaniemy potwierdzenia. Trochę jak TCP tylko potwierdzamy poszczególne komendy a nie bajty. TCP też by w sumie działało równie dobrze.
  • #14 21616976
    nuclear
    Poziom 16  
    Posty: 194
    Pomógł: 18
    Ocena: 144
    Hej, jakby ktoś przypadkiem był zainteresowany przetestowaniem mojego sterownika i miał akurat płytkę NUCLEO to wrzuciłem na githuba wersję przygotowaną na platformę NUCLEO-F439ZI, projekt jest w formacie STM32CubeIDE - używając tego narzędzia wystarczy ściągnąć repo, skompilować i wgrać. Prościej już się chyba nie da ;)
    https://github.com/r-gal/CNC_Nucleo_stm32f439
📢 Słuchaj (AI):

Podsumowanie tematu

✨ Przedstawiono projekt sterownika CNC opartego na mikrokontrolerze STM32H725 z systemem FreeRTOS, obsługującego 4-5 osi i komunikującego się z PC przez Ethernet. Sterownik realizuje generowanie impulsów krokowych z maksymalną częstotliwością teoretyczną do 75 kHz, praktycznie użyteczną do około 20 kHz ze względu na ziarnistość regulacji prędkości. Projekt zakłada możliwość rozszerzenia o enkodery osi oraz sterowanie falownikiem z regulacją obrotów. Kod na STM32 realizuje przetwarzanie G-kodu na odcinki proste i wyznaczanie prędkości, w tym obsługę łuków w dowolnej płaszczyźnie poprzez macierz obrotu. Komunikacja z PC odbywa się przez Ethernet (TCP/UDP nie jest jednoznacznie określone). Autor udostępnił również wersję projektu na platformę NUCLEO-F439ZI w STM32CubeIDE. W projekcie zastosowano wrzeciono Vevor 1.5 kW z chłodzeniem wodnym. Dyskutowano o porównaniu z komercyjnymi sterownikami CS-LAB oraz o możliwościach rozwoju, takich jak dodanie manipulatora kablowego czy lokalnego wyświetlacza parametrów. Projekt jest hobbystyczny, a koszt materiałów szacowany jest na około 200 zł.
Wygenerowane przez model językowy.
REKLAMA