LinuxCNC Documentation
This page is 97% translated. Untranslated text is shown in English.

В этой главе представлена подробная информация об основных функциях LinuxCNC, которые требуют точного времени для

  • генерации сигналов, которые интерпретируются оборудованием (например, двигателями) или

  • для интерпретации сигналов, отправляемых оборудованием (например, энкодерами).

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. Структурная схема генератора шаговых импульсов в режиме положения
Загрузка компонента stepgen
halcmd: loadrt stepgen step_type=<type-array> [ctrl_type=<ctrl_array>]
<type-array>

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

<ctrl_array>

представляет собой серию символов p или v, разделенных запятыми, для указания режима положения или скорости.

<ctrl_type>

является необязательным, если его опустить, все генераторы шагов будут работать в режиме положения.

Например:

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

Установит три генератора шаговых импульсов. Первые два используют тип шага 0 (step и direction) и выполняются в режиме позиционирования. Последний использует тип шага 2 (квадратура) и работает в режиме скорости. Значением по умолчанию для <config-array> является 0,0,0, при котором будут установлены три генератора типа 0 (step/dir). Максимальное количество генераторов шаговых импульсов — 8 (как определено в MAX_CHAN в файле Stepgen.c). Каждый генератор независим, но все они обновляются с помощью одной и той же функции одновременно. В следующих описаниях <chan> — это номер конкретного генератора. Первый генератор имеет номер 0.

Выгрузка компонента stepgen
halcmd: unloadrt stepgen

1.1. Контакты

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-14 only).

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

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

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

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

1.2. Параметры

  • (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-14), 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-14 only), in nano-seconds.

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

В режиме позиционирования значения maxvel и maxaccel используются внутренним контуром положения, чтобы избежать генерации последовательностей шаговых импульсов, которым двигатель не может следовать. При установке значений, соответствующих двигателю, даже большое мгновенное изменение заданного положения приведет к плавному трапецеидальному перемещению в новое положение. Алгоритм работает путем измерения как ошибки положения, так и ошибки скорости, а также расчета ускорения, которое пытается одновременно свести их к нулю. Для получения более подробной информации, включая содержимое поля уравнение управления, обратитесь к коду.

В режиме скорости, maxvel — это простой предел, который применяется к заданной скорости, а maxaccel используется для линейного изменения фактической частоты, если заданная скорость резко меняется. Как и в режиме позиционирования, правильные значения этих параметров гарантируют, что двигатель сможет следовать сгенерированной последовательности импульсов.

1.3. Типы шаговых импульсов

Step generator supports 15 different step sequences:

Шаговые импульсы Тип 0

Тип шага 0 — это стандартный тип импульса шага и направления. При настройке для импульса шага типа 0 есть четыре дополнительных параметра, которые определяют точное время импульса шага и сигналов направления. На следующем рисунке показано значение этих параметров. Параметры указаны в наносекундах, но будут округлены до целого числа кратного периоду потока для потока, вызывающего make_pulses(). Например, если make_pulses() вызывается каждые 16 мкс, а значение Steplen равно 20000, то длительность шаговых импульсов будет 2 x 16 = 32 мкс. Значение по умолчанию для всех четырех параметров — 1 нс, но автоматическое округление вступает в силу при первом запуске кода. Поскольку для одного импульса шага требуется высокий уровень steplen ns и низкий уроввень stepspace ns , максимальная частота равна 1,000,000,000, разделенному на (steplen + stepspace)'. Если maxfreq установлено выше этого предела, оно будет понижено автоматически. Если maxfreq равно нулю, оно останется нулевым, но выходная частота по-прежнему будет ограничена.

При использовании драйвера параллельного порта частоту шаговых импульсов можно удвоить с помощью функции parport reset вместе с настройкой doublefreq StepGen.

stepgen type0
Figure 2. Временная диаграмма импульсов шага и направления
Шаговые импульсы Тип 1

