etch-servo вытащил из стандартной конфигурации EMC 2.4.6
сайт проекта
http://emergent.unpy.net/projects/01142347802
вот папочка с конфига
Хороший вопрос, наверное в hal, энкодеры обрабатываются компонентом encoder, вроде у него был параметр scale, который будет задавать отношение тиков к перемещению в основных единицах.wowk писал(а):А где прописывается разрешение энкодера в импульсах на оборот, в INI или в HAL?
Если оно работает, то лучше его не трогатьwowk писал(а):На моей машине где стоит ЛПТ я юзаю Ubuntu 8.04. Интересно, надо обновить EMC с 2.3 до 2.4? Или для сервы это не имеет никакого значения ?..
Компонент encoder подгружается к base thread и обрабатывается с частотой base period. Т.е. при среднем latency 15000 получается максимум около 60 000 кГц.wowk писал(а):Не знаю сколько тиков энкодера на оборот максимально может поддержать EMC. Возможно 2500 линий это многовато ..... если EMC не будет справляться на быстрых подачах то наверняка придется добавить к схеме делитель квадратурных импульсов .....
http://www.tamagawa-seiki.co.jp/english/wowk писал(а):нигде не могу найти на них точной документации.
Народ еще вот такую серву собиралvld писал(а):http://www.tamagawa-seiki.co.jp/english/wowk писал(а):нигде не могу найти на них точной документации.
Я свои здесь нашел. Сейчас тоже пытаюсь их заставить крутится и нивкакую.
Не совсем. Нужно все это дело завернуть в PID. Т.е. создать 3 pid контроллера, и на pid.N.command подавать желаемое перемещение, на pid.N.feedback encoder.counts, а с pid.N.output снимать управление на серву, т.е. на pwmgen. Из дома по-подробнее напишу.wowk писал(а):чего-то такого вроде:
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
там тоже нет .... возникает вопрос рабочий ли этот конфиг.
Код: Выделить всё
#*******************
# AXIS X
#*******************
setp pid.x.Pgain [AXIS_0]P
setp pid.x.Igain [AXIS_0]I
setp pid.x.Dgain [AXIS_0]D
setp pid.x.bias [AXIS_0]BIAS
setp pid.x.FF0 [AXIS_0]FF0
setp pid.x.FF1 [AXIS_0]FF1
setp pid.x.FF2 [AXIS_0]FF2
setp pid.x.deadband [AXIS_0]DEADBAND
setp pid.x.maxoutput [AXIS_0]MAX_OUTPUT
net x-index-enable <=> pid.x.index-enable
# ---PWM Generator signals/setup---
setp hm2_5i23.0.pwmgen.10.output-type 1
setp hm2_5i23.0.pwmgen.10.scale [AXIS_0]OUTPUT_SCALE
net xenable => pid.x.enable
net xoutput pid.x.output => hm2_5i23.0.pwmgen.10.value
net xpos-cmd axis.0.motor-pos-cmd => pid.x.command
net xenable axis.0.amp-enable-out => hm2_5i23.0.pwmgen.10.enable
# ---Encoder feedback signals/setup---
setp hm2_5i23.0.encoder.10.counter-mode 0
setp hm2_5i23.0.encoder.10.filter 1
setp hm2_5i23.0.encoder.10.index-invert 0
setp hm2_5i23.0.encoder.10.index-mask 0
setp hm2_5i23.0.encoder.10.index-mask-invert 0
setp hm2_5i23.0.encoder.10.scale [AXIS_0]INPUT_SCALE
net xpos-fb <= hm2_5i23.0.encoder.10.position
net xpos-fb => pid.x.feedback
net xpos-fb => axis.0.motor-pos-fb
net x-index-enable axis.0.index-enable <=> hm2_5i23.0.encoder.10.index-enable
# ---setup home / limit switch signals---
net x-home-sw => axis.0.home-sw-in
net x-neg-limit => axis.0.neg-lim-sw-in
net x-pos-limit => axis.0.pos-lim-sw-inКод: Выделить всё
loadrt pwmgen output_type=2,2,2
loadrt pid num_chan=3
loadrt encoder num_chan=3
addf parport.0.read base-thread
addf encoder.update-counters base-thread
addf pwmgen.make-pulses base-thread
addf parport.0.write base-thread
addf encoder.capture-position servo-thread
addf motion-command-handler servo-thread
addf motion-controller servo-thread
addf pid.0.do-pid-calcs servo-thread
addf pid.1.do-pid-calcs servo-thread
addf pid.2.do-pid-calcs servo-thread
addf pwmgen.update servo-thread
#*******************
# AXIS X
#*******************
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
setp pid.0.maxoutput [AXIS_0]MAX_OUTPUT
net x-index-enable <=> pid.0.index-enable
# ---PWM Generator signals/setup---
setp pwmgen.0.scale [AXIS_0]OUTPUT_SCALE
net xenable => pid.0.enable
net xoutput pid.0.output => pwmgen.0.value
net xpos-cmd axis.0.motor-pos-cmd => pid.0.command
net xenable axis.0.amp-enable-out => pwmgen.0.enable
net pwmgen.0.up => parport.0.pin-01-out
net pwmgen.0.down => parport.0.pin-02-out
# ---Encoder feedback signals/setup---
setp encoder.0.counter-mode 0
setp encoder.0.filter 1
setp encoder.0.index-invert 0
setp encoder.0.index-mask 0
setp encoder.0.index-mask-invert 0
setp encoder.0.scale [AXIS_0]INPUT_SCALE
net xpos-fb <= encoder.0.position
net xpos-fb => pid.0.feedback
net xpos-fb => axis.0.motor-pos-fb
net x-index-enable axis.0.index-enable <=> encoder.0.index-enable
net parport.0.pin-11-in => encoder.0.phase-A
net parport.0.pin-12-in => encoder.0.phase-B
net parport.0.pin-12-in => encoder.0.phase-Z
# ---setup home / limit switch signals---
net x-home-sw => axis.0.home-sw-in
net x-neg-limit => axis.0.neg-lim-sw-in
net x-pos-limit => axis.0.pos-lim-sw-in
Штука давно известная в ЕМС2, но здесь почему-то прошла как новинка.wowk писал(а):так .... интересная страница
http://hackaday.com/category/cnc-hacks/