Страница 1 из 5

[РЕШЕНО] помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 16:58
Boris
Есть линейки с которых выходят два квадратурных сигнала. С mach 3 через LPT порт работают без проблем. Подскажите как сконфигурировать EMC2, что-бы использовать эти линейки в качестве обратной связи, т.е. что-бы расстояние перемещения считалось по количеству импульсов полученных с линейки, а не по количеству поданных импульсов step на ШД ? Сигналы заведены на 12 и 13 pin LPT порта. Большая просьба, подскажите что нужно сделать, по шагам. А то что-то с HALом, в разделе encoder, я совсем не разобрался.

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 17:28
Nick
Вот тут мы разбирались с настройками серво привода с энкодером и PID контроллером http://cnc-club.ru/forum/viewtopic.php? ... t=60#p3356 .


Вот кусок обработки энкодера:
# описываем энкодер

loadrt encoder num_chan=1
addf encoder.update-counters base-thread
addf encoder.capture-position servo-thread
setp encoder.0.position-scale 20.000000
net Xpos-phase-a encoder.0.phase-A
net Xpos-phase-b encoder.0.phase-B
net Xpos-index encoder.0.phase-Z
net Xpos-phase-a <= parport.0.pin-10-in
net Xpos-index <= parport.0.pin-11-in

В нем теперь будет нужная информация.

Но с управлением несколько хитрее...

По идее, нужно настраивать такой же PID контроллер как на серве...

А какая основная функция линейки - отслеживать положение или просто определять пропуски шагов шагового двигателя?

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 18:29
Boris
А какая основная функция линейки - отслеживать положение или просто определять пропуски шагов шагового двигателя?
Не знаю как это правильно сказать, нужно что-бы EMC давала импульсы step до тех пор пока с линейки не было-бы получено количество импульсов соответствующие заданному в УП расстоянию. Например текущие значение X=0, идёт строка G1 X10, значит нужно передвинуть X на +10мм, при перемещении головки линейки на 10мм она должна выдать 1000 импульсов (1 импульс= 0,01мм), и соответственно пока эти 1000 импульсов с линейки не получены импульсы step должны выдаваться на драйвер ШД. В общем не просто сигнализировать о пропуске шагов но и вводить корректировки.
У меня шаговые двигатели, это что-то меняет в настойках?

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 19:35
ubey_bobra
да, это меняет очень многое.
настроить емс чтобы она просто показывала положение считывая данные с линеек можно, а вот насчет управлять шаговым двигателем... где то натыкался на такое, не помню где.
суть в том что когда управление идет сервой, то в зависимости от положения рабочего органа, блок ПИД выдает свой определенным методом рассчитанный вольтаж на двигатель, где учтены ускорения, дальность и т.д. а вот такого блока для управления шаговика вроде как в емс нету, вариант писать ручками самому. (под блоком подразумевается часть программного кода, либо часть "железа" которая выполняет какие либо записанные в нее функции)

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 20:59
psha
Судя по всему можно. Достаточно использовать stepgen в velocity режиме, а не position.
Кормить ему на вход результат pid. Правда, поскольку это шаговик, работать это будет не идеально

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 21:11
Boris
да, это меняет очень многое.
настроить емс чтобы она просто показывала положение считывая данные с линеек можно, а вот насчет управлять шаговым двигателем... где то натыкался на такое, не помню где.
суть в том что когда управление идет сервой, то в зависимости от положения рабочего органа, блок ПИД выдает свой определенным методом рассчитанный вольтаж на двигатель, где учтены ускорения, дальность и т.д. а вот такого блока для управления шаговика вроде как в емс нету, вариант писать ручками самому. (под блоком подразумевается часть программного кода, либо часть "железа" которая выполняет какие либо записанные в нее функции)

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 21:16
psha
Boris писал(а):блок ПИД выдает свой определенным методом рассчитанный вольтаж на двигатель, где учтены ускорения, дальность и т.д. а вот такого блока для управления шаговика вроде как в емс нету
Блок ПИД выдает абстрактное желаемое значение. Для сервы он потом загоняется в pwm и преобразуется в ШИМ.
Для шаговика надо загнать в stepgen и получить пульсы.