Шаговый импульс типа 1 имеет два выхода: вверх и вниз. Импульсы появляются то на одном, то на другом, в зависимости от направления движения. Каждый импульс имеет длину steplen нс, и импульсы разделены по крайней мере stepspace нс. Максимальная частота такая же, как и для шагового импульса типа 0. Если maxfreq установлено выше предельного значения, она будет понижена. Если maxfreq равно нулю, оно останется нулевым, но выходная частота по-прежнему будет ограничена.

Warning
Не используйте функцию parport reset с типами шаговых импульсов 2–14. Могут возникнуть неожиданные результаты.
Шаговые импульсы Тип 2 - 14

Типы шаговых импульсов с 2 по 14 основаны на состоянии и имеют от двух до пяти выходов. На каждом шаге счетчик состояния увеличивается или уменьшается. Двух- и трехфазный, четырехфазный и пятифазный режимы показывают выходные шаблоны в зависимости от счетчика состояний. Максимальная частота равна 1,000,000,000, разделенному на steplen, и, как и в других режимах, maxfreq будет понижена, если она превышает предел.

Типы шаговых импульсов: двух- и трехфазные
Figure 3. Типы двух- и трехфазных шаговых импульсов

Типы шаговых импульсов: Четырехфазные
Figure 4. Типы четырехфазных шаговых импульсов

Типы шаговых импульсов: Пятифазные
Figure 5. Типы пятифазных шаговых импульсов

1.4. Функции

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 - Функция низкой скорости выполняет преобразование положения в скорость, масштабирование и ограничение.

  • (funct) stepgen.capture-position - Функция низкой скорости для обратной связи, обновления защелок и масштабирования положения.

Высокоскоростная функция stepgen.make-pulses должна выполняться в очень быстром потоке, от 10 до 50 мкс в зависимости от возможностей компьютера. Период этого потока определяет максимальную частоту шагов, поскольку steplen, stepspace, dirsetup, dirhold и dirdelay округляются до целого числа, кратного периоду потока в наносекундах. Две другие функции могут вызываться с гораздо меньшей скоростью.

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.

Загрузка PWMgen
loadrt pwmgen output_type=<config-array>

<config-array> представляет собой серию десятичных целых чисел, разделенных запятыми. Каждое число вызывает загрузку одного генератора ШИМ, значение числа определяет тип выхода. В следующем примере будут установлены три генератора ШИМ. Значения по умолчанию нет. Если не указан <config-array>, генераторы ШИМ не будут установлены. Максимальное количество генераторов частоты — 8 (как определено параметром MAX_CHAN в pwmgen.c). Каждый генератор независим, но все они обновляются с помощью одной и той же функции одновременно. В следующих описаниях <chan> — это номер конкретного генератора. Первый генератор имеет номер 0.

Загрузка примера PWMgen
loadrt pwmgen output_type=0,1,2

Установит три ШИМ-генератора. Первый будет использовать выход типа 0 (только PWM ), следующий будет использовать выход типа 1 (PWM и направление), а третий будет использовать выход типа 2 (ВВЕРХ и ВНИЗ). Значения по умолчанию нет, если <config-array> не указан, ШИМ-генератор установлен не будет. Максимальное количество генераторов частоты — 8 (как определено параметром MAX_CHAN в pwmgen.c). Каждый генератор независим, но все они обновляются с помощью одной и той же функции одновременно. В последующих описаниях <chan> — это количество конкретных генераторов. Нумерация ШИМ-генераторов начинается с 0.

Выгрузка PWMgen
unloadrt pwmgen

2.1. Типы выходов

Генератор ШИМ поддерживает три различных output types.

  • Output type 0 - только выходной контакт ШИМ. Принимаются только положительные команды, отрицательные значения рассматриваются как ноль (на них влияет параметр min-dc, если он не равен нулю).

  • Output type 1 - PWM/PDM и контакты направления. Положительные и отрицательные входы будут выводиться как положительные и отрицательные ШИМ. Контакт направления является ложным для положительных команд и истинным для отрицательных команд. Если вашему элементу управления требуется положительный ШИМ как для CW, так и для CCW, используйте компонент abs для преобразования вашего сигнала ШИМ в положительное значение, когда на вход подается отрицательный вход.

  • Output type 2 - контакты UP и DOWN. Для положительных команд сигнал ШИМ появляется на выходе UP, а выход DOWN остается false. Для отрицательных команд сигнал ШИМ появляется на выходе DOWN, а на выход UP остается false. Выход типа 2 подходит для управления большинством H-мостов.

