- Регистрация
- 28.12.2018
- Сообщения
- 6
- Реакции
- 10
- Баллы
- 23
- Город
- Грязи
- Имя
- Павел
Столкнулся с тем, что задаваемые скорости вращения шпинделя и реальные не соотвествовали друг другу в самодельном ЧПУ на базе GRBL. В прошивке есть функция линеаризации, но ни одного мало-мальски толкового описания ее работы на русском не нашел. В общем покурил ее сам и решил поделиться, может кому то будет полезно. Итак, нам понадобиться ЧПУ на основе GRBL, тахометр, браузер, Arduino IDE и Candle. Тема также создана на cnc-club, где ее лучше примет аудитория, там и будем ее развивать.
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
Из архива прошивки достаем файл «doc\script\fit_nonlinear_spindle.PY». Открываем блокнотом, содержимое копируем в окно «main.py» на странице браузера.
В настройках 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
6. Запускаем скрипт кнопкой RUN. Если вы видите, что график имеет сильные искривления в точках, отличных от переломных, замените их значения и запустите скрипт еще раз.
Скрипт в правом окне выдаст нам результаты вида
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
А также график:
В моем случае с нелинейностью проблем особых нет, но есть проблемы с точкой начала графика. В случае использования 775 мотора в качестве шпинделя график будет выглядеть куда интереснее:
7. Правим прошивку. В файле «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
8. Прошиваем. Через монитор порта задаем новые значения
$30=12554.5
$31=372.1
в EEPROM (они не перезаписываются автоматически из настроек прошивки, если не использована команда «$RST=$»). Меняем настройки Candle (минимальную и максимальную скорость шпинделя на наши, необязательно задавать именно полученные, но минимальное лучше задать немного больше (500), так как не все шпиндели стабильно стартуют на низком RPM, а задавать максимальные больше полученных тоже нет смысла, просто часть ползунка окажется бесполезной, я установил 12500).
Проверяем, задавая разную скорость вращения шпинделя через Candle и проверяя соответствие реальной скорости. В моем случае расхождение составило не более 100 RPM (для середины диапазона в 12000 это меньше 2%).
Приветствуются вопросы и пожелания, я прекрасно понимаю что не все здесь прозрачно, поэтому эту "мини-инструкцию" буду дополнять.
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
Из архива прошивки достаем файл «doc\script\fit_nonlinear_spindle.PY». Открываем блокнотом, содержимое копируем в окно «main.py» на странице браузера.
В настройках 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
6. Запускаем скрипт кнопкой RUN. Если вы видите, что график имеет сильные искривления в точках, отличных от переломных, замените их значения и запустите скрипт еще раз.
Скрипт в правом окне выдаст нам результаты вида
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
А также график:

В моем случае с нелинейностью проблем особых нет, но есть проблемы с точкой начала графика. В случае использования 775 мотора в качестве шпинделя график будет выглядеть куда интереснее:

7. Правим прошивку. В файле «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
8. Прошиваем. Через монитор порта задаем новые значения
$30=12554.5
$31=372.1
в EEPROM (они не перезаписываются автоматически из настроек прошивки, если не использована команда «$RST=$»). Меняем настройки Candle (минимальную и максимальную скорость шпинделя на наши, необязательно задавать именно полученные, но минимальное лучше задать немного больше (500), так как не все шпиндели стабильно стартуют на низком RPM, а задавать максимальные больше полученных тоже нет смысла, просто часть ползунка окажется бесполезной, я установил 12500).
Проверяем, задавая разную скорость вращения шпинделя через Candle и проверяя соответствие реальной скорости. В моем случае расхождение составило не более 100 RPM (для середины диапазона в 12000 это меньше 2%).
Приветствуются вопросы и пожелания, я прекрасно понимаю что не все здесь прозрачно, поэтому эту "мини-инструкцию" буду дополнять.