Stone & Turtlex
Turtlex Turtlex
Сань, я тут подумываю написать open-source прошивку для лазерного станка, чтобы он работал на "голом" микроконтроллере. Самое сложное – микрошаги и парсинг G-кода, там нужно держать все четко и быстро. Ты когда-нибудь возился с микрошагами или пытался держать траекторию идеально ровной? Хотел бы услышать твое мнение, как у человека, который разбирается в точности и аккуратности.
Stone Stone
Конечно, я потратил немало времени на драйверы шаговых двигателей и обеспечение плотной траектории. Микрошаги – это просто вопрос настройки правильных токов драйвера и синхронизация полушагов с тем же разрешением, что и по осям X/Y. На «голо́м» микроконтроллере тебе понадобится таймерный прерывание, которое срабатывает с постоянной частотой и переключает драйверы обмоток в правильной последовательности, используя таблицу для синусоидальных значений, если ты делаешь аналоговые микрошаги. Для разбора G-кода – держи простой конечный автомат, который читает по одному байту, убирает комментарии и хранит числовые параметры в формате фиксированной запятой, чтобы избежать накладных расходов на числа с плавающей точкой. Как только у тебя есть целевые координаты, используй линейную интерполяцию с шагами в стиле Бре́зенхема, чтобы количество шагов по каждой оси было точным. Если будет дрожание, проверь, что прерывания шагов имеют более высокий приоритет, чем прием данных через UART. Это главный секрет, чтобы траектория была четкой и быстрой.
Turtlex Turtlex
Отличный обзор, но помни, таблицы соответствия могут сильно раздуть флэш-память, если уйти слишком вглубь — попробуй ограничиться 256 точек и используй небольшую аппроксимацию синуса. И для фиксированной точки, возможно, стоит сместить масштабирование, чтобы избежать отрицательных значений при вычитании небольших изменений; 32-битное целое число с форматом Q16.16 обычно дает оптимальный результат. Пробовал ли ты кэшировать буфер G-кода на UART с поддержкой DMA? Это может освободить процессор для обработки прерываний по шагам. Просто мысль к следующей итерации.
Stone Stone
Хорошие замечания, особенно про таблицу на 256 точек и масштабирование Q16.16. DMA для UART – отличный ход, теперь обработчик прерываний остаётся чистым. Посмотрю на размер флэш-памяти и убедюсь, что таблицы будут в быстрой памяти. Спасибо за правку.
Turtlex Turtlex
Рад, что помог. Только смотри, не закэшируй случайно буфер UART в оперативную память, которую ты уже используешь для очереди шагов; они начнут друг с другом воевать как кошки с собакой из-за одной игрушки. Удачи с этими акробатическими трюками с памятью.
Stone Stone
Не парься, выделим отдельный блок в SRAM под кэш UART и оставим очередь шагов в собственном кольцевом буфере. Так они друг другу не помешают. Спасибо, что предупредил.