LinuxCNC Documentation

Pico Systems tiene una familia de placas para controlar motores a pasos y servomotores analógicos y PWM (digitales). La placa se conecta a la PC por un puerto paralelo en modo EPP. Aunque la mayoría de los usuarios conectan una placa al puerto paralelo, en teoría se puede usar cualquier cantidad de placas hasta 8 o 16 en un mismo puerto paralelo. Un controlador sirve a todos los tipos de placas. La mezcla final de E/S depende de la(s) placa(s) conectada(s). El controlador no distingue entre placas, simplemente numera canales de E/S (codificadores, etc) comenzando con 0 en la primera placa. El controlador se llama hal_ppmc.ko. La interfaz servoanalógica también es llamada PPMC por Parallel Port Motion Control. También está el Universal Stepper Controller, abreviado como USC. Y el Universal PWM Controller, o UPC.

Instalación:

loadrt hal_ppmc port_addr=<dirección1>[,<dirección2>[,<dirección3>...]]

El parámetro port_addr le dice al controlador cuál(es) puerto(s) paralelo(s) revisar. Predeterminadamente <dirección1> es 0x0378 y <dirección2> y subsecuentes no se usan. El controlador busca en todo el espacio de direcciones de puerto paralelo mejorado en port_addr, buscando cualquier placa de la familia PPMC. Luego exporta los pines HAL para lo encontrado. Durante la carga (o intento) el controlador imprime algunos útiles mensajes de depuración en la bitácora del kernel, los cuales pueden verse con dmesg.

Se pueden usar hasta 3 buses de puerto paralelo, y cada bus puede tener hasta 8 (o posiblemente 16 PPMC) dispositivos.

1. Opciones de la línea de comandos

Hay varias opciones que pueden especificarse en la línea de comandos de loadrt. Primero, el USC y el UPC pueden agregar un DAC de 8 bits para control de velocidad del husillo y funciones similares. Esto puede especificarse con el parámetro extradac=0xnn[,0xmm]. La parte entre [ ] te permite especificar esta opción en un sistema con más de una placa. El primer dígito hexadecimal indica a cuál bus EPP se refiere, corresponde al orden de las direcciones de puerto en el parámetro port_addr, donde <dirección1> aquí sería cero. Entonces, para el primer bus EPP, la primera placa USC o UPC sería la descrita como 0x00, el segundo USC o UPC en el mismo bus sería 0x02. (Nótese que cada USC o UPC toma hasta dos direcciones, de tal manera que si una esta en 00, la siguiente tendría que ser 02.)

Alternativamente, los 8 pines de salida digital pueden usarse como salidas digitales adicionales, funciona de la misma manera de arriba con la sintaxis : extradout=0xnn. Las opciones extradac y extradout son mutuamente exclusivas en cada placa, solo puedes especificar una.

Las placas codificadoras UPC y PPMC pueden marcar el tiempo de llegada de conteos del codificador para refinar la derivación de velocidad del eje. Esta velocidad derivada puede alimentar el componente hal PID para producir una respuesta de término D más suave. La sintaxis es: timestamp=0xnn[,0xmm], esto funciona igual que arriba para seleccionar cuál placa es configurada. El predeterminado es no activar la opción de marca de tiempo. Si pones esta opción en la línea de comandos se activa la opción. La primera n selecciona el bus EPP, la segunda coincide con la dirección de la placa con la opción activada. El controlador verifica el nivel de revisión de la placa para asegurar que el firmware soporte la característica, y produce un mensaje de error si la placa no la soporta.

La placa codificadora PPMC tiene una opción para seleccionar la frecuencia del filtro digital del codificador. (La UPC tiene la misma capacidad mediante interruptores DIP en la placa). Ya que la placa codificadora PPMC no tiene esos interruptores DIP extras, se necesita seleccionar mediante opción de línea de comandos. Predeterminadamente el filtro corre a 1 MHz, permitiendo a los codificadores ser contados hasta alrededor de 900 kHz (dependiendo del ruido y precisión de cuadratura del codificador.) Las opciones son 1, 2.5, 5 y 10 MHz. Estas son configuradas con un parámetro de 1, 2, 5 y 10 (decimal) el cual se especifica como el dígito hexadecimal "A". Estos se especifican de manera similar a las opciones de arriba, pero con la configuración de frecuencia a la izquierda de los dígitos de bus/dirección. Así que para configurar 5 MHz en la placa codificadora en la dirección 3 en el primer bus EPP escribirías: enc_clock='0x503'.

