У цьому розділі наведено детальну інформацію про основні функції LinuxCNC, які вимагають точного часу для
-
генерація сигналів, які інтерпретуються апаратним забезпеченням (наприклад, двигунами) або
-
для інтерпретації сигналів, що надсилаються апаратним забезпеченням (наприклад, кодерами).
1. StepGen
Цей компонент забезпечує програмне формування імпульсів кроку у відповідь на команди положення або швидкості. У режимі положення він має вбудований попередньо налаштований контур положення, тому налаштування PID не потрібне. У режимі швидкості він приводить в дію двигун із заданою швидкістю, дотримуючись обмежень швидкості та прискорення. Це компонент, що працює тільки в режимі реального часу, і залежно від швидкості процесора тощо, здатний досягати максимальної частоти імпульсів від 10 кГц до, можливо, 50 кГц. Блок-схема генератора імпульсів показує три блок-схеми, кожна з яких є генератором імпульсів з одним кроком. Перша схема призначена для крокового типу «0» (крок і напрямок). Друга — для крокового типу «1» (вгору/вниз або псевдо-PWM), а третя — для крокових типів від 2 до 14 (різні крокові схеми). Перші дві схеми показують управління в режимі положення, а третя — в режимі швидкості. Режим управління і кроковий тип встановлюються незалежно, і можна вибрати будь-яку комбінацію.
stepgenhalcmd: 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.
stepgenhalcmd: 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` - Вихід напрямку (лише тип кроку 0). -
(bit)
stepgen.`__<chan>__.up` - Вихід псевдо-PWM UP (лише тип кроку 1). -
(bit)
stepgen.`__<chan>__.down` - Вихід псевдо-PWM ВНИЗ (лише тип кроку 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. Типи кроків
Генератор кроків підтримує 15 різних послідовностей кроків:
Тип кроку 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.
Тип кроку 1 має два виходи: вгору і вниз. Імпульси з’являються на одному або іншому, залежно від напрямку руху. Кожен імпульс має тривалість steplen нс, а імпульси розділені між собою щонайменше на stepspace нс. Максимальна частота така сама, як і для типу кроку 0. Якщо maxfreq встановлено вище за обмеження, воно буде знижено. Якщо maxfreq дорівнює нулю, воно залишиться нульовим, але вихідна частота все одно буде обмежена.
|
Warning
|
Не використовуйте функцію скидання парпорту з типами кроків 2–14. Це може призвести до неочікуваних результатів. |
Типи кроків від 2 до 14 базуються на стані і мають від двох до п’яти виходів. На кожному кроці лічильник стану збільшується або зменшується. Двофазний, трифазний, чотирифазний і п’ятифазний типи показують вихідні схеми як функцію лічильника стану. Максимальна частота становить 1000000000, поділену на steplen, і, як і в інших режимах, maxfreq буде знижено, якщо воно перевищує обмеження.
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
Цей компонент забезпечує програмне формування сигналів PWM (імпульсно-широтно-модульованих) та PDM (імпульсно-щільнісно-модульованих). Це виключно компонент реального часу, який залежно від швидкості процесора тощо здатний формувати сигнали PWM з частотою від кількох сотень герц із досить високою роздільною здатністю до, можливо, 10 кГц з обмеженою роздільною здатністю.
loadrt pwmgen output_type=<config-array>
«<config-array>» — це серія десяткових чисел, розділених комами. Кожне число викликає завантаження одного генератора PWM, а значення числа визначає тип виходу. У наведеному нижче прикладі буде встановлено три генератори PWM. Стандартне значення відсутнє, якщо «<config-array>» не вказано, генератори PWM не встановлюватимуться. Максимальна кількість генераторів частоти — 8 (як визначено MAX_CHAN у pwmgen.c). Кожен генератор є незалежним, але всі вони оновлюються одночасно за допомогою однієї і тієї ж функції (функцій). У наведених нижче описах «<chan>» — це номер конкретного генератора. Перший генератор має номер 0.
loadrt pwmgen output_type=0,1,2
Встановить три генератори PWM. Перший буде використовувати вихід типу 0 (тільки PWM), наступний буде використовувати вихід типу 1 (PWM і напрямок), а третій буде використовувати вихід типу 2 (ВГОРУ і ВНИЗ). Немає значення за замовчуванням, якщо <config-array> не вказано, жоден генератор PWM не буде встановлено. Максимальна кількість генераторів частоти становить 8 (як визначено MAX_CHAN у pwmgen.c). Кожен генератор є незалежним, але всі вони оновлюються за допомогою однієї і тієї ж функції (функцій) одночасно. У наведених нижче описах <chan> є номером конкретного генератора. Нумерація генераторів PWM починається з 0.
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-генератор матиме такі контакти:
-
(float)
pwmgen.`__<chan>__.value` - Значення команди, у довільних одиницях. Масштабуватиметься параметром «scale» (див. нижче). -
(bit)
pwmgen.`__<chan>__.enable` - Вмикає або вимикає виходи PWM-генератора.
Кожен PWM-генератор також матиме деякі з цих контактів, залежно від вибраного типу виходу:
-
(bit)
pwmgen.`__<chan>__.pwm` - PWM (або PDM) вихід (лише типи виводів 0 та 1). -
(bit)
pwmgen.`__<chan>__.dir` - Вихід напрямку (лише вихід типу 1). -
(bit)
pwmgen.`__<chan>__.up` - PWM/PDM вихід для позитивного вхідного значення (лише вихід типу 2). -
(bit)
pwmgen.`__<chan>__.down` - PWM/PDM вихід для від’ємного вхідного значення (лише вихід типу 2).
2.3. Параметри
-
(float)
pwmgen.`__<chan>__.scale` - Коефіцієнт масштабування для перетвореннязначенняз довільних одиниць в робочий цикл. Наприклад, якщо масштаб встановлено на 4000, а вхідне значення, передане доpwmgen.`__<chan>__.value`, дорівнює 4000, то робочий цикл буде 100% (завжди увімкнено). Якщо значення дорівнює 2000, то це буде 50% прямокутна хвиля 25 Гц. -
(float)
pwmgen.`__<chan>__.pwm-freq` - Бажана частота PWM, в Гц. Якщо 0,0, генерує PDM замість PWM. Якщо встановлено вище внутрішніх обмежень, наступний виклик update_freq() встановить його на внутрішнє обмеження. Якщо значення відмінне від нуля, а dither має значення false, наступний виклик update_freq() встановить його на найближче ціле число, кратне періоду функції make_pulses(). -
(біт)
pwmgen.`__<chan>__.dither-pwm` - Якщо true, вмикає дзеркальне відображення для досягнення середніх частот PWM або робочих циклів, які неможливо отримати за допомогою чистого PWM. Якщо false, частота PWM і робочий цикл будуть округлені до значень, які можна досягти точно. -
(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. Функції
Компонент експортує дві функції. Кожна функція діє на всі генератори PWM — запуск різних генераторів у різних потоках не підтримується.
-
(funct)
pwmgen.make-pulses- Високошвидкісна функція для генерації PWM-хвиль (без плаваючої коми). Високошвидкісна функціяpwmgen.make-pulsesповинна виконуватися в базовому (найшвидшому) потоці, від 10 до 50 мкс, залежно від можливостей комп’ютера. Період цього потоку визначає максимальну несучу частоту PWM, а також роздільну здатність сигналів PWM або PDM. Якщо базовий потік становить 50 000 нс, то кожні 50 мкс модуль вирішує, чи настав час змінити стан виходу. При 50% робочому циклі і частоті ШІМ 25 Гц це означає, що вихід змінює стан кожні (1/25) с / 50 мкс * 50% = 400 ітерацій. Це також означає, що ви маєте 800 можливих значень робочого циклу (без дрожання). -
(функція)
pwmgen.update- Функція низької швидкості для масштабування та обмеження значення, а також обробки інших параметрів. Це функція модуля, яка виконує більш складні математичні обчислення, щоб визначити, скільки базових періодів вихідний сигнал повинен бути високим, а скільки - низьким.
3. Енкодер
Цей компонент забезпечує програмне підрахування сигналів від квадратурних (або одноімпульсних) енкодерів. Це виключно компонент реального часу, який залежно від швидкості процесора, затримки тощо здатний забезпечувати максимальну швидкість підрахунку від 10 кГц до, можливо, 50 кГц.
Базова частота повинна становити 1/2 від швидкості, щоб врахувати шум і коливання частоти. Наприклад, якщо на шпинделі встановлено датчик з частотою 100 імпульсів на оберт, а максимальна частота обертання становить 3000 об/хв, максимальна базова частота повинна становити 25 мкс. Датчик з частотою 100 імпульсів на оберт матиме 400 імпульсів. Швидкість шпинделя 3000 об/хв = 50 об/с (обертів за секунду). 400 * 50 = 20 000 імпульсів за секунду або 50 мкс між імпульсами.
Блок-схема лічильника енкодеру — це блок-схема одного каналу лічильника енкодеру.
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(біт, ввід/вивід) (за замовчуванням: FALSE) — увімкнення режиму лічильника. Якщо значення true, лічильник підраховує кожен передній фронт вхідного сигналу фази A, ігноруючи значення фази B. Це корисно для підрахунку вихідного сигналу одноканального (неквадратурного) датчика. Якщо значення false, підрахунок відбувається в квадратурному режимі. -
encoder._<chan>_.missing-teeth(s32, In) (за замовчуванням: 0) - Увімкнення використання індексу відсутніх зубців. Це дозволяє одному виводу IO надавати інформацію як про положення, так і про індекс. Якщо колесо енкодера має 58 зубців, з яких два відсутні, розташовані так, ніби їх 60 (що є типовим для автомобільних датчиків колінчастого вала), то шкала положення повинна бути встановлена на 60, а відсутні зубці - на 2. Щоб використовувати цей режим, режим лічильника повинен бути встановлений на true. Цей режим буде працювати для різьблення на токарному верстаті, але не для жорсткого нарізування різьби. -
encoder._<chan>_.counts(s32, Out) - Позиція в лічильниках кодера. -
encoder._<chan>_.counts-latched(s32, Out) - На даний момент не використовується. -
encoder._<chan>_.index-enable(біт, ввід/вивід) - Якщо True,countsіpositionскидаються до нуля при наступному передньому фронті фази Z.
Одночасноindex-enableскидається до нуля, щоб вказати, що відбувся передній фронт. Контактindex-enableє двонаправленим. Якщоindex-enableмає значення False, канал фази Z кодера ігнорується, а лічильник працює в звичайному режимі. Драйвер кодера ніколи не встановлює дляindex-enableзначення True. Однак деякі інші компоненти можуть це робити. -
encoder._<chan>_.latch-falling(біт, In) (за замовчуванням: TRUE) - Наразі не використовується. -
encoder._<chan>_.latch-input(біт, In) (за замовчуванням: TRUE) - Наразі не використовується. -
encoder._<chan>_.latch-rising(bit, In) - На даний момент не використовується. -
encoder._<chan>_.min-speed-estimate(float, in) - Визначає мінімальну справжню величину швидкості, при якій швидкість буде оцінена як відмінна від нуля, а інтерпольоване положення буде інтерпольовано. Одиниці виміруmin-speed-estimateтакі самі, як і одиниці виміруvelocity. Коефіцієнт масштабування, в одиницях на одиницю довжини. Занадто низьке значення цього параметра призведе до того, що швидкість буде довго повертатися до 0 після припинення надходження імпульсів від кодера. -
encoder._<chan>_.phase-A(біт, In) – Фаза А сигналу квадратурного енкодера. -
encoder._<chan>_.phase-B(біт, In) – Фаза B сигналу квадратурного енкодера. -
encoder._<chan>_.phase-Z(bit, In) - Фаза Z (індексний імпульс) сигналу квадратурного енкодера. -
encoder._<chan>_.position(float, Out) - Позиція в масштабованих одиницях (див.позиція-шкала). -
encoder._<chan>_.position-interpolated(float, Out) - Позиція в масштабованих одиницях, інтерпольована між значеннями енкодера.
position-interpolatedнамагається інтерполювати між значеннями енкодера на основі останньої виміряної швидкості. Дійсно тільки тоді, коли швидкість є приблизно постійною і перевищуєmin-speed-estimate. Не використовуйте для контролю положення, оскільки його значення є некоректним при низьких швидкостях, під час зміни напрямку та під час зміни швидкості.
Однак це дозволяє використовувати енкодер з низьким ppr (включаючи енкодер з одним імпульсом на оберт) для нарізування різьби на токарному верстаті, а також може мати й інші застосування. -
encoder._<chan>_.position-latched(float, Out) - На даний момент не використовується. -
encoder._<chan>_.position-scale(float, I/O) - Коефіцієнт масштабування в одиницях на одиницю довжини. Наприклад, якщо position-scale дорівнює 500, то 1000 відліків кодера буде передано як позиція 2,0 одиниці. -
encoder._<chan>_.rawcounts(s32, In) - Необроблений лічильник, визначений лічильниками оновлення. Це значення оновлюється частіше, ніж лічильники та позиція. На нього також не впливає скидання чи індексний імпульс. -
encoder._<chan>_.reset(bit, In) - Якщо значення True, значення «counts» та «position» негайно обнуляються. -
encoder._<chan>_.velocity(float, Out) - Швидкість у масштабованих одиницях за секунду.encoderвикористовує алгоритм, який значно зменшує квантувальний шум у порівнянні з простим диференціюванням вихідних даних «позиції». Коли величина справжньої швидкості нижча за мінімальну оцінку швидкості, вихідні дані швидкості дорівнюють 0. -
encoder._<chan>_.x4-mode(біт, ввід/вивід) (за замовчуванням: TRUE) - Увімкнення режиму times-4. Якщо значення 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. PID
Цей компонент забезпечує пропорційні/інтегральні/похідні контури регулювання. Це виключно компонент реального часу. Для спрощення в цьому описі ми говоримо про контури положення, однак цей компонент можна використовувати для реалізації інших контурів зворотного зв’язку, таких як швидкість, висота пальника, температура тощо. Блок-схема контуру PID — це блок-схема одного контуру PID.
halcmd: loadrt pid [num_chan=<loops>] [debug=1]
<loops> — кількість циклів PID, які ви хочете встановити. Якщо num_chan не вказано, буде встановлено один цикл. Максимальна кількість циклів — 16 (як визначено MAX_CHAN у pid.c). Кожен цикл є повністю незалежним. У наведених нижче описах <loopnum> — номер конкретного циклу. Перший цикл має номер 0.
Якщо вказано debug=1, компонент експортуватиме кілька додаткових контактів, які можуть бути корисними під час налагодження та налаштування. За замовчуванням додаткові контакти не експортуються, щоб заощадити спільний простір пам’яті та уникнути захаращення списку контактів.
halcmd: unloadrt pid
4.1. Піни
Три найважливіші шпильки - це
-
(float)
pid.`__<номер циклу>__.command` – Бажана позиція, як її наказано іншим системним компонентом. -
(float)
pid.`__<loopnum>__.feedback` - Поточне положення, виміряне пристроєм зворотного зв’язку, таким як енкодер. -
(float)
pid.`__<номер циклу>__.output` – Команда швидкості, яка намагається переміститися з поточної позиції в бажану.
Для позиційної петлі .command і .feedback вимірюються в одиницях позиції. Для лінійної осі це можуть бути дюйми, міліметри, метри або будь-які інші відповідні одиниці виміру. Аналогічно, для кутової осі це можуть бути градуси, радіани тощо. Одиниці виміру виводу .output представляють зміну, необхідну для того, щоб зворотний зв’язок відповідав команді. Таким чином, для контуру положення .output є швидкістю в дюймах/с, мм/с, градусах/с тощо. Одиниці часу завжди вимірюються в секундах, а одиниці швидкості відповідають одиницям положення. Якщо команда та зворотний зв’язок вимірюються в метрах, то вихідні дані вимірюються в метрах за секунду.
Кожен контур має два виводи, які використовуються для моніторингу або керування загальною роботою компонента.
-
(float) pid.<loopnum>.error - Дорівнює «.command» мінус «.feedback».
-
(bit) pid.<loopnum>.enable - Біт, який дозволяє цикл. Якщо .enable має значення false (хибність), усі інтегратори скидаються, а вихід примусово встановлюється на нуль. Якщо .enable має значення true (істина), цикл працює нормально.
Виводи, що використовуються для повідомлення про насичення. Насичення виникає, коли вихідний сигнал блоку PID досягає своєї максимальної або мінімальної межі.
-
(bit) pid.<loopnum>.saturated - Істина, коли вихід насичений.
-
(float) pid.<номер_циклу>.saturated_s – Час насичення виводу.
-
(s32) pid.<номер_циклу>.saturated_count – Час насичення виводу.
Коефіцієнти підсилення, обмеження та інші «настроювані» функції ПІД-регулятора доступні у вигляді виводів, що дозволяє динамічно налаштовувати їх для більш розширених можливостей налаштування.
-
(float) pid.<номер_циклу>.Pgain – Пропорційне посилення
-
(float) pid.<номер циклу>.Igain - Інтегральне посилення
-
(float) pid.<номер циклу>.Dgain – Похідне підсилення
-
(float) pid.<loopnum>.bias - Постійне зміщення на виході
-
(float) pid.<номер циклу>.FF0 - Прямий зв’язок нульового порядку - вихід пропорційний команді (положенню).
-
(float) pid.<loopnum>.FF1 - Прямий зв’язок першого порядку - вихідний сигнал пропорційний похідній від команди (швидкості).
-
(float) pid.<loopnum>.FF2 - Прямий зв’язок другого порядку - вихід пропорційний другій похідній команди (прискорення).
-
(float) pid.<номер циклу>.deadband – Кількість помилок, яка буде проігнорована
-
(float) pid.<loopnum>.maxerror - Обмеження на помилку
-
(float) pid.<loopnum>.maxerrorI - Обмеження на інтегратор помилок
-
(float) pid.<loopnum>.maxerrorD - Обмеження на похідну помилки
-
(float) pid.<loopnum>.maxcmdD - Обмеження на похідну команди
-
(float) pid.<loopnum>.maxcmdDD - Обмеження на похідну команди 2nd
-
(float) pid.<loopnum>.maxoutput - Обмеження вихідного значення
All max* обмеження реалізовано таким чином, що якщо значення цього параметра дорівнює нулю, обмеження немає.
Якщо під час встановлення компонента було вказано debug=1, буде експортовано чотири додаткові виводи:
-
(float) pid.<loopnum>.errorI - Інтеграл похибки.
-
(float) pid.<loopnum>.errorD - Похідна помилки.
-
(float) pid.<loopnum>.commandD - Похідна від команди.
-
(float) pid.<loopnum>.commandDD - 2-га похідна команди.
4.2. Функції
Компонент експортує одну функцію для кожного циклу PID. Ця функція виконує всі обчислення, необхідні для циклу. Оскільки кожен цикл має свою власну функцію, окремі цикли можуть бути включені в різні потоки і виконуватися з різною швидкістю.
-
(funct) pid.<номер_циклу>.do_pid_calcs – Виконує всі обчислення для одного циклу PID-регулятора.
Якщо ви хочете зрозуміти точний алгоритм, який використовується для обчислення вихідного сигналу PID-контуру, зверніться до
-
figure Блок-схема циклу PID-регулятора,
-
коментарі на початку emc2/src/hal/components/pid.c, і, звичайно ж, до
-
сам код.
Обчислення циклу виконуються у функції C calc_pid().
5. Імітований кодер
Модельований енкодер саме таким і є. Він генерує квадратурні імпульси з індексним імпульсом зі швидкістю, що контролюється виводом HAL. Здебільшого корисний для тестування.
halcmd: loadrt sim-encoder num_chan=<number>
<number> кількість кодерів, які потрібно імітувати. Якщо не вказано, буде встановлено один кодер. Максимальна кількість — 8 (як визначено MAX_CHAN у sim_encoder.c).
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` - Квадратурний вихід. -
(біт)
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` - Коефіцієнт масштабування для.speed. За замовчуванням встановлено значення 1,0, що означає, що.speedвимірюється в обертах за секунду. Змініть значення на 60 для обертів за хвилину, на 360 для градусів за секунду, на 6,283185 (= 2*π) для радіан за секунду тощо.
Зверніть увагу, що кількість імпульсів за оберт не те саме, що кількість відліків за оберт. Імпульс – це повний квадратурний цикл. Більшість лічильників енкодерів рахують чотири рази протягом одного повного циклу.
5.3. Функції
Компонент експортує дві функції. Кожна функція впливає на всі імітовані кодери.
-
(funct)
sim-encoder.make-pulses- Високошвидкісна функція для генерації квадратурних імпульсів (без плаваючої коми). -
(funct)
sim-encoder.update-speed– Низькошвидкісна функція для зчитування.speed, масштабування та налаштування.make-pulses.
6. Усунення дребезгу
Функція усунення дребезгу – це компонент реального часу, який може фільтрувати збої, що створюються контактами механічних перемикачів. Він також може бути корисним в інших застосуваннях, де необхідно відхиляти короткі імпульси.
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. Піни
Кожен окремий фільтр має два контакти.
-
(bit)
debounce.`__<G>__.__<F>__.in` - Вхід фільтра <F> у групі <G>. -
(bit)
debounce.`__<G>__.__<F>__.out` - Вихід фільтра <F> у групі <G>.
6.2. Параметри
Кожна група фільтрів має один параметр
[Кожен окремий фільтр також має внутрішню змінну стану. Існує перемикач часу компіляції, який може експортувати цю змінну як параметр. Це призначено для тестування і в нормальних умовах просто марнує спільну пам’ять.]
.
-
(s32)
debounce.`__<G>__.delay` - Затримка фільтра для всіх фільтрів у групі <G>.
Затримка фільтра вимірюється в одиницях періодів потоку. Мінімальна затримка дорівнює нулю. Вихід фільтра з нульовою затримкою точно повторює його вхід - він нічого не фільтрує. Зі збільшенням значення .delay відкидаються все довші і довші спотворення. Якщо .delay дорівнює 4, відкидаються всі спотворення, менші або рівні чотирьом періодам потоку.
6.3. Функції
Кожна група фільтрів має одну функцію, яка оновлює всі фільтри в цій групі «одночасно». Різні групи фільтрів можна оновлювати з різних потоків у різні періоди.
-
(funct)
debounce.<G> - Оновлює всі фільтри в групі <G>.
7. SigGen
SigGen — це компонент реального часу, який генерує прямокутні, трикутні та синусоїдальні хвилі. Він в основному використовується для тестування.
halcmd: loadrt siggen [num_chan=<chans>]
- <chans>
-
- це кількість генераторів сигналів, які ви хочете встановити. Якщо numchan не вказано, буде встановлено один генератор сигналів. Максимальна кількість генераторів - 16 (як визначено MAX_CHAN у siggen.c). Кожен генератор є повністю незалежним. У наведених нижче описах
- <chan>
-
номер конкретного генератора сигналів (номери починаються з 0).
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. Параметри
Немає. виноска:[До версії 2.1 частота, амплітуда та зсув були параметрами. Їх було змінено на виводи, щоб дозволити керування іншими компонентами.]
7.3. Функції
-
(funct)
siggen.`__<chan>__.update` - Обчислює нові значення для всіх п’яти виходів.
8. lut5
Компонент lut5 — це логічний компонент з 5 входами, що базується на таблиці пошуку.
-
lut5не потребує потоку з плаваючою комою.
lut5loadrt lut5 [count=N|names=name1[,name2...]]
addf lut5.N servo-thread | base-thread
setp lut5.N.function 0xN
lut5 Обчислювальна функціяЩоб обчислити шістнадцяткове число для функції, починаючи зверху, поставте 1 або 0, щоб вказати, чи буде цей рядок істинним чи хибним. Далі запишіть кожне число у стовпці виводу, починаючи зверху і записуючи їх справа наліво. Це буде двійкове число. За допомогою калькулятора з програмним інтерфейсом, подібним до того, що є в Ubuntu, введіть двійкове число, а потім перетворіть його в шістнадцяткове, і це буде значенням функції.
| Біт 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».
| Біт 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».