LinuxCNC Documentation

Dieses Kapitel enthält Details zu den Kernfunktionen von LinuxCNC, die ein genaues Timing für

  • die Erzeugung von Signalen, die von der Hardware (z. B. Motoren) interpretiert werden, oder

  • für die Interpretation der von der Hardware gesendeten Signale (z. B. Encoder).

1. StepGen

This component provides software based generation of step pulses in response to position or velocity commands. In position mode, it has a built in pre-tuned position loop, so PID tuning is not required. In velocity mode, it drives a motor at the commanded speed, while obeying velocity and acceleration limits. It is a realtime component only, and depending on CPU speed, etc., is capable of maximum step rates of 10 kHz to perhaps 50 kHz. The step pulse generator block diagram shows three block diagrams, each is a single step pulse generator. The first diagram is for step type 0, (step and direction). The second is for step type 1 (up/down, or pseudo-PWM), and the third is for step types 2 through 14 (various stepping patterns). The first two diagrams show position mode control, and the third one shows velocity mode. Control mode and step type are set independently, and any combination can be selected.

stepgen block diag
Figure 1. Schrittimpulsgenerator-Blockdiagramm Positionsmodus
Laden der Komponente stepgen
halcmd: loadrt stepgen step_type=<type-array> [ctrl_type=<ctrl_array>]
<type-array>

ist eine Reihe von durch Kommata getrennten Dezimalzahlen. Jede Zahl bewirkt, dass ein Einzelschritt-Impulsgenerator geladen wird; der Wert der Zahl bestimmt die Schrittart.

<ctrl_array>

ist eine durch Komma getrennte Folge von p- oder v-Zeichen, um den Positions- oder Geschwindigkeitsmodus anzugeben.

ctrl_type

ist optional, wenn sie weggelassen wird, werden alle Schrittgeneratoren im Positionsmodus arbeiten.

Zum Beispiel:

halcmd: loadrt stepgen step_type=0,0,2 ctrl_type=p,p,v

Will install three step generators. The first two use step type 0 (step and direction) and run in position mode. The last one uses step type 2 (quadrature) and runs in velocity mode. There is no default value for <config-array>; at least one step type must be given or loading fails. The maximum number of step generators is 16 (as defined by MAX_CHAN in stepgen.c). Each generator is independent, but all are updated by the same function(s) at the same time. In the following descriptions, <chan> is the number of a specific generator. The first generator is number 0.

Komponente "stepgen" entfernen (engl. unload)
halcmd: unloadrt stepgen

1.1. Pins

On the step type and control type selected.

  • (real) stepgen.`__<chan>__.position-cmd` - Desired motor position, in position units (position mode only).

  • (real) stepgen.`__<chan>__.velocity-cmd` - Desired motor velocity, in position units per second (velocity mode only).

  • (sint) stepgen.`__<chan>__.counts` - Feedback position in counts, updated by capture_position().

  • (real) stepgen.`__<chan>__.position-fb` - Feedback position in position units, updated by capture_position().

  • (bool) stepgen.`__<chan>__.enable` - Enables output steps - when false, no steps are generated.

  • (bool) stepgen.`__<chan>__.step` - Step pulse output (step type 0 only).

  • (bool) stepgen.`__<chan>__.dir` - Direction output (step type 0 only).

  • (bool) stepgen.`__<chan>__.up` - UP pseudo-PWM output (step type 1 only).

  • (bool) stepgen.`__<chan>__.down` - DOWN pseudo-PWM output (step type 1 only).

  • (bool) stepgen.`__<chan>__.phase-A` - Phase A output (step types 2-15 only).

  • (bool) stepgen.`__<chan>__.phase-B` - Phase B output (step types 2-15 only).

  • (bool) stepgen.`__<chan>__.phase-C` - Phase C output (step types 3-15 only).

  • (bool) stepgen.`__<chan>__.phase-D` - Phase D output (step types 5-15 only).

  • (bool) stepgen.`__<chan>__.phase-E` - Phase E output (step types 11-15 only).

1.2. Parameter

  • (real) stepgen.`__<chan>__.position-scale` - Steps per position unit. This parameter is used for both output and feedback.

  • (real) stepgen.`__<chan>__.maxvel` - Maximum velocity, in position units per second. If 0.0, has no effect.

  • (real) stepgen.`__<chan>__.maxaccel` - Maximum accel/decel rate, in positions units per second squared. If 0.0, has no effect.

  • (real) stepgen.`__<chan>__.frequency` - The current step rate, in steps per second.

  • (uint) stepgen.`__<chan>__.steplen` - Length of a step pulse (step type 0 and 1) or minimum time in a given state (step types 2-15), in nano-seconds.

  • (uint) stepgen.`__<chan>__.stepspace` - Minimum spacing between two step pulses (step types 0 and 1 only), in nano-seconds. Set to 0 to enable the stepgen doublefreq function. To use doublefreq the parport reset function must be enabled.

  • (uint) stepgen.`__<chan>__.dirsetup` - Minimum time from a direction change to the beginning of the next step pulse (step type 0 only), in nanoseconds.

  • (uint) stepgen.`__<chan>__.dirhold` - Minimum time from the end of a step pulse to a direction change (step type 0 only), in nanoseconds.

  • (uint) stepgen.`__<chan>__.dirdelay` - Minimum time any step to a step in the opposite direction (step types 1-15 only), in nano-seconds.

  • (sint) stepgen.`__<chan>__.rawcounts` - The raw feedback count, updated by make_pulses().

