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

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

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

1. StepGen

Этот компонент обеспечивает программную генерацию шаговых импульсов в ответ на команды положения или скорости. В режиме позиционирования он имеет встроенный предварительно настроенный контур позиционирования, поэтому настройка ПИД-регулятора не требуется. В режиме скорости он приводит двигатель в движение с заданной скоростью, соблюдая при этом ограничения скорости и ускорения. Это компонент, работающий только в режиме реального времени, и в зависимости от скорости процессора и т. д. он способен работать с максимальной частотой шагов от 10 кГц до, возможно, 50 кГц. Блок-схема генератора шаговых импульсов показывает три блок-схемы, каждая из которых представляет собой один генератор шаговых импульсов. Первая диаграмма предназначена для типа шага 0 (step и direction). Второй предназначен для типа шага 1 (up/down или pseudo-PWM), а третий — для типов шагов со 2 по 14 (различные шаблоны шагов). Первые две диаграммы показывают управление режимом положения, а третья – режим скорости. Режим управления и тип шага задаются независимо, можно выбрать любую комбинацию.

images/stepgen-block-diag.png
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. Контакты

От выбранных типа шаговых импульсов и типа управления.

  • (float) stepgen.`__<chan>__.position-cmd` - Требуемое положение двигателя, в единицах положения (только режим положения).

  • (float) stepgen.`__<chan>__.velocity-cmd` - Требуемая скорость двигателя, в единицах положения в секунду (только режим скорости).

  • (s32) stepgen.`__<chan>__.counts` - Позиция обратной связи в отсчетах, обновленная с помощью capture_position().

  • (float) stepgen.`__<chan>__.position-fb` - Положение обратной связи в единицах положения, обновленное с помощью capture_position().

  • (bit) stepgen.`__<chan>__.enable` - Включает выходные шаговые импульсы — когда false, импульсы не генерируются..

  • (bit) stepgen.`__<chan>__.step` - Шаговый импульсный выход (только импульс типа 0).

  • (bit) stepgen.`__<chan>__.dir` - Выход direction (только тип импульса 0).

  • (bit) stepgen.`__<chan>__.up` - Псевдо-ШИМ-выход UP (только импульс типа 1).

  • (bit) stepgen.`__<chan>__.down` - Выход псевдо-ШИМ DOWN (только импульс типа 1).

  • (bit) stepgen.`__<chan>__.phase-A` - Выход фазы А (только типы импульсов 2–14).

  • (bit) stepgen.`__<chan>__.phase-B` - Выход фазы B (только типы импульсов 2–14).

  • (bit) stepgen.`__<chan>__.phase-C` - Выход фазы C (только типы импульсов 3–14).

  • (bit) stepgen.`__<chan>__.phase-D` - Выход фазы D (только типы импульсов 5–14).

  • (bit) stepgen.`__<chan>__.phase-E` - Выход фазы E (только типы импульсов 11–14).

1.2. Параметры

  • (float) stepgen.`__<chan>__.position-scale` - Шагов на единицу позиции. Этот параметр используется как для выхода, так и для обратной связи.

  • (float) stepgen.`__<chan>__.maxvel` - Максимальная скорость в единицах положения в секунду. Если 0.0, не имеет эффекта.

  • (float) stepgen.`__<chan>__.maxaccel` - Максимальная скорость ускорения/замедления, в единицах позиции в секунду в квадрате. Если 0.0, не имеет эффекта.

  • (float) stepgen.`__<chan>__.frequency` - Текущая частота шагов в шагах в секунду.

  • (float) stepgen.`__<chan>__.steplen` - Длина шагового импульса (типы импульсов 0 и 1) или минимальное время в данном состоянии (типы импульсов 2–14) в наносекундах.

  • (float) stepgen.`__<chan>__.stepspace` - Минимальный интервал между двумя шаговыми импульсами (только типы импульсов 0 и 1), в наносекундах. Установите значение 0, чтобы включить функцию doublefreq генератора шаговых импульсов. Чтобы использовать doublefreq, необходимо включить parport reset function.

  • (float) stepgen.`__<chan>__.dirsetup` - Минимальное время от смены направления до начала следующего импульса шага (только тип импульсов 0), в наносекундах.

  • (float) stepgen.`__<chan>__.dirhold` - Минимальное время от окончания шагового импульса до изменения направления (только тип импульсов 0), в наносекундах.

  • (float) stepgen.`__<chan>__.dirdelay` - Минимальное время от любого импульса до импульса в противоположном направлении (только типы импульсов 1–14), в наносекундах.

  • (s32) stepgen.`__<chan>__.rawcounts` - Необработанные отсчеты обратной связи, обновленные с помощью make_pulses().

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

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

