LinuxCNC Documentation

У цьому розділі наведено детальну інформацію про основні функції 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» (крок і напрямок) і працюють у режимі положення. Останній використовує тип кроку «2» (квадратура) і працює у режимі швидкості. Значенням за замовчуванням для «<config-array>» є «0,0,0», що встановить три генератори типу «0» (крок/напрямок). Максимальна кількість генераторів кроків становить 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 нс високого і stepspace нс низького рівня, максимальна частота дорівнює 1000000000, поділеному на (steplen
stepspace). Якщо maxfreq встановлено вище цього обмеження, воно буде автоматично знижено. Якщо maxfreq дорівнює нулю, воно залишиться нульовим, але вихідна частота все одно буде обмежена.

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

stepgen type0
Figure 2. Час кроку та напрямку
Тип кроку 1

Тип кроку 1 має два виходи: вгору і вниз. Імпульси з’являються на одному або іншому, залежно від напрямку руху. Кожен імпульс має тривалість steplen нс, а імпульси розділені між собою щонайменше на stepspace нс. Максимальна частота така сама, як і для типу кроку 0. Якщо maxfreq встановлено вище за обмеження, воно буде знижено. Якщо maxfreq дорівнює нулю, воно залишиться нульовим, але вихідна частота все одно буде обмежена.

Warning
Не використовуйте функцію скидання парпорту з типами кроків 2–14. Це може призвести до неочікуваних результатів.
Тип кроку 2 - 14

Типи кроків від 2 до 14 базуються на стані і мають від двох до п’яти виходів. На кожному кроці лічильник стану збільшується або зменшується. Двофазний, трифазний, чотирифазний і п’ятифазний типи показують вихідні схеми як функцію лічильника стану. Максимальна частота становить 1000000000, поділену на 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>» — це серія десяткових чисел, розділених комами. Кожне число викликає завантаження одного генератора PWM, а значення числа визначає тип виходу. У наведеному нижче прикладі буде встановлено три генератори PWM. Стандартне значення відсутнє, якщо «<config-array>» не вказано, генератори PWM не встановлюватимуться. Максимальна кількість генераторів частоти — 8 (як визначено MAX_CHAN у pwmgen.c). Кожен генератор є незалежним, але всі вони оновлюються одночасно за допомогою однієї і тієї ж функції (функцій). У наведених нижче описах «<chan>» — це номер конкретного генератора. Перший генератор має номер 0.

Приклад завантаження PWMgen
loadrt pwmgen output_type=0,1,2

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

Розвантаження PWMgen
unloadrt pwmgen

2.1. Типи виводу

PWM-генератор підтримує три різні «типи виходу».

  • Output type 0 - Тільки вихідний контакт PWM. Приймаються лише позитивні команди, від’ємні значення вважаються нулем (і на них впливатиме параметр min-dc, якщо він не дорівнює нулю).

  • «Тип виходу 1» — PWM/PDM і виводи напрямку. Позитивні та негативні входи будуть виводитися як позитивні та негативні PWM. Контакт напрямку є хибним для позитивних команд і істинним для негативних команд. Якщо для управління потрібно позитивний PWM як для CW, так і для CCW, використовуйте компонент abs, щоб перетворити сигнал PWM на позитивне значення, коли вводиться негативний вхід.

  • «Тип виходу 2» — виводи UP і DOWN. Для позитивних команд сигнал ШІМ з’являється на виводі up, а вивід down залишається неправдивим. Для негативних команд сигнал PWM з’являється на виводі down, а вивід up залишається неправдивим. Тип виходу 2 підходить для керування більшістю H-мостів.

2.2. Піни

Кожен PWM-генератор матиме такі контакти:

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

Кожен PWM-генератор також матиме деякі з цих контактів, залежно від вибраного типу виходу:

  • (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. Функції

Компонент експортує дві функції. Кожна функція діє на всі генератори PWM — запуск різних генераторів у різних потоках не підтримується.

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

  • (функція) 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 об/хв = 50 об/с (обертів за секунду). 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. 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-регулятора
Завантаження PID
halcmd: loadrt pid [num_chan=<loops>] [debug=1]

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

Якщо вказано debug=1, компонент експортуватиме кілька додаткових контактів, які можуть бути корисними під час налагодження та налаштування. За замовчуванням додаткові контакти не експортуються, щоб заощадити спільний простір пам’яті та уникнути захаращення списку контактів.

Розвантаження PID
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.

Виводи, що використовуються для повідомлення про насичення. Насичення виникає, коли вихідний сигнал блоку PID досягає своєї максимальної або мінімальної межі.

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

All 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. Функції

Компонент експортує одну функцію для кожного циклу PID. Ця функція виконує всі обчислення, необхідні для циклу. Оскільки кожен цикл має свою власну функцію, окремі цикли можуть бути включені в різні потоки і виконуватися з різною швидкістю.

  • (funct) pid.<номер_циклу>.do_pid_calcs – Виконує всі обчислення для одного циклу PID-регулятора.

Якщо ви хочете зрозуміти точний алгоритм, який використовується для обчислення вихідного сигналу PID-контуру, зверніться до

Обчислення циклу виконуються у функції 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-енкодера
halcmd: loadrt sim-encoder num_chan=<number>

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

Розвантаження SIM-енкодера
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 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.

Усунення дребезгу завантаження
halcmd: loadrt debounce cfg=<config-string>
<config-string>

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

Приклад усунення дребезгу завантаження
halcmd: loadrt debounce cfg=1,4,2

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

Розвантаження з усуненням дребезгу
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. Параметри

Кожна група фільтрів має один параметр[1].

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

Завантаження знаку
halcmd: loadrt siggen [num_chan=<chans>]
<chans>

- це кількість генераторів сигналів, які ви хочете встановити. Якщо numchan не вказано, буде встановлено один генератор сигналів. Максимальна кількість генераторів - 16 (як визначено MAX_CHAN у siggen.c). Кожен генератор є повністю незалежним. У наведених нижче описах

<chan>

номер конкретного генератора сигналів (номери починаються з 0).

Розвантаження підпису
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. Параметри

Немає. виноска:[До версії 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, щоб вказати, чи буде цей рядок істинним чи хибним. Далі запишіть кожне число у стовпці виводу, починаючи зверху і записуючи їх справа наліво. Це буде двійкове число. За допомогою калькулятора з програмним інтерфейсом, подібним до того, що є в 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».


1. Кожен окремий фільтр також має внутрішню змінну стану. Існує перемикач часу компіляції, який може експортувати цю змінну як параметр. Це призначено для тестування і в нормальних умовах просто марнує спільну пам’ять.