Im Positionsmodus werden die Werte von maxvel und maxaccel von der internen Positionsschleife verwendet, um Schrittimpulsfolgen zu vermeiden, denen der Motor nicht folgen kann. Wenn sie auf Werte eingestellt sind, die für den Motor geeignet sind, führt selbst eine große momentane Änderung der befohlenen Position zu einer sanften trapezförmigen Bewegung zur neuen Position. Der Algorithmus misst sowohl den Positions- als auch den Geschwindigkeitsfehler und berechnet eine Beschleunigung, die versucht, beide gleichzeitig auf Null zu reduzieren. Weitere Einzelheiten, einschließlich des Inhalts des Feldes "Kontrollgleichung" (engl. control equation), finden Sie im Code.

Im Geschwindigkeitsmodus ist maxvel ein einfacher Grenzwert, der auf die befohlene Geschwindigkeit angewendet wird, und maxaccel wird verwendet, um die tatsächliche Frequenz zu rampen, wenn sich die befohlene Geschwindigkeit abrupt ändert. Wie im Positionsmodus sorgen die richtigen Werte für diese Parameter dafür, dass der Motor der erzeugten Impulsfolge folgen kann.

1.3. Schrittypen

Step generator supports 16 different step sequences (types 0 to 15):

Schritttyp 0 (engl. step type 0)

Schritttyp 0 ist der Standard-Schritt- und Richtungstyp. Bei der Konfiguration für den Schritttyp 0 gibt es vier zusätzliche Parameter, die das genaue Timing der Schritt- und Richtungssignale bestimmen. In der folgenden Abbildung ist die Bedeutung dieser Parameter dargestellt. Die Parameter sind in Nanosekunden angegeben, werden aber auf ein ganzzahliges Vielfaches der Thread-Periode für den Thread aufgerundet, der make_pulses() aufruft. Wenn zum Beispiel make_pulses() alle 16 µs aufgerufen wird und steplen 20000 ist, dann sind die Schrittimpulse 2 x 16 = 32 µs lang. Der Standardwert für alle vier Parameter ist 1 ns, aber die automatische Rundung tritt in Kraft, wenn der Code zum ersten Mal ausgeführt wird. Da ein Schritt steplen ns hoch und stepspace ns niedrig benötigt, ist die maximale Frequenz 1.000.000.000 geteilt durch (steplen + stepspace)'. Wenn maxfreq höher als dieser Grenzwert eingestellt ist, wird er automatisch gesenkt. Ist maxfreq gleich Null, bleibt er Null, aber die Ausgangsfrequenz wird trotzdem begrenzt.

Bei Verwendung des Parallelport-Treibers kann die Schrittfrequenz mit der Funktion parport reset in Verbindung mit der Einstellung doublefreq von StepGen verdoppelt werden.

stepgen type0
Figure 2. Schritt- und Richtungs-Timing (engl. step and direction timing)
Schritt Typ 1 (step type 1)

Der Schritttyp 1 hat zwei Ausgänge, aufwärts und abwärts. Die Impulse erscheinen je nach Fahrtrichtung an dem einen oder dem anderen. Jeder Impuls ist steplen ns lang, und die Impulse sind durch mindestens stepspace ns voneinander getrennt. Die maximale Frequenz ist dieselbe wie bei Schritttyp 0. Wenn maxfreq höher als der Grenzwert eingestellt ist, wird dieser gesenkt. Ist maxfreq gleich Null, bleibt er Null, aber die Ausgangsfrequenz wird trotzdem begrenzt.

Warning
Do not use the parport reset function with step types 2 - 15. Unexpected results can happen.
Step Type 2 - 15

Step types 2 through 15 are state based, and have from two to five outputs. On each step, a state counter is incremented or decremented. The Two-and-Three-Phase, Four-Phase, and Five-Phase show the output patterns as a function of the state counter. Step type 15 has no built-in pattern; its sequence is defined with the user_step_type module parameter (up to 18 state values, one per phase state). The maximum frequency is 1,000,000,000 divided by steplen, and as in the other modes, maxfreq will be lowered if it is above the limit.

Schritttypen: Zwei-und-Drei-Phase
Figure 3. Zwei- und dreiphasige Schritttypen

Schritttypen: Vierphasig
Figure 4. Vierphasige Schritttypen

Schritttypen: Fünfphasig
Figure 5. Fünf-Phasen-Schritttypen

1.4. Funktionen

The component exports three functions. Each function acts on all of the step pulse generators - running different generators in different threads is not supported.

  • (funct) stepgen.make-pulses - High speed function to generate and count pulses.

  • (funct) stepgen.update-freq - Die Funktion für niedrige Geschwindigkeiten wandelt Position in Geschwindigkeit um, skaliert und begrenzt.

  • (funct) stepgen.capture-position - Funktion mit niedriger Geschwindigkeit für die Rückmeldung, aktualisiert die Zwischenspeicher und skaliert die Position.