Se descubrió recientemente que algunos chips de puerto paralelo no funcionarían con el controlador ppmc. Especialmente el chip OXPCIe952 de Oxford en las tarjetas de puerto paralelo PCIe de SIIG. El controlador ppmc en todas las versiones de LinuxCNC comenzando desde la 2.7.8 han sido corregidas predeterminadamente para este problema. Sin embargo, esto podría posiblemente provocar problemas con hardware de puerto paralelo EPP muy viejo, por lo que hay una opción de línea de comandos para regresar el comportamiento anterior. El nuevo comportamiento se configura predeterminadamente, o al agregar el parámetro epp_dir=0 en la línea de comandos. Para obtener el viejo comportamiento agrega epp_dir=1 a la línea de comandos. Todos los puertos paralelos que tengo aquí funcionan con el comportamiento nuevo predeterminado. En cuanto a los otros parámetros, es posible dar una lista, como epp_dir=1,0,1 para establecer diferentes configuraciones para cada uno de los hasta 3 puertos paralelos.

2. Pines

En los siguientes pines, parámetros y funciones <puerto> es el identificador del puerto paralelo. Según las convenciones de nombrado el primer puerto debería tener siempre el identificador cero. Todas las placas tienen un método para configurar la dirección en el bus EPP. USC y UPC tienen provisiones simples para solo dos direcciones, pero cortes de laminillas de puenteado permiten direccionar hasta 4 placas. Las placas PPMC tienen 16 direcciones posibles. En todos los casos el controlador enumera las placas por tipo y exporta los pines HAL apropiados. Por lo tanto los codificadores se enumerarán desde 0 en adelante, en el mismo orden que especifiquen los interruptores de dirección en la placa. Entonces, la primera placa tendrá codificadores 0 — 3, la segunda placa tendrá codificadores 4 — 7. La primer columna después de la viñeta indica cuáles placas tendrán este pin HAL o parámetro asociado. Todas significa que este pin está disponible en los tres tipos de placas. Optional significa que este pin solo será exportado cuando esta opción esta activada por un parámetro adicional en el comando HAL loadrt. Esas opciones requieren que la placa tenga el nivel de revisión suficiente para soportar la característica.

  • (All sint output) ppmc.<port>.encoder.<channel>.count - Encoder position, in counts.

  • (All sint output) ppmc.<port>.encoder.<channel>.delta - Change in counts since last read, in raw encoder count units.

  • (All real output) 'ppmc.<port>.encoder.<channel>.velocity - Velocity scaled in user units per second. On PPMC and USC this is derived from raw encoder counts per servo period, and hence is affected by encoder granularity. On UPC boards with the 8/21/09 and later firmware, velocity estimation by timestamping encoder counts can be used to improve the smoothness of this velocity output. This can be fed to the PID HAL component to produce a more stable servo response. This function has to be enabled in the HAL command line that starts the PPMC driver, with the timestamp=0x00 option.

  • (All real output) ppmc.<port>.encoder.<channel>.position - Encoder position, in user units.

  • (All bool bidir) ppmc.<port>.encoder.<channel>.index-enable - Connect to joint.#.index-enable for home-to-index. This is a bidirectional HAL signal. Setting it to true causes the encoder hardware to reset the count to zero on the next encoder index pulse. The driver will detect this and set the signal back to false.

  • (PPMC real output) ppmc.<port>.DAC.<channel>.value - sends a signed value to the 16-bit Digital to Analog Converter on the PPMC DAC16 board commanding the analog output voltage of that DAC channel.

  • (UPC bool input) ppmc.<port>.pwm.<channel>.enable - Enables a PWM generator.

  • (UPC real input) ppmc.<port>.pwm.<channel>.value - Value which determines the duty cycle of the PWM waveforms. The value is divided by pwm.<channel>.scale, and if the result is 0.6 the duty cycle will be 60%, and so on. Negative values result in the duty cycle being based on the absolute value, and the direction pin is set to indicate negative.

  • (USC bool input) ppmc.<port>.stepgen.<channel>.enable - Enables a step pulse generator.

  • (USC real input) ppmc.<port>.stepgen.<channel>.velocity - Value which determines the step frequency. The value is multiplied by stepgen.<channel>.scale , and the result is the frequency in steps per second. Negative values result in the frequency being based on the absolute value, and the direction pin is set to indicate negative.

  • (All bool output) ppmc.<port>.din.<channel>.in - State of digital input pin, see canonical digital input.

  • (All bool output) ppmc.<port>.din.<channel>.in-not - Inverted state of digital input pin, see canonical digital input.

  • (All bool input) ppmc.<port>.dout.<channel>.out - Value to be written to digital output, see canonical digital output.

  • (Option real input) ppmc.<port>.DAC8-<channel>.value - Value to be written to analog output, range from 0 to 255. This sends 8 output bits to J8, which should have a Spindle DAC board connected to it. 0 corresponds to zero Volts, 255 corresponds to 10 Volts. The polarity of the output can be set for always minus, always plus, or can be controlled by the state of SSR1 (plus when on) and SSR2 (minus when on). You must specify extradac = 0x00 on the HAL command line that loads the PPMC driver to enable this function on the first USC ur UPC board.

  • (Option bool input) ppmc.<port>.dout.<channel>.out - Value to be written to one of the 8 extra digital output pins on J8. You must specify extradout = 0x00 on the HAL command line that loads the ppmc driver to enable this function on the first USC or UPC board. extradac and extradout are mutually exclusive features as they use the same signal lines for different purposes. These output pins will be enumerated after the standard digital outputs of the board.