1.3. Step Types

Генератор шаговых импульсов поддерживает 15 различных последовательностей шаговых импульсов:

Шаговые импульсы Тип 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.

images/stepgen-type0.png
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. Функции

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

  • (funct) stepgen.make-pulses - Высокоскоростная функция генерации и подсчета импульсов (без плавающей точки).

  • (funct) stepgen.update-freq - Функция низкой скорости выполняет преобразование положения в скорость, масштабирование и ограничение.

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

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

2. PWMgen

Этот компонент обеспечивает программную генерацию сигналов ШИМ (широтно-импульсной модуляции) и ПИМ (плотно-импульсной модуляции). Это компонент, работающий только в режиме реального времени, и в зависимости от скорости процессора и т. д. он способен работать с частотой ШИМ от нескольких сотен герц при довольно хорошем разрешении до, возможно, 10 кГц при ограниченном разрешении.

Загрузка 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. Контакты

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

  • (float) pwmgen.`__<chan>__.value` - Значение команды в произвольных единицах. Будет масштабироваться параметром scale (см. ниже).

  • (bit) pwmgen.`__<chan>__.enable` - Включает или отключает выходы генератора ШИМ.

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

  • (bit) pwmgen.`__<chan>__.pwm` - Выход ШИМ (или ПИМ) (только типы выходов 0 и 1).

  • (bit) pwmgen.`__<chan>__.dir` - Выход направления (только тип выхода 1).

  • (bit) pwmgen.`__<chan>__.up` - Выход ШИМ/ПИМ для положительного входного значения (только тип выхода 2).

  • (bit) pwmgen.`__<chan>__.down` - Выход ШИМ/ПИМ для отрицательного входного значения (только тип выхода 2).

2.3. Параметры

  • (float) pwmgen.`__<chan>__.scale` - Коэффициент масштабирования для преобразования value из произвольных единиц в рабочий цикл. Например, если масштаб установлен на 4000, а входное значение, переданное в pwmgen.`__<chan>__.value`, равно 4000, то это будет 100% сважность (всегда включен). Если значение равно 2000, то это будет меандр с частотой 50% и частотой 25 Гц.

  • (float) pwmgen.`__<chan>__.pwm-freq` - желаемая частота ШИМ, в Гц. Если 0,0, генерирует PDM вместо PWM. Если установлено значение выше внутреннего предела, следующий вызов update_freq() установит внутренний предел. Если ненулевое значение и значение параметра dither равно false, следующий вызов update_freq() установит его в ближайшее целое число, кратное периоду функции make_pulses().

  • (bit) pwmgen.`__<chan>__.dither-pwm` - Если это правда, включает дизеринг для достижения средних частот ШИМ или скважности, которые невозможно получить с помощью чистого ШИМ. Если значение равно false, и частота ШИМ, и скважность будут округлены до значений, которые могут быть точно достигнуты.

  • (float) pwmgen.`__<chan>__.min-dc` - Минимальная скважность от 0,0 до 1,0 (при отключении скважность будет равна нулю, независимо от этой настройки).

  • (float) pwmgen.`__<chan>__.max-dc` - Максимальная скважность от 0,0 до 1,0.

  • (float) pwmgen.`__<chan>__.curr-dc` - Текущая скважность – после всех ограничений и округлений (только чтение).