Die Hochgeschwindigkeitsfunktion stepgen.make-pulses sollte in einem sehr schnellen Thread ausgeführt werden, je nach den Fähigkeiten des Computers zwischen 10 und 50 µs. Die Periode dieses Threads bestimmt die maximale Schrittfrequenz, da steplen, stepspace, dirsetup, dirhold und dirdelay alle auf ein ganzzahliges Vielfaches der Thread-Periode in Nanosekunden aufgerundet werden. Die beiden anderen Funktionen können mit einer viel geringeren Rate aufgerufen werden.

2. PWMgen

This component provides software based generation of PWM (Pulse Width Modulation) and PDM (Pulse Density Modulation) waveforms. It is a realtime component only, and depending on CPU speed, etc., is capable of PWM frequencies from a few hundred Hertz at pretty good resolution, to perhaps 10 kHz with limited resolution.

Laden von PWMgen
loadrt pwmgen output_type=<config-array>

Das <config-array> ist eine Reihe von durch Komma getrennten Dezimalzahlen. Jede Zahl bewirkt, dass ein einzelner PWM-Generator geladen wird; der Wert der Zahl bestimmt den Ausgangstyp. Im folgenden Beispiel werden drei PWM-Generatoren installiert. Es gibt keinen Standardwert, wenn <config-array> nicht angegeben wird, werden keine PWM-Generatoren installiert. Die maximale Anzahl von Frequenzgeneratoren ist 8 (wie durch MAX_CHAN in pwmgen.c definiert). Jeder Generator ist unabhängig, aber alle werden durch dieselbe(n) Funktion(en) zur gleichen Zeit aktualisiert. In den folgenden Beschreibungen steht <chan> für die Nummer eines bestimmten Generators. Der erste Generator hat die Nummer 0.

Beispiel für das Laden von PWMgen
loadrt pwmgen output_type=0,1,2

Es werden drei PWM-Generatoren installiert. Der erste wird einen Ausgang des Typs 0 (nur PWM) verwenden, der nächste einen Ausgang des Typs 1 (PWM und Richtung) und der dritte einen Ausgang des Typs 2 (AUF und AB). Es gibt keinen Standardwert, wenn <config-array> nicht angegeben wird, wird kein PWM-Generator installiert. Die maximale Anzahl von Frequenzgeneratoren ist 8 (wie durch MAX_CHAN in pwmgen.c definiert). Jeder Generator ist unabhängig, aber alle werden durch dieselbe(n) Funktion(en) zur gleichen Zeit aktualisiert. In den folgenden Beschreibungen steht <chan> für die Anzahl der einzelnen Generatoren. Die Nummerierung der PWM-Generatoren beginnt bei 0.

Entfernen (engl. hier unloading) von PWMgen
unloadrt pwmgen

2.1. Ausgangstypen (engl. output types)

Der PWM-Generator unterstützt drei verschiedene "Ausgangstypen".

  • Ausgangstyp 0 - Nur PWM-Ausgangspin. Nur positive Befehle werden akzeptiert, negative Werte werden als Null behandelt (und werden durch den Parameter min-dc beeinflusst, wenn er ungleich Null ist).

  • Ausgangstyp 1 - PWM/PDM und Richtungspins. Positive und negative Eingänge werden als positive und negative PWM ausgegeben. Der Richtungspin ist 0 für positive Befehle und 1 für negative Befehle. Wenn Ihre Steuerung positive PWM sowohl im Uhrzeigersinn als auch gegen den Uhrzeigersinn benötigt, verwenden Sie link:.. /man/man9/abs.9.html[abs]-Komponente, um Ihr PWM-Signal in einen positiven Wert umzuwandeln, wenn ein negativer Eingang eingegeben wird.

  • Ausgabetyp 2 - UP- und DOWN-Pins. Bei positiven Befehlen wird das PWM-Signal am Up-Ausgang angezeigt, und der Down-Ausgang bleibt false. Bei negativen Befehlen wird das PWM-Signal am Down-Ausgang angezeigt, und der Up-Ausgang bleibt false. Der Ausgangstyp 2 eignet sich für den Antrieb der meisten H-Brücken.

2.2. Pins

Jeder PWM-Generator hat die folgenden Pins:

  • (real) pwmgen.`__<chan>__.value` - Command value, in arbitrary units. Will be scaled by the scale parameter (see below).

  • (bool) pwmgen.`__<chan>__.enable` - Enables or disables the PWM generator outputs.

Jeder PWM-Generator verfügt über einige dieser Pins, je nach gewähltem Ausgangstyp:

  • (bool) pwmgen.`__<chan>__.pwm` - PWM (or PDM) output, (output types 0 and 1 only).

  • (bool) pwmgen.`__<chan>__.dir` - Direction output (output type 1 only).

  • (bool) pwmgen.`__<chan>__.up` - PWM/PDM output for positive input value (output type 2 only).

  • (bool) pwmgen.`__<chan>__.down` - PWM/PDM output for negative input value (output type 2 only).