2.2. Контакты

Каждый генератор ШИМ будет иметь следующие контакты:

  • (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.

Каждый генератор ШИМ также будет иметь некоторые из этих контактов, в зависимости от выбранного типа выхода:

  • (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).

2.3. Параметры

  • (real) 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) 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 update_freq() will set it to the internal limit. If non-zero, and dither is false, next call of update_freq() will set it to the nearest integer multiple of the make_pulses() function period.

  • (bool) 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) 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) pwmgen.`__<chan>__.max-dc` - Maximum duty cycle, between 0.0 and 1.0.

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

2.4. Функции

Компонент экспортирует две функции. Каждая функция действует на все генераторы ШИМ — запуск разных генераторов в разных потоках не поддерживается.

  • (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 - Функция низкой скорости для масштабирования и ограничения значения, а также обработки других параметров. Это функция модуля, который выполняет более сложную математическую работу, чтобы определить, для скольких базисных периодов выходные данные должны быть высокими, а для скольких — низкими.

3. Энкодер

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.

Базовый поток должен быть 1/2 скорости счета , чтобы учитывать шум и изменения времени. Например, если у вас есть энкодер со 100 импульсами на оборот на шпинделе и максимальная частота вращения составляет 3000, максимальный период базового потока должен составлять 25 мкс. Энкодер с 100 импульсами на оборот будет иметь 400 отсчетов. Скорость шпинделя 3000 RPM = 50 RPS (оборотов в секунду). 400 * 50 = 20,000 отсчетов в секунду или 50 мкс между отсчетами.

Блок-схема счетчика энкодера представляет собой блок-схему одного канала счетчика энкодера.

encoder block diag
Figure 6. Блок-схема счетчика энкодера
Загрузка энкодера
halcmd: loadrt encoder [num_chan=<counters>]

<counters> — количество счетчиков энкодера, которое вы хотите установить. Если num_chan не указан, будут установлены три счетчика. Максимальное количество счетчиков — 8 (как определено в MAX_CHAN в encoder.c). Каждый счетчик независим, но все они обновляются одной и той же функцией одновременно. В следующих описаниях <chan> — это номер конкретного счетчика. Первый счетчик имеет номер 0.

Выгрузка энкодера
halcmd: unloadrt encoder

3.1. Контакты

  • 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: TRUE) - Not used at this time.

  • encoder._<chan>_.latch-rising (bool, in) - 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>_.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. Параметры

  • encoder._<chan>_.capture-position.time (sint, ro)

  • encoder._<chan>_.capture-position.tmax (sint, rw)

  • encoder._<chan>_.update-counters.time (sint, ro)

  • encoder._<chan>_.update-counter.tmax (sint, rw)

3.3. Функции

Компонент экспортирует две функции. Каждая функция действует на все счетчики энкодера — запуск разных счетчиков в разных потоках не поддерживается.

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

  • (funct) encoder.capture-position - Функция низкой скорости для обновления защелок и масштабирования позиции.

4. ПИД

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. Блок-схема ПИД-контура
Загрузка ПИД
halcmd: loadrt pid [num_chan=<loops>] [debug=1]

<loops> — количество контуров ПИД, которое вы хотите установить. Если num_chan не указан, будет установлен один контур. Максимальное количество контуров — 16 (согласно значению MAX_CHAN в pid.c). Каждый цикл полностью независим. В следующих описаниях <loopnum> представляет собой номер конкретного цикла. Первый цикл имеет номер 0.

Если debug=1, компонент экспортирует несколько дополнительных контактов, которые могут быть полезны во время отладки и настройки. По умолчанию дополнительные контакты не экспортируются, чтобы сэкономить место в общей памяти и не загромождать список контактов.

Выгрузка ПИД
halcmd: unloadrt pid