2.4. Функции

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

  • (funct) pwmgen.make-pulses - высокоскоростная функция генерации сигналов ШИМ (без плавающей запятой). Высокоскоростная функция pwmgen.make-pulses должна выполняться в базовом (самом быстром) потоке, от 10 до 50 мкс в зависимости от возможностей компьютера. Период этого потока определяет максимальную несущую частоту ШИМ, а также разрешение сигналов ШИМ или ПИМ. Если базовый поток составляет 50 000 мкс, то каждые 50 мкс модуль решает, пора ли изменить состояние выхода. При скважности 50% и частоте ШИМ 25 Гц это означает, что выход меняет состояние каждые (1/25) мкс / 50 мкс * 50% = 400 итераций. Это также означает, что у вас есть 800 возможных значений скважности (без дизеринга).

  • (funct) pwmgen.update - Функция низкой скорости для масштабирования и ограничения значения, а также обработки других параметров. Это функция модуля, который выполняет более сложную математическую работу, чтобы определить, для скольких базисных периодов выходные данные должны быть высокими, а для скольких — низкими.

3. Энкодер

Этот компонент обеспечивает программный подсчет сигналов от квадратурных (или одноимпульсных) энкодеров. Это компонент, работающий только в режиме реального времени, и в зависимости от скорости процессора, задержки и т. д. он способен поддерживать максимальную скорость счета от 10 кГц до, возможно, до 50 кГц.

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

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

images/encoder-block-diag.png
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 (bit, I/O) (по умолчанию: FALSE) — включает режим счетчика. Если значение истинно, счетчик подсчитывает каждый фронт входного сигнала фазы A, игнорируя значение на фазе B. Это полезно для подсчета выходного сигнала одноканального (неквадратурного) датчика. Если значение false, оно считается в квадратурном режиме.

  • encoder._<chan>_.missing-teeth (s32, In) (по умолчанию: 0) — включает использование индекса отсутствующих зубов. Это позволяет одному контакту ввода-вывода предоставлять информацию как о положении, так и об индексе. Если колесо энкодера имеет 58 зубцов, из которых два отсутствуют, и расположены так, как если бы их было 60 (обычно для автомобильных датчиков коленвала), тогда шкала положения должна быть установлена на 60, а отсутствующие зубья - на 2. Для использования этого режима counter-mode должен быть установлен в true. Этот режим будет работать для нарезания резьбы на токарном станке, но не для жесткого нарезания резьбы.

  • encoder._<chan>_.counts (s32, Out) - Позиция в отсчетах энкодера.

  • encoder._<chan>_.counts-latched (s32, Out) - В настоящее время не используется.

  • encoder._<chan>_.index-enable (bit, I/O) - Когда True, counts и position сбрасываются в ноль при следующем фронте фазы Z.
    В то же время index-enable сбрасывается в ноль, указывая на то, что произошел фронт. Вывод index-enable является двунаправленным. Если параметр index-enable- False, канал фазы Z энкодера будет игнорироваться, и счетчик будет считать нормально. Драйвер энкодера никогда не установит параметр index-enable в значение True. Однако это может сделать какой-то другой компонент.

  • encoder._<chan>_.latch-falling (bit, In) (default: TRUE) - В настоящее время не используется.

  • encoder._<chan>_.latch-input (bit, In) (default: TRUE) - В настоящее время не используется.

  • encoder._<chan>_.latch-rising (bit, In) - В настоящее время не используется.

  • encoder._<chan>_.min-speed-estimate (float, in) - Определите минимальную истинную величину скорости, при которой скорость будет оценена как ненулевая, а position-interpolated будет интерполирована. Единицы min-speed-estimate такие же, как и единицы velocity. Масштабный коэффициент, в отсчетах на единицу длины. Установка слишком низкого значения этого параметра приведет к тому, что скорость достигнет 0 после прекращения поступления импульсов энкодера.

  • encoder._<chan>_.phase-A (bit, In) - Фаза A сигнала квадратурного энкодера.

  • encoder._<chan>_.phase-B (bit, In) - Фаза B сигнала квадратурного энкодера.

  • encoder._<chan>_.phase-Z (bit, In) - Фаза Z (индексный импульс) сигнала квадратурного энкодера.

  • encoder._<chan>_.position (float, Out) - Позиция в масштабированных единицах (см. position-scale).

  • encoder._<chan>_.position-interpolated (float, Out) -Позиция в масштабированных единицах, интерполированная между отсчетами энкодера.
    position-interpolated пытается интерполировать между отсчетами энкодера на основе последней измеренной скорости. Действительно только тогда, когда скорость приблизительно постоянна и превышает min-speed-estimate. Не используйте для управления положением, поскольку его значение неверно на низких скоростях, при реверсе направления и при изменении скорости.
    Тем не менее, он позволяет использовать энкодер с низким ppr (включая encoder с одним импульсом на оборот) для нарезания резьбы на токарном станке, а также может иметь и другие применения.

  • encoder._<chan>_.position-latched (float, Out) - В настоящее время не используется.

  • encoder._<chan>_.position-scale (float, I/O) - Масштабный коэффициент, в отсчетах на единицу длины. Например, если масштаб позиции равен 500, то 1000 отсчетов энкодера будут выданы как позиция в 2.0 единицы.

  • encoder._<chan>_.rawcounts (s32, In) - Необработанные отсчеты, определенные update-counters. Это значение обновляется чаще, чем отсчеты и позиция. На него также не влияет сброс или индексный импульс.

  • encoder._<chan>_.reset (bit, In) - Когда True, принудительно немедленно обнуляются counts и 'position.

  • encoder._<chan>_.velocity (float, Out) - Скорость в масштабированных единицах в секунду. encoder использует алгоритм, который значительно снижает шум квантования по сравнению с простым дифференцированием выходного сигнала position. Когда величина истинной скорости ниже min-speed-estimate, выход скорости равен 0.

  • encoder._<chan>_.x4-mode (bit, I/O) (default: TRUE) - Включает режим X4. Когда в true, счетчик считает каждый фронт квадратурного сигнала (четыре отсчета за полный цикл). Если значение false, оно учитывается только один раз за полный цикл. В режиме счетчика этот параметр игнорируется. Режим 1x полезен для некоторых джойстиков.