Each PWM generator also has these pins:

  • (real io) pwmgen.`__<chan>__.scale` - Scaling factor to convert value from arbitrary units to duty cycle. For example if scale is set to 4000 and the input value passed to the pwmgen.`__<chan>__.value` is 4000 then it will be 100% duty-cycle (always on). If the value is 2000 then it will be a 50% 25 Hz square wave.

  • (real io) pwmgen.`__<chan>__.offset` - DC offset added to value before scaling.

  • (real io) pwmgen.`__<chan>__.pwm-freq` - Desired PWM frequency, in Hz. If 0.0, generates PDM instead of PWM. If set higher than internal limits, next call of pwmgen.update will set it to the internal limit. If non-zero, and dither is false, next call of pwmgen.update will set it to the nearest integer multiple of the make_pulses() function period.

  • (bool io) pwmgen.`__<chan>__.dither-pwm` - If true, enables dithering to achieve average PWM frequencies or duty cycles that are unobtainable with pure PWM. If false, both the PWM frequency and the duty cycle will be rounded to values that can be achieved exactly.

  • (real io) pwmgen.`__<chan>__.min-dc` - Minimum duty cycle, between 0.0 and 1.0 (duty cycle will go to zero when disabled, regardless of this setting).

  • (real io) pwmgen.`__<chan>__.max-dc` - Maximum duty cycle, between 0.0 and 1.0.

  • (real out) pwmgen.`__<chan>__.curr-dc` - Current duty cycle - after all limiting and rounding (read only).

2.3. Parameter

Keinen.

2.4. Funktionen

Die Komponente exportiert zwei Funktionen. Jede Funktion wirkt auf alle PWM-Generatoren - die Ausführung verschiedener Generatoren in verschiedenen Threads wird nicht unterstützt.

  • (funct) pwmgen.make-pulses - High speed function to generate PWM waveforms. The high speed function pwmgen.make-pulses should be run in the base (fastest) thread, from 10 to 50 µs depending on the capabilities of the computer. That thread’s period determines the maximum PWM carrier frequency, as well as the resolution of the PWM or PDM signals. If the base thread is 50,000 ns then every 50 µs the module decides if it is time to change the state of the output. At 50% duty cycle and 25 Hz PWM frequency this means that the output changes state every (1/25) s / 50 µs * 50% = 400 iterations. This also means that you have a 800 possible duty cycle values (without dithering).

  • (funct) pwmgen.update - Funktion mit geringer Geschwindigkeit zur Skalierung und Begrenzung des Werts und zur Handhabung anderer Parameter. Dies ist die Funktion des Moduls, welche die komplizierteren mathematischen Berechnungen implementiert, um herauszufinden, für wie viele Basisperioden der Ausgang hoch und für wie viele er niedrig sein sollte.

3. Encoder

This component provides software based counting of signals from quadrature (or single-pulse) encoders. It is a realtime component only, and depending on CPU speed, latency, etc., is capable of maximum count rates of 10 kHz to perhaps up to 50 kHz.

Das Basisgewinde sollte 1/2 Zählgeschwindigkeit betragen, um Geräusche und Zeitschwankungen zu berücksichtigen. Wenn Sie z. B. einen Drehgeber mit 100 Impulsen pro Umdrehung an der Spindel haben und Ihre maximale Drehzahl 3000 beträgt, sollte das maximale Basisgewinde 25 µs betragen. Ein Drehgeber mit 100 Impulsen pro Umdrehung hat 400 Zählungen. Die Spindeldrehzahl von 3000 U/min (engl. RPM) = 50 U/s (engl. RPS, Umdrehungen pro Sekunde). 400 * 50 = 20.000 Zählungen pro Sekunde oder 50 µs zwischen den Zählungen.

Das Blockdiagramm des Encoderzählers ist ein Blockdiagramm eines Kanals eines Encoderzählers.

encoder block diag
Figure 6. Blockdiagramm,Encoder Counter
Laden des Encoders
halcmd: loadrt encoder [num_chan=<counters>]

<counters> ist die Anzahl der Encoderzähler, die Sie installieren möchten. Wenn num_chan nicht angegeben ist, werden drei Zähler installiert. Die maximale Anzahl von Leistungsindikatoren beträgt 8 (wie durch MAX_CHAN in encoder.c definiert). Jeder Leistungsindikator ist unabhängig, aber alle werden gleichzeitig von den gleichen Funktionen aktualisiert. In den folgenden Beschreibungen ist <chan> die Nummer eines bestimmten Zählers. Der erste Zähler ist die Nummer 0.

Encoder entfernen (engl. unload)
halcmd: unloadrt encoder