4.1. Контакты

Три наиболее важных контакта:

  • (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.

Для контура положения .command и .feedback указаны в единицах измерения положения. Для линейной оси это могут быть дюймы, мм, метры или что-то еще. Аналогично, для угловой оси это могут быть градусы, радианы и т. д. Единицы измерения вывода .output представляют собой изменение, необходимое для того, чтобы обратная связь соответствовала команде. Таким образом, для цикла положения .output — это скорость в дюймах/с, мм/с, градусах/с и т. д. Единицами времени всегда являются секунды, а единицы скорости соответствуют единицам положения. Если команда и обратная связь указаны в метрах, то выходной сигнал измеряется в метрах в секунду.

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

  • (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.

Контакты, используемые для сообщения о насыщении. Насыщение происходит, когда выход блока ПИД достигает максимального или минимального предела.

  • (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.

Коэффициенты усиления, пределы ПИД-регулятора и другие настраиваемые функции контура доступны в виде контактов, поэтому их можно динамически регулировать для более расширенных возможностей настройки.

  • (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>.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>.maxoutput - Limit on output value

Все max* ограничения реализованы таким образом, что если значение этого параметра равно нулю, ограничения нет.

Если при установке компонента было указано debug=1, будут экспортированы четыре дополнительных контакта:

  • (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.

4.2. Функции

Компонент экспортирует одну функцию для каждого контура ПИД. Эта функция выполняет все вычисления, необходимые для контура. Поскольку каждый контур имеет свою собственную функцию, отдельные контуры могут быть включены в разные потоки и выполняться с разной скоростью.

  • (funct) pid.<loopnum>.do_pid_calcs - Выполняет все вычисления для одного контура ПИД.

Если вы хотите понять точный алгоритм, используемый для вычисления выхода контура ПИД-регулятора, см.

  • figure PID Loop Block Diagram,

  • комментарии в начале emc2/src/hal/comComponents/pid.c и, конечно же,

  • сам код.

Вычисления цикла находятся в функции C calc_pid().

5. Имитированный энкодер

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
halcmd: loadrt sim-encoder num_chan=<number>

<number> — количество энкодеров, которые вы хотите имитировать. Если не указано, будет установлен один энкодер. Максимальное число — 8 (как определено MAX_CHAN в sim_encoder.c).

Выгрузка sim-encoder
halcmd: unloadrt sim-encoder

5.1. Контакты

  • (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.

Когда .speed положительна, .phase-A опережает .phase-B.

5.2. Параметры

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

  • (real) 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.

Обратите внимание, что количество импульсов на оборот — это не то же самое, что количество отсчетов на оборот. Импульс представляет собой полный квадратурный цикл. Большинство счетчиков энкодеров считают четыре раза за один полный цикл.

5.3. Функции

Компонент экспортирует две функции. Каждая функция влияет на все моделируемые энкодеры.

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

  • (funct) sim-encoder.update-speed - Функция низкой скорости для чтения .speed, масштабирования и настройки .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
halcmd: loadrt debounce cfg=<config-string>
<config-string>

Представляет собой серию десятичных целых чисел, разделенных запятыми. Каждое число устанавливает группу одинаковых фильтров устранения дребезга, число определяет количество фильтров в группе.

Загрузка примера debounce
halcmd: loadrt debounce cfg=1,4,2

установит три группы фильтров. Группа 0 содержит один фильтр, группа 1 — четыре, а группа 2 — два фильтра. Значение по умолчанию для <config-string> — "1", при этом будет установлена одна группа, содержащая один фильтр. Максимальное количество групп 8 (как определено в MAX_GROUPS в debounce.c). Максимальное количество фильтров в группе ограничено только объемом общей памяти. Каждая группа полностью независима. Все фильтры в одной группе идентичны, и все они обновляются одной и той же функцией одновременно. В следующих описаниях <G> представляет собой номер группы, а <F> представляет собой номер фильтра внутри группы. Первый фильтр — группа 0, фильтр 0.

Выгрузка debounce
halcmd: unloadrt debounce

6.1. Контакты

Каждый отдельный фильтр имеет два контакта.

  • (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. Параметры

Каждая группа фильтров имеет один параметр, footnote: [Каждый отдельный фильтр также имеет внутреннюю переменную состояния. Существует переключатель времени компиляции, который может экспортировать эту переменную в качестве параметра. Это предназначено для тестирования и при обычных обстоятельствах просто бесполезно расходует разделяемую память.].

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

Задержка фильтра выражается в единицах периодов потока. Минимальная задержка равна нулю. Выходной сигнал фильтра с нулевой задержкой точно соответствует его входному сигналу — он ничего не фильтрует. По мере увеличения .delay все более и более длинные сбои отклоняются. Если .delay равен 4, все сбои, меньшие или равные четырем периодам потока, будут отклонены.

6.3. Функции

Каждая группа фильтров имеет одну функцию, которая обновляет все фильтры в этой группе одновременно. Различные группы фильтров могут обновляться из разных потоков в разные периоды времени.

  • (funct) `debounce.`<G> - Обновляет все фильтры в группе <G>.

7. SigGen

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

Загрузка siggen
halcmd: loadrt siggen [num_chan=<chans>]
<chans>

— это количество генераторов сигналов, которые вы хотите установить. Если numchan не указан, будет установлен один генератор сигналов. Максимальное количество генераторов — 16 (как определено в MAX_CHAN в siggen.c). Каждый генератор полностью независим. В следующих описаниях есть

<chan>

номер конкретного генератора сигналов (нумерация начинается с 0).

Выгрузка siggen
halcmd: unloadrt siggen

7.1. Контакты

Каждый генератор имеет пять выходных контактов.

  • (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.

Все пять выходов имеют одинаковую частоту, амплитуду и смещение.

Помимо выходных контактов, имеется три управляющих контакта:

  • (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.

Например, если siggen.0.amplitude равен 1,0, а siggen.0.offset равен 0,0, выходные данные будут колебаться от -1,0 до +1,0. Если siggen.0.amplitude равен 2,5, а siggen.0.offset равен 10,0, то выходные значения будут колебаться от 7,5 до 12,5.

7.2. Параметры

Ничего. footnote: [До версии 2.1 частота, амплитуда и смещение были параметрами. Они были заменены на контакты, чтобы обеспечить возможность управления другими компонентами.]

7.3. Функции

  • (funct) siggen.`__<chan>__.update` - Вычисляет новые значения для всех пяти выходов.

8. lut5

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

  • lut5 does not use floating point math.

Загрузка lut5
loadrt lut5 [count=N|names=name1[,name2...]]
addf lut5.N servo-thread | base-thread
setp lut5.N.function 0xN
lut5 Вычислительная функция

Чтобы вычислить шестнадцатеричное число для функции, начиная сверху, поставьте 1 или 0, чтобы указать, будет ли эта строка true или false. Затем запишите все числа в выходном столбце, начиная сверху и записывая их справа налево. Это будет двоичное число. Используя калькулятор с программным видом как, например, в Ubuntu, введите двоичное число, а затем преобразуйте его в шестнадцатеричное, и это будет значение функции.

Table 1. lut5 Справочная таблица
Бит 4 Бит 3 Бит 2 Бит 1 Бит 0 Выход

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 Пример двух входов

В следующей таблице мы выбрали выходное состояние для каждой строки, которое мы хотим, чтобы было true.

Table 2. lut5 Пример таблицы поиска с двумя входами
Бит 4 Бит 3 Бит 2 Бит 1 Бит 0 Выход

0

0

0

0

0

0

0

0

0

0

1

1

0

0

0

1

0

0

0

0

0

1

1

1

Глядя на выходной столбец нашего примера, мы хотим, чтобы вывод был включен, когда бит 0 или бит 0 и бит 1 включены, и ничего больше. Двоичное число — b1010 (поворот выхода на 90 градусов по часовой стрелке). Введите это число в калькулятор, затем измените отображение на шестнадцатеричное, и число, необходимое для функции, будет 0xa. Шестнадцатеричный префикс — 0x.