Cara mengoperasikan router CNC tanpa menarik perhatian ...

Router CNC saya melayani dengan setia selama dua tahun, tetapi ada yang tidak beres, firmware mati , dan itu adalah pelatuk 0,9.



Awalnya saya hanya ingin mengunggahnya kembali, dan untuk tujuan ini saya mendapatkan kode sumber untuk Proyek CNC Grbl. Tapi rasa ingin tahu mengatasi dan saya terjun ke studi sumber-sumber ini ...



mereka membangun yang sangat sederhana dan logis, tetapi apa yang Rusia tidak suka mengemudi cepat karena mungkin untuk melewati kemungkinan bahwa sepatu untuk meningkatkan! Berdasarkan apa yang terjadi, posting Minggu singkat ini.



Sebenarnya ide pengontrol untuk mesin CNC cukup sederhana dan menarik. Ada beberapa utas pemrosesan - satu membaca data (gcode) dan menguraikannya, yang kedua mengubah perintah menjadi blok eksekusi, dan yang ketiga (stepper) benar-benar mengeksekusi blok ini. Aliran ketiga ini akan dibahas.



Stepper berurusan dengan daftar perintah individu dalam bentuk - ambil (X, Y, Z) langkah untuk ketiga (setidaknya) motor stepper, dan dalam waktu tertentu dan dalam arah yang ditentukan (yah, ini sangat sederhana). Saya harus mengatakan bahwa motor stepper dengan drivernya adalah hal yang cukup sederhana untuk dikendalikan - Anda mengatur (0 atau 1) arah putaran dan kemudian motor mencoba membuat satu langkah dengan penurunan input positif (0 -> 1) (dan biasanya ada 200 langkah per revolusi). Data sudah disiapkan, jadi Anda hanya perlu menghubungkan 3 bilangan bulat dengan waktu yang ditentukan.



Dalam bahasa aslinya, penulis menggunakan pengontrol atmega328p, tetapi praktis tidak ada perubahan, semuanya mudah ditransfer ke lengan (misalnya, stm32). Tetapi algoritme itu sendiri tidak bisa tidak menimbulkan pertanyaan.



Di satu sisi, algoritma Bresenham yang sangat sempurna digunakan, atau lebih tepatnya versinya dari Adaptive Multi-Axis Step-Smoothing. Tetapi di sisi lain, entah bagaimana semuanya rumit dan yang terpenting, kelancaran motor stepper dan keakuratan router secara langsung bergantung pada keakuratan sinyal kontrol. Dalam hal ini, ini disebabkan oleh frekuensi di mana pengatur waktu beroperasi dan waktu pemrosesan interupsi - dan ini memberikan tidak lebih dari 40-50 kHz, dan biasanya bahkan kurang - baik, yaitu, akurasi pengaturan kontrol adalah 20-50 mikrodetik.



Tetapi cukup jelas bahwa ketika kita memproses satu perintah dari buffer, kita hanya perlu menghitung momen peralihan sinyal pada port keluaran dan momen-momen ini dan membuat sakelar.



Karena saya sedang mempertimbangkan untuk beralih ke korteks-m (yah, lebih tepatnya, ke stm32h750, yang sangat saya sukai dan menjadi sangat murah), tugas seperti itu dapat diselesaikan sama sekali tanpa melibatkan CPU, hanya menggunakan dua saluran DMA dan satu penghitung 32-bit.



Idenya sangat sederhana. Biarkan satu saluran menulis data baru ke port pada penghitung overflow, dan saluran kedua menulis nilai penghitung maksimum baru (masuk akal untuk melakukan ini pada siklus jam pertama penghitung). Kemudian, untuk memproses perintah dari daftar, Anda perlu mempersiapkan larik nilai perubahan untuk port dan batas waktu di antara keduanya.



Ini akan menjadi seperti ini.



Penanganan interupsi - beralih ke buffer baru (buffering ganda).