3.1. Pins

  • encoder._<chan>_.counter-mode (bool, i/o) (default: FALSE) - Enables counter mode. When true, the counter counts each rising edge of the phase-A input, ignoring the value on phase-B. This is useful for counting the output of a single channel (non-quadrature) sensor. When false, it counts in quadrature mode.

  • encoder._<chan>_.missing-teeth (sint, in) (default: 0) - Enables the use of missing-tooth index. This allows a single IO pin to provide both position and index information. If the encoder wheel has 58 teeth with two missing, spaced as if there were 60(common for automotive crank sensors) then the position-scale should be set to 60 and missing-teeth to 2. To use this mode counter-mode should be set true. This mode will work for lathe threading but not for rigid tapping.

  • encoder._<chan>_.counts (sint, out) - Position in encoder counts.

  • encoder._<chan>_.counts-latched (sint, out) - Not used at this time.

  • encoder._<chan>_.index-enable (bool, i/o) - When True, counts and position are reset to zero on next rising edge of Phase Z.
    At the same time, index-enable is reset to zero to indicate that the rising edge has occurred. The index-enable pin is bi-directional. If index-enable is False, the Phase Z channel of the encoder will be ignored, and the counter will count normally. The encoder driver will never set index-enable True. However, some other component may do so.

  • encoder._<chan>_.latch-falling (bool, in) (default: TRUE) - Not used at this time.

  • encoder._<chan>_.latch-input (bool, in) (default: FALSE) - Not used at this time.

  • encoder._<chan>_.latch-rising (bool, in) (default: TRUE) - Not used at this time.

  • encoder._<chan>_.min-speed-estimate (real, in) - Determine the minimum true velocity magnitude, at which velocity will be estimated as nonzero and position-interpolated will be interpolated. The units of min-speed-estimate are the same as the units of velocity. Scale factor, in counts per length unit. Setting this parameter too low will cause it to take a long time for velocity to go to 0 after encoder pulses have stopped arriving.

  • encoder._<chan>_.phase-A (bool, in) - Phase A of the quadrature encoder signal.

  • encoder._<chan>_.phase-B (bool, in) - Phase B of the quadrature encoder signal.

  • encoder._<chan>_.phase-Z (bool, in) - Phase Z (index pulse) of the quadrature encoder signal.

  • encoder._<chan>_.position (real, out) - Position in scaled units (see position-scale).

  • encoder._<chan>_.position-interpolated (real, out) - Position in scaled units, interpolated between encoder counts.
    The position-interpolated attempts to interpolate between encoder counts, based on the most recently measured velocity. Only valid when velocity is approximately constant and above min-speed-estimate. Do not use for position control, since its value is incorrect at low speeds, during direction reversals, and during speed changes.
    However, it allows a low ppr encoder (including a one pulse per revolution encoder) to be used for lathe threading, and may have other uses as well.

  • encoder._<chan>_.position-latched (real, out) - Not used at this time.

  • encoder._<chan>_.position-scale (real, i/o) - Scale factor, in counts per length unit. For example, if position-scale is 500, then 1000 counts of the encoder will be reported as a position of 2.0 units.

  • encoder._<chan>_.rawcounts (sint, out) - The raw count, as determined by update-counters. This value is updated more frequently than counts and position. It is also unaffected by reset or the index pulse.

  • encoder._<chan>_.reset (bool, in) - When True, force counts and position to zero immediately.

  • encoder._<chan>_.velocity (real, out) - Velocity in scaled units per second. encoder uses an algorithm that greatly reduces quantization noise as compared to simply differentiating the position output. When the magnitude of the true velocity is below min-speed-estimate, the velocity output is 0.

  • encoder._<chan>_.velocity-rpm (real, out) - Velocity in scaled units per minute.

  • encoder._<chan>_.x4-mode (bool, i/o) (default: TRUE) - Enables times-4 mode. When true, the counter counts each edge of the quadrature waveform (four counts per full cycle). When false, it only counts once per full cycle. In counter-mode, this parameter is ignored. The 1x mode is useful for some jogwheels.

3.2. Parameter

Keinen.

3.3. Funktionen

Die Komponente exportiert zwei Funktionen. Jede Funktion wirkt auf alle Zähler des Encoders - die Ausführung verschiedener Zähler in verschiedenen Threads wird nicht unterstützt.

  • (funct) encoder.update-counters - High speed function to count pulses.

  • (funct) encoder.capture-position - Funktion mit niedriger Geschwindigkeit zur Aktualisierung von Latches und Skalenposition.

4. PID

This component provides Proportional/Integral/Derivative control loops. It is a realtime component only. For simplicity, this discussion assumes that we are talking about position loops, however this component can be used to implement other feedback loops such as speed, torch height, temperature, etc. The PID Loop Block Diagram is a block diagram of a single PID loop.

pid block diag
Figure 7. PID-Regelkreis-Blockdiagramm
PID laden
halcmd: loadrt pid [num_chan=<loops>] [debug=1]

<Schleifen> ist die Anzahl der PID-Schleifen, die Sie installieren möchten. Wird num_chan nicht angegeben, so wird eine Schleife installiert. Die maximale Anzahl von Schleifen ist 16 (wie durch MAX_CHAN in pid.c definiert). Jede Schleife ist völlig unabhängig. In den folgenden Beschreibungen ist <Schleifennummer> die Schleifennummer einer bestimmten Schleife. Die erste Schleife hat die Nummer 0.

Wenn debug=1 angegeben ist, exportiert die Komponente einige zusätzliche Pins, die bei der Fehlersuche und beim Tuning nützlich sein können. Standardmäßig werden die zusätzlichen Pins nicht exportiert, um gemeinsamen Speicherplatz zu sparen und die Pin-Liste nicht zu überfrachten.

PID entfernen (engl. unload)
halcmd: unloadrt pid

4.1. Pins

Die drei wichtigsten Pins sind

  • (real) pid.`__<loopnum>__.command` - The desired position, as commanded by another system component.

  • (real) pid.`__<loopnum>__.feedback` - The present position, as measured by a feedback device such as an encoder.

  • (real) pid.`__<loopnum>__.output` - A velocity command that attempts to move from the present position to the desired position.