3.2. Параметры

  • encoder._<chan>_.capture-position.time (s32, RO)

  • encoder._<chan>_.capture-position.tmax (s32, RW)

  • encoder._<chan>_.update-counters.time (s32, RO)

  • encoder._<chan>_.update-counter.tmax (s32, RW)

3.3. Функции

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

  • (funct) encoder.update-counters - Высокоскоростная функция подсчета импульсов (без плавающей точки).

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

4. ПИД

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

images/pid-block-diag.png
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. Контакты

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

  • (float) pid.`__<loopnum>__.command` - Желаемое положение, заданное другим компонентом системы.

  • (float) pid.`__<loopnum>__.feedback` - Текущее положение, измеренное устройством обратной связи, например энкодером.

  • (float) pid.`__<loopnum>__.output` - Команда скорости, которая пытается переместиться из текущего положения в желаемое.

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

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

  • (float) pid.<loopnum>.error - Равно .command минус .feedback.

  • (bit) pid.<loopnum>.enable - Бит, который включает контур. Если .enable - false, все интеграторы сбрасываются, а выходной сигнал обнуляется. Если .enable - true, контур работает нормально.

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

  • (bit) pid.<loopnum>.saturated - True , когда выход насыщен.

  • (float) pid.<loopnum>.saturated_s - Время насыщения выхода.

  • (s32) pid.<loopnum>.saturated_count - Время насыщения выхода.

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

  • (float) pid.<loopnum>.Pgain - Пропорциональное усиление

  • (float) pid.<loopnum>.Igain - Интегральный коэффициент усиления

  • (float) pid.<loopnum>.Dgain - Производное усиление

  • (float) pid.<loopnum>.bias - Постоянное смещение на выходе

  • (float) pid.<loopnum>.FF0 - Упреждение нулевого порядка – выходной сигнал пропорционален команде (положению).

  • (float) pid.<loopnum>.FF1 - Упреждающая связь первого порядка – выходной сигнал пропорционален производной команды (скорости).

  • (float) pid.<loopnum>.FF2 - Прямая связь второго порядка - выходной сигнал пропорционален 2й производной команды (ускорения).

  • (float) pid.<loopnum>.deadband - Количество ошибок, которые будут игнорироваться

  • (float) pid.<loopnum>.maxerror - Ограничение на ошибку

  • (float) pid.<loopnum>.maxerrorI - Ограничение на интегратор ошибок

  • (float) pid.<loopnum>.maxerrorD - Ограничение на производную ошибки

  • (float) pid.<loopnum>.maxcmdD - Ограничение на производную команды

  • (float) pid.<loopnum>.maxcmdDD - Ограничение на 2ю производную команды

  • (float) pid.<loopnum>.maxoutput - Ограничение выходного значения

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

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

  • (float) pid.<loopnum>.errorI - Интеграл ошибки.

  • (float) pid.<loopnum>.errorD - Производная ошибки.

  • (float) pid.<loopnum>.commandD - Производная команды.

  • (float) pid.<loopnum>.commandDD - 2я производная команды.

