Функция линеаризации скорости шпинделя для прошивки GRBL

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
Am0k
Кандидат
Сообщения: 52
Зарегистрирован: 29 ноя 2017, 22:50
Репутация: 14
Настоящее имя: Павел
Контактная информация:

Функция линеаризации скорости шпинделя для прошивки GRBL

Сообщение Am0k »

Столкнулся с тем, что задаваемые скорости вращения шпинделя и реальные не соотвествовали друг другу в самодельном ЧПУ на базе GRBL. В прошивке есть функция линеаризации, но ни одного мало-мальски толкового описания ее работы на русском не нашел. В общем покурил ее сам и решил поделиться, может кому то будет полезно. Итак, нам понадобиться ЧПУ на основе GRBL, тахометр, браузер, Arduino IDE и Candle.
1. Проходим по адресу https://github.com/gnea/grbl/releases и загружаем исходники GRBL (я использовал v1.1h (2019-08-25)).
2. Закидываем папку «grbl» из архива в папку «libraries» в Arduino.
3. Настраиваем нашу прошивку. В файле «cpu_map.h» должны быть установлены следующие настройки
SPINDLE_PWM_MIN_VALUE 1
SPINDLE_PWM_MAX_VALUE 255
В файле «defaults.h» правим свои настройки (либо добавляем новую секцию DEFAULTS_XXX со своим названием и объявляем ее в файле «config.h» #define DEFAULTS_XXX, где вместо XXX – данное нами имя, одинаковое в обоих файлах, либо правим прямо DEFAULTS_GENERIC секцию, очень удобно записав всего один раз все настройки при смене прошивки, ее обновлении, просто редактировании не перезаписывать все снова), это настройки, которые будут использованы по умолчанию, если в EEPROM не указаны иные. Если хотите загрузить в EEPROM настройки, указанные в «defaults.h», используйте консольную команду «$RST=$». Здесь должны быть установлены следующие настройки
#define DEFAULT_SPINDLE_RPM_MAX 255.0
#define DEFAULT_SPINDLE_RPM_MIN 1.0
4. Загружаем прошивку через Arduino IDE (папка Arduino\grbl\examples\grblUpload\grblUpload.ino). Через монитор порта загружаем в EEPROM настройки по умолчанию (если вы использовали ранее более старую версию прошивки – это крайне желательно), либо просто проверяем, что заданы следующие параметры (правим в случае необходимости):

$31=1
$32=255

5. Проходим по адресу https://repl.it/languages/python3
6. Из архива прошивки достаем файл «doc\script\fit_nonlinear_spindle.PY». Открываем блокнотом, содержимое копируем в окно «main.py» на странице браузера.
7. В настройках Candle для удобства задаем минимальную и максимальную скорость шпинделя как 1 и 255 соответственно. Затем снимаем показания зависимости реальной скорости вращения шпинделя от заданной, и записываем в наш скрипт в секции

PWM_set = np.array([55,57,60,65,70,80,100,120,140,160,180,200,220,240,245,250,255], dtype=float)

RPM_measured = np.array([380,530,745,1115,1450,2160,3535,4875,6075,7180,8230,9340,10520,11700,12100,12340,12520], dtype=float)

Так же правим точки, которые будут «переломными» для линеаризации. В моем случае это

PWM_point1 = 55.0
PWM_point2 = 80.
PWM_point3 = 150.0

Запускаем скрипт кнопкой RUN. Если вы видите, что график имеет сильные искривления в точках, отличных от переломных, замените их значения и запустите скрипт еще раз.

8. Скрипт в правом окне выдаст нам результаты вида

SOLUTION:

[Update these #define values and uncomment]
[ENABLE_PIECEWISE_LINEAR_SPINDLE in config.h.]
#define N_PIECES 4
#define RPM_MAX 12554.5
#define RPM_MIN 372.1
#define RPM_POINT12 372.1
#define RPM_POINT23 2233.8
#define RPM_POINT34 6631.6
#define RPM_LINE_A1 1.000000e-02
#define RPM_LINE_B1 -5.127938e+01
#define RPM_LINE_A2 1.342838e-02
#define RPM_LINE_B2 -5.000381e+01
#define RPM_LINE_A3 1.591714e-02
#define RPM_LINE_B3 -4.444445e+01
#define RPM_LINE_A4 1.772767e-02
#define RPM_LINE_B4 -3.243782e+01

[To operate over full model range, manually write these]
['$' settings or alter values in defaults.h. Grbl will]
[operate between min($30,RPM_MAX) and max($31,RPM_MIN)]
$30=12554.5 (rpm max)
$31=372.1 (rpm min)

[Update the following #define values in cpu_map.h]
#define SPINDLE_PWM_MIN_VALUE 55

А также график:
line_fit.png (2560 просмотров) <a class='original' href='./download/file.php?id=175890&sid=277c49cc4350db301003de2f8f3ba164&mode=view' target=_blank>Загрузить оригинал (27.21 КБ)</a>
В моем случае с нелинейностью проблем особых нет, но есть проблемы с точкой начала графика. В случае использования 775 мотора в качестве шпинделя график будет выглядеть куда интереснее:
line_fit_775.png (2560 просмотров) <a class='original' href='./download/file.php?id=175891&sid=277c49cc4350db301003de2f8f3ba164&mode=view' target=_blank>Загрузить оригинал (23.84 КБ)</a>
9. Правим прошивку. В файле «config.h» раскомментируем

ENABLE_PIECEWISE_LINEAR_SPINDLE

И заменяем своими данными те данные, что там есть

#define N_PIECES 4
#define RPM_MAX 12554.5
#define RPM_MIN 372.1
#define RPM_POINT12 372.1
#define RPM_POINT23 2233.8
#define RPM_POINT34 6631.6
#define RPM_LINE_A1 1.000000e-02
#define RPM_LINE_B1 -5.127938e+01
#define RPM_LINE_A2 1.342838e-02
#define RPM_LINE_B2 -5.000381e+01
#define RPM_LINE_A3 1.591714e-02
#define RPM_LINE_B3 -4.444445e+01
#define RPM_LINE_A4 1.772767e-02
#define RPM_LINE_B4 -3.243782e+01

В файле «defaults.h» правим

#define DEFAULT_SPINDLE_RPM_MAX 12554.5
#define DEFAULT_SPINDLE_RPM_MIN 372.1

В файле «cpu_map.h» правим

#define SPINDLE_PWM_MIN_VALUE 55

Прошиваем. Через монитор порта задаем новые значения

$30=12554.5
$31=372.1

в EEPROM (они не перезаписываются автоматически из настроек прошивки, если не использована команда «$RST=$»). Меняем настройки Candle (минимальную и максимальную скорость шпинделя на наши, необязательно задавать именно полученные, но минимальное лучше задать немного больше (500), так как не все шпиндели стабильно стартуют на низком RPM, а задавать максимальные больше полученных тоже нет смысла, просто часть ползунка окажется бесполезной, я установил 12500).

Проверяем, задавая разную скорость вращения шпинделя через Candle и проверяя соответствие реальной скорости. В моем случае расхождение составило не более 100 RPM (для середины диапазона в 12000 это меньше 2%).
Приветствуются вопросы и пожелания, я прекрасно понимаю что не все здесь прозрачно, поэтому эту "мини-инструкцию" буду дополнять.

Вернуться в «Электроника»