Bei einer Positionsschleife sind .command (engl. für Befehl) und .feedback (engl. für Rückmeldung) in Positionseinheiten angegeben. Bei einer linearen Achse können dies Zoll, mm, Meter oder andere relevante Einheiten sein. Bei einer Winkelachse kann es sich um Grad, Bogenmaß usw. handeln. Die Einheiten des .output Ausgangspins entsprechen der Änderung, die erforderlich ist, damit die Rückmeldung mit dem Befehl übereinstimmt. Bei einer Positionsschleife ist der "Ausgang" eine Geschwindigkeit in Zoll/Sekunde, mm/Sekunde, Grad/Sekunde usw. Zeiteinheiten sind immer Sekunden, und die Geschwindigkeitseinheiten entsprechen den Positionseinheiten. Wenn Befehl und Rückmeldung in Metern angegeben sind, erfolgt die Ausgabe in Metern pro Sekunde.

Jede Schleife hat zwei Pins, die zur Überwachung oder Steuerung des allgemeinen Betriebs der Komponente dienen.

  • (real) pid.<loopnum>.error - Equals .command minus .feedback.

  • (bool) pid.<loopnum>.enable - A bool that enables the loop. If .enable is false, all integrators are reset, and the output is forced to zero. If .enable is true, the loop operates normally.

Pins zur Meldung der Sättigung. Eine Sättigung ist gegeben, wenn der Ausgang des PID-Blocks an seinem maximalen oder minimalen Grenzwert liegt.

  • (bool) pid.<loopnum>.saturated - True when output is saturated.

  • (real) pid.<loopnum>.saturated-s - The time the output has been saturated.

  • (sint) pid.<loopnum>.saturated-count - The time the output has been saturated.

Die PID-Verstärkungen, Grenzwerte und andere "abstimmbare" Merkmale des Regelkreises sind als Pins verfügbar, so dass sie dynamisch für erweiterte Abstimmungsmöglichkeiten angepasst werden können.

  • (real) pid.<loopnum>.Pgain - Proportional gain

  • (real) pid.<loopnum>.Igain - Integral gain

  • (real) pid.<loopnum>.Dgain - Derivative gain

  • (real) pid.<loopnum>.bias - Constant offset on output

  • (real) pid.<loopnum>.FF0 - Zeroth order feedforward - output proportional to command (position).

  • (real) pid.<loopnum>.FF1 - First order feedforward - output proportional to derivative of command (velocity).

  • (real) pid.<loopnum>.FF2 - Second order feedforward - output proportional to 2nd derivative of command (acceleration).

  • (real) pid.<loopnum>.FF3 - Third order feedforward - output proportional to 3rd derivative of command (jerk).

  • (real) pid.<loopnum>.deadband - Amount of error that will be ignored

  • (real) pid.<loopnum>.maxerror - Limit on error

  • (real) pid.<loopnum>.maxerrorI - Limit on error integrator

  • (real) pid.<loopnum>.maxerrorD - Limit on error derivative

  • (real) pid.<loopnum>.maxcmdD - Limit on command derivative

  • (real) pid.<loopnum>.maxcmdDD - Limit on command 2nd derivative

  • (real) pid.<loopnum>.maxcmdDDD - Limit on command 3rd derivative

  • (real) pid.<loopnum>.maxoutput - Limit on output value

Alle max*-Grenzwerte sind so implementiert, dass es keinen Grenzwert gibt, wenn der Wert dieses Parameters Null ist.

Additional input pins:

  • (real) pid.<loopnum>.command-deriv - Command derivative (velocity), used instead of differentiating .command when connected.

  • (real) pid.<loopnum>.feedback-deriv - Feedback derivative (velocity), used instead of differentiating .feedback when connected.

  • (bool) pid.<loopnum>.index-enable - When true, the loop is reset on the next rising edge, like an encoder index.

  • (bool) pid.<loopnum>.error-previous-target - When true (the default), the derivative of error tracks the previous target to avoid derivative kick on command steps.

Auto-tuning pins (used by the at_pid component):

  • (real io) pid.<loopnum>.tune-effort - Effort limit used during tuning cycles.

  • (uint io) pid.<loopnum>.tune-cycles - Number of tuning cycles to run.

  • (uint io) pid.<loopnum>.tune-type - Type of tuning to perform.

  • (bool) pid.<loopnum>.tune-mode - When true, the loop runs in tuning mode.

  • (bool io) pid.<loopnum>.tune-start - Set true to start tuning; reset to false when tuning is done.

If debug=1 was specified when the component was installed, additional pins will be exported:

  • (real) pid.<loopnum>.errorI - Integral of error.

  • (real) pid.<loopnum>.errorD - Derivative of error.

  • (real) pid.<loopnum>.commandD - Derivative of the command.

  • (real) pid.<loopnum>.commandDD - 2nd derivative of the command.

  • (real) pid.<loopnum>.commandDDD - 3rd derivative of the command.

  • (real) pid.<loopnum>.ultimate-gain - Ultimate gain determined by auto-tuning.

  • (real) pid.<loopnum>.ultimate-period - Ultimate period determined by auto-tuning.

4.2. Funktionen

Die Komponente exportiert eine Funktion für jede PID-Schleife. Diese Funktion führt alle für die Schleife erforderlichen Berechnungen durch. Da jede Schleife ihre eigene Funktion hat, können einzelne Schleifen in verschiedene Threads eingebunden werden und mit unterschiedlichen Geschwindigkeiten ausgeführt werden.

  • (funct) pid.<loopnum>.do-pid-calcs - Performs all calculations for a single PID loop.