http://psha.org.ru/irc/%23emc/2011-03-02.html#18:02:38

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 21:24
Boris
Я в EMC абсолютный чайник, да и в CNC тоже не шибко разбираюсь, пользовался немного mach. Если не сильно затруднит, подскажите, что и где надо написать (ini, hal ...) что-бы линейки хоть что-то показали в EMC.

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 22:07
psha
Ну я тут ничего не подскажу, проверить негде и сервы не делал. Я только путь в светлое будущее указать могу :)

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 22:14
Nick
Ну чтобы показывали, нужно написать то, что я вверху указал.

Значения параметров на энкодере можно посмотреть в HAL Meter или HAL Show, в зависимости от GUI они находятся в разных разделах верхнего меню.

Psha все правильно написал. Нужно добавить PID, как для сервы но выход его писать не в pwm как для сервы, а в stepgen.

Аналогичная ситуация была при описании внешнего джойстика для управления станком через EMC2.

Скинь свой файл hal попробуем написать.

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 22:58
Boris
# Создан stepconf в Sat Feb 26 01:07:08 2011
# Все изменения в этом файле будут перезаписаны
# при следующем запуске stepconf
loadrt trivkins
loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES
loadrt probe_parport
loadrt hal_parport cfg="0x378 out "
setp parport.0.reset-time 5000
loadrt stepgen step_type=0,0,0
loadrt pwmgen output_type=0

# энкодер

loadrt encoder num_chan=1
addf encoder.update-counters base-thread
addf encoder.capture-position servo-thread
setp encoder.0.position-scale 20.000000
net Xpos-phase-a encoder.0.phase-A
net Xpos-phase-b encoder.0.phase-B
net Xpos-index encoder.0.phase-Z
net Xpos-phase-a <= parport.0.pin-12-in
net Xpos-index <= parport.0.pin-13-in

# энкодер

addf parport.0.read base-thread
addf stepgen.make-pulses base-thread
addf pwmgen.make-pulses base-thread
addf parport.0.write base-thread
addf parport.0.reset base-thread

addf stepgen.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf stepgen.update-freq servo-thread
addf pwmgen.update servo-thread

net spindle-cmd <= motion.spindle-speed-out => pwmgen.0.value
net spindle-enable <= motion.spindle-on => pwmgen.0.enable
net spindle-pwm <= pwmgen.0.pwm
setp pwmgen.0.pwm-freq 100.0
setp pwmgen.0.scale 1166.66666667
setp pwmgen.0.offset 0.114285714286
setp pwmgen.0.dither-pwm true
net spindle-cw <= motion.spindle-forward

net estop-out => parport.0.pin-01-out
net xstep => parport.0.pin-02-out
setp parport.0.pin-02-out-reset 1
net xdir => parport.0.pin-03-out
net ystep => parport.0.pin-04-out
setp parport.0.pin-04-out-reset 1
net ydir => parport.0.pin-05-out
net zstep => parport.0.pin-06-out
setp parport.0.pin-06-out-reset 1
net zdir => parport.0.pin-07-out
net astep => parport.0.pin-08-out
setp parport.0.pin-08-out-reset 1
net adir => parport.0.pin-09-out
net spindle-cw => parport.0.pin-14-out
net spindle-pwm => parport.0.pin-16-out
net xenable => parport.0.pin-17-out




setp stepgen.0.position-scale [AXIS_0]SCALE
setp stepgen.0.steplen 1
setp stepgen.0.stepspace 0
setp stepgen.0.dirhold 70000
setp stepgen.0.dirsetup 70000
setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL
net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd
net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb
net xstep <= stepgen.0.step
net xdir <= stepgen.0.dir
net xenable axis.0.amp-enable-out => stepgen.0.enable

setp stepgen.1.position-scale [AXIS_1]SCALE
setp stepgen.1.steplen 1
setp stepgen.1.stepspace 0
setp stepgen.1.dirhold 70000
setp stepgen.1.dirsetup 70000
setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL
net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd
net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb
net ystep <= stepgen.1.step
net ydir <= stepgen.1.dir
net yenable axis.1.amp-enable-out => stepgen.1.enable

setp stepgen.2.position-scale [AXIS_2]SCALE
setp stepgen.2.steplen 1
setp stepgen.2.stepspace 0
setp stepgen.2.dirhold 70000
setp stepgen.2.dirsetup 70000
setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL
net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd
net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb
net zstep <= stepgen.2.step
net zdir <= stepgen.2.dir
net zenable axis.2.amp-enable-out => stepgen.2.enable