3. Parámetros

  • (All real) ppmc.<port>.encoder.<channel>.scale - The number of counts / user unit (to convert from counts to units).

  • (UPC real) ppmc.<port>.pwm.<channel-range>.freq - The PWM carrier frequency, in Hz. Applies to a group of four consecutive PWM generators, as indicated by <channel-range>. Minimum is 610 Hz, maximum is 500 kHz.

  • (PPMC real) ppmc.<port>.DAC.<channel>.scale - Sets scale of DAC16 output channel such that an output value equal to the 1/scale value will produce an output of + or - value Volts. So, if the scale parameter is 0.1 and you send a value of 0.5, the output will be 5.0 Volts.

  • (UPC real) ppmc.<port>.pwm.<channel>.scale - Scaling for PWM generator. If scale is X, then the duty cycle will be 100% when the value pin is X (or -X).

  • (UPC real) ppmc.<port>.pwm.<channel>.max-dc - Maximum duty cycle, from 0.0 to 1.0.

  • (UPC real) ppmc.<port>.pwm.<channel>.min-dc - Minimum duty cycle, from 0.0 to 1.0.

  • (UPC real) ppmc.<port>.pwm.<channel>.duty-cycle - Actual duty cycle (used mostly for troubleshooting.)

  • (UPC bool) ppmc.<port>.pwm.<channel>.bootstrap - If true, the PWM generator will generate a short sequence of pulses of both polarities when E-stop goes false, to reset the shutdown latches on some PWM servo drives.

  • (USC uint) ppmc.<port>.stepgen.<channel-range>.setup-time - Sets minimum time between direction change and step pulse, in units of 100 ns. Applies to a group of four consecutive step generators, as indicated by <channel-range>. Values between 200 ns and 25.5 µs can be specified.

  • (USC uint) ppmc.<port>.stepgen.<channel-range>.pulse-width - Sets width of step pulses, in units of 100 ns. Applies to a group of four consecutive step generators, as indicated by <channel-range>. Values between 200 ns and 25.5 µs may be specified.

  • (USC uint) ppmc.<port>.stepgen.<channel-range>.pulse-space-min - Sets minimum time between pulses, in units of 100 ns. Applies to a group of four consecutive step generators, as indicated by <channel-range>. Values between 200 ns and 25.5 µs can be specified. The maximum step rate is: pico ppmc math

  • (USC real) ppmc.<port>.stepgen.<channel>.scale - Scaling for step pulse generator. The step frequency in Hz is the absolute value of velocity * scale.

  • (USC real) ppmc.<port>.stepgen.<channel>.max-vel - The maximum value for velocity. Commands greater than max-vel will be clamped. Also applies to negative values. (The absolute value is clamped.)

  • (USC real) ppmc.<port>.stepgen.<channel>.frequency - Actual step pulse frequency in Hz (used mostly for troubleshooting.)

  • (Option real) ppmc.<port>.DAC8.<channel>.scale - Sets scale of extra DAC output such that an output value equal to scale gives a magnitude of 10.0 V output. (The sign of the output is set by jumpers and/or other digital outputs.)

  • (Option bool) ppmc.<port>.dout.<channel>.invert - Inverts a digital output, see canonical digital output.

  • (Option bool) ppmc.<port>.dout.<channel>.invert - Inverts a digital output pin of J8, see canonical digital output.

4. Funciones

  • (Todas funct) ppmc.<puerto>.read - Lee todas las entradas (digitales y contadores de codificadores) en un puerto. Estas lecturas están organizadas en bloques de registros contiguos a ser leídos en un bloque, para minimizar la sobrecarga de CPU.

  • (Todas funct) ppmc.<puerto>.write - Escribe todas las salidas (digitales, generadores de paso, PWMs) en un puerto. Estas escrituras están organizadas en bloques de registros contiguos a ser escritos en un bloque, para minimizar la sobrecarga de CPU.