Wenn Sie den genauen Algorithmus zur Berechnung des Ausgangs der PID-Schleife verstehen möchten, lesen Sie bitte

  • Abbildung PID Loop Block Diagram,

  • die Kommentare am Anfang von emc2/src/hal/components/pid.c, und natürlich auf

  • der G-Code selbst.

Die Schleifenberechnungen erfolgen in der C-Funktion „calc_pid()“.

5. Simulierter Encoder

The simulated encoder is exactly that. It produces quadrature pulses with an index pulse, at a speed controlled by a HAL pin. Mostly useful for testing.

Sim-Encoder laden
halcmd: loadrt sim-encoder num_chan=<number>

<number> ist die Anzahl der Encoder, die Sie simulieren möchten. Wenn nicht angegeben, wird ein Encoder installiert. Die maximale Anzahl ist 8 (wie durch MAX_CHAN in sim_encoder.c definiert).

Abladen des sim-encoder
halcmd: unloadrt sim-encoder

5.1. Pins

  • (real) sim-encoder.`__<chan-num>__.speed` - The speed command for the simulated shaft.

  • (bool) sim-encoder.`__<chan-num>__.phase-A` - Quadrature output.

  • (bool) sim-encoder.`__<chan-num>__.phase-B` - Quadrature output.

  • (bool) sim-encoder.`__<chan-num>__.phase-Z` - Index pulse output.

  • (sint) sim-encoder.`__<chan-num>__.rawcounts` - Position in counts, can be driven to simulate an external encoder position.

  • (uint io) sim-encoder.`__<chan-num>__.ppr` - Pulses Per Revolution.

  • (real io) sim-encoder.`__<chan-num>__.scale` - Scale Factor for .speed. The default is 1.0, which means that .speed is in revolutions per second. Change to 60 for RPM, to 360 for degrees per second, 6.283185 (= 2*π) for radians per second, etc.

Wenn .speed positiv ist, liegt .phase-A vor .phase-B.

5.2. Parameter

Keinen.

Beachten Sie, dass Impulse pro Umdrehung nicht dasselbe sind wie Zählungen pro Umdrehung. Ein Impuls ist ein vollständiger Quadraturzyklus. Die meisten Drehgeberzähler zählen viermal während eines vollständigen Zyklus.

5.3. Funktionen

Die Komponente exportiert zwei Funktionen. Jede Funktion wirkt auf alle simulierten Geber.

  • (funct) sim-encoder.make-pulses - High speed function to generate quadrature pulses.

  • (funct) sim-encoder.update-speed - Funktion für niedrige Geschwindigkeit zum Lesen von .speed, Skalieren und Einrichten von .make-pulses.

6. Debounce

Debounce is a realtime component that can filter the glitches created by mechanical switch contacts. It may also be useful in other applications where short pulses are to be rejected.

Debounce wird geladen
halcmd: loadrt debounce cfg=<config-string>
<Konfigurations-Zeichenfolge>

Ist eine Reihe von durch Komma getrennten Dezimalzahlen. Jede Zahl installiert eine Gruppe identischer Entprellungsfilter, wobei die Zahl angibt, wie viele Filter in der Gruppe enthalten sind.

Beispiel zum Laden von Debounce
halcmd: loadrt debounce cfg=1,4,2

will install three groups of filters. Group 0 contains one filter, group 1 contains four, and group 2 contains two filters. There is no default value for <config-string>; at least one group size must be given or loading fails. The maximum number of groups is 8 (as defined by MAX_GROUP in debounce.c). The maximum number of filters in a group is 50 (as defined by MAX_GROUP_SIZE in debounce.c). Each group is completely independent. All filters in a single group are identical, and they are all updated by the same function at the same time. In the following descriptions, <G> is the group number and <F> is the filter number within the group. The first filter is group 0, filter 0.

Entladen der Entprellung
halcmd: unloadrt debounce

6.1. Pins

Jeder einzelne Filter hat zwei Pins.

  • (bool) debounce.`__<G>__.__<F>__.in` - Input of filter <F> in group <G>.

  • (bool) debounce.`__<G>__.__<F>__.out` - Output of filter <F> in group <G>.

6.2. Parameter

Jede Gruppe von Filtern hat einen ParameterFußnote:[Jeder einzelne Filter hat auch eine interne Statusvariable. Es gibt einen Kompilierzeitschalter, der diese Variable als Parameter exportieren kann. Dies ist für Tests gedacht und verschwendet unter normalen Umständen nur gemeinsamen Speicher.].

  • (sint) debounce.`__<G>__.delay` - Filter delay for all filters in group <G>.

Die Filter-Verzögerung (engl. delay) wird in Einheiten von Thread-Perioden angegeben. Die minimale Verzögerung ist Null. Der Ausgang eines Filters mit einer Verzögerung von Null folgt genau seinem Eingang - er filtert nichts. Mit zunehmendem .delay werden immer längere Störimpulse zurückgewiesen. Wenn .delay 4 ist, werden alle Störungen zurückgewiesen, die kleiner oder gleich vier Thread-Perioden sind.

6.3. Funktionen

Jede Gruppe von Filtern hat eine Funktion, die alle Filter in dieser Gruppe "gleichzeitig" aktualisiert. Verschiedene Gruppen von Filtern können von verschiedenen Threads in verschiedenen Zeiträumen aktualisiert werden.

  • (funct) `debounce.`<G> - Aktualisiert alle Filter in der Gruppe <G>.