net estop-out <= iocontrol.0.user-enable-out
net estop-out => iocontrol.0.emc-enable-in

loadusr -W hal_manualtoolchange
net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change
net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed
net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number
net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 23:28
Nick
1. нужно поменять тип stepgen для нужной оси:
loadrt stepgen step_type=0,0,0 ctrl_type=p,p,v
На нужную выставляем v = velocity.

2. добавляем PID
loadrt at_pid num_chan=1
addf pid.0.do-pid-calcs servo-thread
net Xpos-fb <= encoder.0.position => pid.0.feedback
net Xpos-cmd <= axis.0.motor-pos-cmd => pid.0.command
net Xpos-fb axis.0.motor-pos-fb
net xenable axis.0.amp-enable-out => pid.0.enable

# привязываем pid к stepgen
net Xvel-cmd <= pid.0.out => stepgen.0.velocity-cmd



# задаем значения параметров для PID
setp pid.0.Pgain [AXIS_0]P
setp pid.0.Igain [AXIS_0]I
setp pid.0.Dgain [AXIS_0]D
setp pid.0.bias [AXIS_0]BIAS
setp pid.0.FF0 [AXIS_0]FF0
setp pid.0.FF1 [AXIS_0]FF1
setp pid.0.FF2 [AXIS_0]FF2
setp pid.0.deadband [AXIS_0]DEADBAND

--------------

Как-то так. Пишу с нетбука, правильность не гарантирую...

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 23:49
Boris
До того как прочитал Ваше последнее сообщение, сделал следующие изменения:
Убрал строку net Xpos-index encoder.0.phase-Z зерометки у меня с линейки не идёт
поменял net Xpos-index <= parport.0.pin-13-in на net Xpos-phase-B <= parport.0.pin-13-in сделал это интуитивно, методом тыка так сказать, потому что не понимаю значение Xpos-index
всё равно не показывает с линеек ни чего
В меню "Вид" что надо выбрать: показать заданную позицию или показать реальную позицию (выбрал: показать реальную позицию); показать станочную позицию или показать относительную позицию ?
Пины 12 и 13 (parport.0 ) дополнительно нигде не надо инициализировать?

Сейчас верну всё назад и попробую внести изменения указанные Вами в последнем посте.

Re: помогите подключить линейки к EMC2

Добавлено: 02 мар 2011, 23:56
Nick
В меню нужно найти или hal meter или hal watch или hal show и в открывшемся окне найти encoder.0.counts, таким образом можно протестировать, что энкодер действительно заработал.

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 00:16
Boris
После внесения изменений "ЕМС2 завершился с ошибкой".
В место строки loadrt stepgen step_type=0,0,0 нужна строка loadrt stepgen step_type=0,0,0 ctrl_type=v,p,v ? Если ось Х.
Сейчас закоментирую все изменения и запущу hal meter.

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 00:25
Nick
если ось x (ось 0) то v, p, p. Каждая буква - это тип генератора, для одной оси. Оси с номерами задаются в файле ini. Обычно x - 0, y - 1, z - 2.

Когда он завершается с ошибкой обычно выводится сообщение, из которого можно понять в какой строчке конфига какая ошибка.

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 00:38
Boris
Нашёл encoder.0.counts в hal meter. Что это даёт и что с ним делать?

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 01:39
Boris
Вроде что-то появилось. После двойного клика на encoder.0.counts в hal meter, появилось окно с счётчиком, значение которого меняется при передвижении головки линейки.

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 12:19
Nick
Это хорошо! Энкодер работает.

Теперь по-тихоньку его нужно подключить к pid.
Попробуй для начала вот это и посмотри в hal meter что он тоже работает.
loadrt at_pid num_chan=1
addf pid.0.do-pid-calcs servo-thread
net Xpos-fb <= encoder.0.position => pid.0.feedback
net Xpos-cmd <= axis.0.motor-pos-cmd => pid.0.command

Re: помогите подключить линейки к EMC2

Добавлено: 03 мар 2011, 13:49
Boris
Попутно вопрос.
my-mill.hal (Если ваш файл когфигурации называется "my-mill") Этот файл загружается первым и не должен быть изменен, если вы использовали Stepper Config Wizard.
Я вношу изменения именно в этот файл (он у меня называется Мой_станок)
это корректно, или лучше править custom.hal?