4.2. Функции

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

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

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

  • figure PID Loop Block Diagram,

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

  • сам код.

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

5. Simulated Encoder

Имитируемый кодер именно такой. Он производит квадратурные импульсы с индексным импульсом со скоростью, контролируемой выводом HAL. В основном полезно для тестирования.

Загрузка sim-encoder
halcmd: loadrt sim-encoder num_chan=<number>

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

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

5.1. Контакты

  • (float) sim-encoder.`__<chan-num>__.speed` - Команда скорости для моделируемого вала.

  • (bit) sim-encoder.`__<chan-num>__.phase-A` - Квадратурный выход.

  • (bit) sim-encoder.`__<chan-num>__.phase-B` - Квадратурный выход.

  • (bit) sim-encoder.`__<chan-num>__.phase-Z` - Выход индексного импульса.

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

5.2. Параметры

  • (u32) sim-encoder.`__<chan-num>__.ppr` - Импульсов на оборот.

  • (float) 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 - Высокоскоростная функция генерации квадратурных импульсов (без плавающей точки).

  • (funct) sim-encoder.update-speed - Функция низкой скорости для чтения .speed, масштабирования и настройки .make-pulses.

6. Debounce

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

Загрузка 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. Контакты

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

  • (bit) debounce.`__<G>__.__<F>__.in` - Ввод фильтра <F> в группе <G>.

  • (bit) debounce.`__<G>__.__<F>__.out` - Вывод фильтра <F> в группе <G>.

6.2. Параметры

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

  • (s32) debounce.`__<G>__.delay` - Задержка фильтра для всех фильтров в группе <G>.

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

6.3. Функции

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

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

7. SigGen

SigGen — это компонент реального времени, который генерирует прямоугольные, треугольные и синусоидальные сигналы. В основном он используется для тестирования.

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

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

<chan>

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

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

7.1. Контакты

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

  • (float) siggen.`__<chan>__.sine` - Выход синусоидального сигнала.

  • (float) siggen.`__<chan>__.cosine` - Выход косинусоидального сигнала.

  • (float) siggen.`__<chan>__.sawtooth` - Выход пилообразного сигнала.

  • (float) siggen.`__<chan>__.triangle` - Выход треугольного сигнала.

  • (float) siggen.`__<chan>__.square` - Выход прямоугольного сигнала.

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

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

  • (float) siggen.`__<chan>__.frequency` - Устанавливает частоту в герцах, значение по умолчанию — 1 Гц.

  • (float) siggen.`__<chan>__.amplitude` - Устанавливает пиковую амплитуду выходных сигналов, по умолчанию — 1.

  • (float) siggen.`__<chan>__.offset` - Устанавливает смещение по постоянному току выходных сигналов, по умолчанию — 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

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

  • lut5 не требует потока с плавающей запятой.

Загрузка 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.