7. SigGen

SigGen is a realtime component that generates square, triangle, and sine waves. It is primarily used for testing.

Laden von siggen
halcmd: loadrt siggen [num_chan=<chans>]
<chans>

ist die Anzahl der Signalgeber, die Sie installieren möchten. Wenn numchan nicht angegeben wird, dann wird ein Signalgenerator installiert. Die maximale Anzahl von Generatoren ist 16 (wie durch MAX_CHAN in siggen.c definiert). Jeder Generator ist völlig unabhängig. In den folgenden Beschreibungen ist

<chan>

die Nummer eines bestimmten Signalgebers (die Nummern beginnen bei 0).

Entladen (engl. unload) von Siggen
halcmd: unloadrt siggen

7.1. Pins

Jeder Generator hat fünf Ausgangspins.

  • (real) siggen.`__<chan>__.sine` - Sine wave output.

  • (real) siggen.`__<chan>__.cosine` - Cosine output.

  • (real) siggen.`__<chan>__.sawtooth` - Sawtooth output.

  • (real) siggen.`__<chan>__.triangle` - Triangle wave output.

  • (real) siggen.`__<chan>__.square` - Square wave output.

  • (bool) siggen.`__<chan>__.clock` - Clock output, toggles once per cycle.

Alle fünf Ausgänge haben die gleiche Frequenz, Amplitude und Offset.

Zusätzlich zu den Ausgangspins gibt es drei Steuerpins:

  • (real) siggen.`__<chan>__.frequency` - Sets the frequency in Hertz, default value is 1 Hz.

  • (real) siggen.`__<chan>__.amplitude` - Sets the peak amplitude of the output waveforms, default is 1.

  • (real) siggen.`__<chan>__.offset` - Sets DC offset of the output waveforms, default is 0.

  • (bool) siggen.`__<chan>__.reset` - When true, the internal phase accumulator is held at zero.

Wenn zum Beispiel siggen.0.amplitude 1,0 und siggen.0.offset 0,0 ist, schwanken die Ausgänge von -1,0 bis +1,0. Wenn siggen.0.amplitude 2,5 und siggen.0.offset 10,0 ist, schwanken die Ausgänge zwischen 7,5 und 12,5.

7.2. Parameter

Keine. [1]

7.3. Funktionen

  • (funct) siggen.`__<chan>__.update` - Berechnet neue Werte für alle fünf Ausgaben.

8. lut5

The lut5 component is a 5 input logic component based on a look up table.

  • lut5 does not use floating point math.

Laden von lut5
loadrt lut5 [count=N|names=name1[,name2...]]
addf lut5.N servo-thread | base-thread
setp lut5.N.function 0xN
lut5-Rechenfunktion

Um die hexadezimale Zahl für die Funktion zu berechnen, fangen Sie oben an und schreiben Sie eine 1 oder 0, um anzugeben, ob diese Zeile wahr oder falsch ist. Als Nächstes notieren Sie jede Zahl in der Ausgabespalte, beginnend von oben und von rechts nach links. Dies wird die Binärzahl sein. Mit einem Taschenrechner mit einer Programmansicht wie der in Ubuntu geben Sie die Binärzahl ein und konvertieren sie dann in Hexadezimal und das ist dann der Wert für die Funktion.

Table 1. lut5 Look Up Table
Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Ausgabe

0

0

0

0

0

0

0

0

0

1

0

0

0

1

0

0

0

0

1

1

0

0

1

0

0

0

0

1

0

1

0

0

1

1

0

0

0

1

1

1

0

1

0

0

0

0

1

0

0

1

0

1

0

1

0

0

1

0

1

1

0

1

1

0

0

0

1

1

0

1

0

1

1

1

0

0

1

1

1

1

1

0

0

0

0

1

0

0

0

1

1

0

0

1

0

1

0

0

1

1

1

0

1

0

0

1

0

1

0

1

1

0

1

1

0

1

0

1

1

1

1

1

0

0

0

1

1

0

0

1

1

1

0

1

0

1

1

0

1

1

1

1

1

0

0

1

1

1

0

1

1

1

1

1

0

1

1

1

1

1

lut5 Zwei Eingänge Beispiel

In der folgenden Tabelle haben wir für jede Zeile den Ausgangszustand ausgewählt, den wir für wahr halten wollen.

Table 2. lut5 Zwei Eingänge Beispiel Look Up Table
Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Ausgabe

0

0

0

0

0

0

0

0

0

0

1

1

0

0

0

1

0

0

0

0

0

1

1

1

In der Ausgangsspalte unseres Beispiels soll der Ausgang eingeschaltet sein, wenn Bit 0 oder Bit 0 und Bit1 eingeschaltet sind und sonst nichts. Die binäre Zahl ist b1010 (drehen Sie den Ausgang um 90 Grad nach rechts). Geben Sie diese Zahl in den Taschenrechner ein und stellen Sie die Anzeige auf hexadezimal um. Das hexadezimale Präfix ist 0x.


1. Vor Version 2.1 waren Frequenz, Amplitude und Offset Parameter. Sie wurden in Pins geändert, um die Steuerung durch andere Komponenten zu ermöglichen.