#define MAX_PGM 32
typedef struct _pgm_buffer {
        uint32_t data[MAX_PGM];
        uint32_t delta[MAX_PGM];
} pgm_buffer;
pgm_buffer buf[2];
uint32_t current_buf = 1;
uint32_t flags = 0;
void program_down(DMA_HandleTypeDef *_hdma) {
        TIM2->CR1 &= ~TIM_CR1_CEN;
        if ((flags & BUF_RUNNING) == 0)
                return;
        current_buf ^= 1;
        DMA1_Channel5->CCR &= ~1;
        DMA1_Channel2->CCR &= ~1;
        DMA1_Channel5->CNDTR = MAX_PGM;
        DMA1_Channel2->CNDTR = MAX_PGM;
        DMA1_Channel5->CMAR = (uint32_t) (buf[current_buf].delta);
        DMA1_Channel2->CMAR = (uint32_t) (buf[current_buf].data);
        DMA1_Channel5->CCR |= 1;
        DMA1_Channel2->CCR |= 1;
        TIM2->CNT = 0;
        TIM2->ARR = 8;
        TIM2->EGR |= TIM_EGR_UG;
        TIM2->CR1 |= TIM_CR1_CEN;
}


Anda dapat memulai dengan cara ini:



       HAL_DMA_RegisterCallback(&hdma_tim2_up, HAL_DMA_XFER_CPLT_CB_ID,
                        program_down);
        HAL_DMA_Start_IT(&hdma_tim2_up, buf, &GPIOA->BSRR, MAX_PGM);
        DMA1_Channel5->CCR &= ~1;
        DMA1_Channel5->CPAR = &TIM2->ARR;
        DMA1_Channel5->CCR |= 1;
        TIM2->CCR1 = 1;
        TIM2->DIER |= TIM_DIER_UDE | TIM_DIER_CC1DE;
        flags |= BUF_RUNNING;


Nah, awalnya adalah:



        program_down(NULL);


Apa fungsinya? Mari hitung menggunakan contoh stm32h750 yang sama. Pengatur waktu (TIM2) beroperasi di sana pada frekuensi 200 MHz, latensi minimum adalah dua siklus clock, tetapi DMA tidak dapat mengirim data lebih cepat dari 50 MHz, yaitu, di antara dua perintah untuk mengalihkan port, Anda dapat meletakkan (dengan mempertimbangkan kemungkinan penggunaan bus) 40 nsec (25 MHz) - ini 1000 kali lebih baik dari implementasi aslinya!



Di sisi lain, lebar port 16 bit, sehingga Anda dapat secara bersamaan mengontrol 8 motor stepper alih-alih 3 Anda masih akan tahu mengapa ...



Pada saat yang sama, mengisi data itu sendiri tidak menyebabkan masalah (dengan resolusi ini dan itu!) - interpolasi linier sederhana untuk setiap motor secara terpisah dengan dengan menggabungkan (untuk pengoptimalan) peristiwa lebih dekat dari 40 nsec.



Kesimpulan sebenarnya.



Di bengkel ada mesin CNC jadi berukuran 1,2 meter kali 0,8 meter dengan motor dan driver, tetapi tidak ada pengontrol. Sepertinya kita harus menyelesaikan pekerjaan ini dan mencobanya dengan sangat epik. Jika saya melakukannya, saya pasti akan menulis sekuelnya. Sementara itu, saya tidak mengerti mengapa pengontrol melakukan ini pada atmega dan mereka mencicit pada semua 3d-printer dan cnc-router pada interupsi kasar ini ...



Dan tentu saja, mungkin memiliki kekuatan Cortex-M7, Anda dapat menerapkan kontrol lintasan yang lebih mulus dengan semua batasan , tapi itu artikel yang sama sekali berbeda.



NB Tampaknya, perlu untuk memberikan beberapa contoh hipotesis mengapa sangat penting untuk memiliki waktu yang singkat.



Misalkan mesin perlu bergerak 100 mm dalam X dan 11 mm dalam Y, dan perangkat lunak memecah semuanya menjadi beberapa bagian percepatan dan gerakan seragam - ada banyak bagian dari 100 langkah dengan 11 langkah dan dilintasi dengan kecepatan maksimum, biarkan sesuai dengan 10 kHz. Nah, 10 langkah di Y akan cocok dengan 100 langkah di X, tetapi masalah bisa terjadi pada langkah ke-11 - ini bisa dilewati, karena ini menyebabkan penggandaan frekuensi. Hasilnya, pergerakan akan menjadi 100 mm di X dan dari 10 menjadi 11 mm di Y. Dan ini terjadi dengan gerakan linier, di mana, pada kenyataannya, bahkan pembatasan akselerasi dan kecepatan yang diizinkan pun sederhana. Dan apakah itu dilakukan secara zigzag? Nah, misalnya, ada area yang menyapu 100 kali 110 mm dalam 10 lintasan - maka kami biasanya kehilangan banyak ...



Algoritme yang diusulkan digunakan untuk menghilangkan kesalahan ini, dan tidak sama sekali untuk pabrik super, dll.



All Articles