PID-контроль фейдера двигуна


15

Я намагаюся керувати моторизованим фейдером (лінійним потенціометром ковзання) за допомогою Arduino.
PID-контроль дає хороші результати для «стрибків» на певну цільову позицію, але відстеження пандусів - це проблема, вона зовсім не гладка. Рух дуже ривковий, що б я не намагався.

Ось графік опорного положення, вимірюваного положення та виходу двигуна при відстеженні пандуса: Відстеження пандусу

А ось відео того самого тесту.

У комерційних системах, здається набагато більш гладкою, см це .

Детальніше :
Мотор-фейдер - це Альпи RSA0N11M9A0K . Для його управління я використовую Н-міст ST L293D , що живиться від регульованого 10 В постійного струму ( XL6009 ).
У Arduino UNO (ATmega328P) я використовую шпильки 9 і 10 з частотою ШІМ 31,372 кГц, щоб зробити його нечутливим (Timer1 з дозволом 1, TCCR1B = (TCCR1B & 0b11111000) | 0b001).
Потенціометр проводиться між землею і 5 В, а склоочисник переходить до ADC0, як зазвичай.

Контролер :
я використовую простий PID-контролер з антивідступним режимом, який оновлюється зі швидкістю 1 кГц (Ts = 1e-3 s):

float update(int16_t input) {
  int16_t error = setpoint - input;
  int16_t newIntegral = integral + error;
  float output = k_p * error 
               + k_i * newIntegral * Ts 
               + k_d * (input - previousInput) / Ts;

  if (output > maxOutput)
    output = maxOutput;
  else if (output < -maxOutput)
    output = -maxOutput;
  else
    integral = newIntegral;

  previousInput = input;
  return output;
}

Вихід контролера - значення від -127 до 127. Вихід ШІМ генерується наступним чином:

const int8_t knee = 48;

uint8_t activation(int8_t val) {
  if (val == 0)
    return 0;
  else {
    return map(val, 0, 127, 2 * knee, 255);
  }
}

void writeMotor(int8_t val) {
  if (val >= 0) {
    analogWrite(forward, activation(val));
    digitalWrite(backward, 0);
  } else {
    analogWrite(backward, activation(-val));
    digitalWrite(forward, 0);
  }
}

Я додав 48 до 7-бітового ШІМ-сигналу, тому що саме там мотор починає рухатися зі швидкістю 31 кГц, а потім розширюю його до 8-бітного числа (тому що саме ця analogWriteфункція очікує): ШІМ-швидкість

Що я спробував :
я спробував додати фільтр EMA до входу, до сигналу управління, до похідної складової PID-контролера, але безрезультатно. Я також спробував знизити роздільну здатність аналогового входу, використовуючи гістерезис, щоб запобігти його переключенню між двома значеннями, коли нерухомий. Це, здається, ні на що не впливає. Збільшення кроку часу до 10 мс також не допомагає.

Я також спробував зробити ідентифікацію системи в MATLAB і спробував налаштувати її в Simulink (після цієї серії відео ). У мене з'явилася модель з придатністю 91%, але я не знав, як боротися з вхідними та вихідними нелінійностями моделі MATLAB, як вони впливають на настройку PID та як їх реалізувати на Arduino.

Остаточне, що я спробував, - це зробити два різних контролера: один для великих стрибків у опорному положенні та один для невеликих помилок під час відстеження пандуса. Це, здається, трохи допомагає, тому що тоді я можу збільшити інтегральний коефіцієнт під час відстеження, не збільшуючи простріл при стрибках.
Однак, збільшуючи інтегральний (і пропорційний) коефіцієнт посилення, мотор зараз завжди щось робить, навіть коли він повинен бути нерухомим, а еталон не змінюється. (Він насправді не рухається, але ви можете відчувати, що він вібрує.)
У мене практично немає похідних коефіцієнтів, тому що збільшення його вище, ніж 1e-4, здається, ще більше поштовху, і я не помічаю різниці між 0 і 1е-4.

Я здогадуюсь, що для подолання статичного тертя йому потрібно більше сили, тоді динамічне тертя менше, тому воно перестарається, тому він рухає двигун назад, змушуючи його знову зупинятися, потім йому доведеться знову долати статичне тертя, він знову стріляє вперед тощо.

Як комерційні контролери долають цю проблему?

Моє передумови :
я на третьому бакалаврському курсі з електротехніки, я пройшов курси з теорії управління, цифрової обробки сигналів, управління LQR і т. Д., Тому у мене є деякі теоретичні передумови, але у мене виникають проблеми із застосуванням усіх цих теорій до ця система реального світу.


Редагувати :
Я перевірив вимірювання датчиків відкритого циклу, як рекомендував laptop2d, і я дуже здивований результатами: На високих частотах ШІМ спостерігаються неприємні піки в показаннях. При 490 Гц таких немає.
І це в постійному робочому циклі, тому я не можу уявити, який шум я отримую, коли мотор дуже швидко повертає напрямок.

введіть тут опис зображення

Тому мені доведеться знайти спосіб відфільтрувати цей шум, перш ніж знову почати працювати над контролером.

Редагування 2 :
Використання експоненціального фільтра, що рухається, не було достатньо для фільтрації шуму.

EMA

Я пробував з полюсами в 0,25, 0,50 і 0,75. Маленькі стовпи не мали великого ефекту, а більші полюси додавали занадто велику затримку, тому мені довелося знизити приріст, щоб він був стабільним, що призводило до зниження загальної продуктивності.

Я додав 0,1 мкФ конденсатор через потенціометр (між склоочисником і землею), і це, здається, очищає його.

Наразі це працює досить добре. Тим часом я читаю документ, опублікований Тімом Вескотом .
Дякую всім за допомогу.


Ви можете точно керувати 31 кГц Pwm?
Hasan alattar

@Hasanalattar: Ні, частоти, які я можу використовувати, знаходяться на другому графіку (prescaler 1, 8, 64, 256, 1024). 4 кГц і 500 Гц чутні, тому вони видають дратівливий звуковий сигнал, якого я хотів би уникнути. Це випускає 31 кГц, 120 Гц і 30 Гц. І останні два занадто повільні, я думаю. Дозвіл ШІМ становить 8 біт, але я використовую менше, тому що мій керуючий сигнал становить лише 7 біт, а я використовую лише значення ШІМ вище 96.
tttapa

1
H-міст, який ви пов’язали, має на першій сторінці аркуша: This device is suitable for use in switching applications at frequencies up to 5 kHz. Але електричні характеристики на сторінці 3 пропонують абсолютний максимум 690 кГц, якщо додати всі затримки. (нижній 4 рядок) Особисто я б пішов набагато повільніше, але я вважаю, що 31 кГц повинен бути адекватним ... якби не примітка на сторінці 1.
AaronD,

Однак це передбачає фіксований робочий цикл. (або "не байдужий" робочий цикл для абсолютної максимальної частоти, щоб "просто помахувати" - ви помітите, що це несиметрично) Цикли високого та низького режиму можуть створювати дуже вузькі імпульси, тому наскільки широкими є ті, що порівняно з цими внизу сторінки 3?
AaronD

1
Не впевнений, чи це ваша проблема, але якщо часова мітка може змінюватися, я думаю, ви повинні додати помилку * Ts до інтегралу, а не просто помилки, а не помножувати інтеграл на Ts. (Якщо Ts завжди є постійною, то це не має значення)
user253751

Відповіді:


9

Система управління настільки ж хороша, як і сенсор, запустіть відкритий контур датчика та вийміть вхід управління. Створіть власний вхід до датчика та повільно просуньте його (або знайдіть спосіб повільно пересунути його), приймаючи дані про положення, щоб переконатися, що це не датчик. Якщо датчик шумно, то покращуйте продуктивність датчика, отримуючи новий датчик або паралельно його, або фільтруючи вихід датчика . Можливо, вам знадобиться датчик з більшою роздільною здатністю.

Якщо датчик не шумить, вам знадобиться отримати інший контур управління. PID - це системи першого порядку і не дуже великі при контролі швидкості.


Дякую, справді багато шуму з більш високими частотами ШІМ, тому мені доведеться знайти спосіб покращити це. Чи трапляється у вас вказівки, як це зробити?
tttapa

Використовуйте фільтр, механічний або цифровий. Якщо ви цього не можете зробити, можливо, паралельні датчики будуть добре. meta.stackexchange.com/questions/126180/…
Спайк напруги

6

Ви впевнені, що проблема полягає в терті або, можливо, поєднанні тертя та люфту. Графік середньої швидкості та робочого циклу для різної ширини імпульсу характерний для системи з тертям. У цьому документі пояснено, що ви бачите, і є збірник рішень, які використовуються назавжди для вирішення проблем. Ви їх не побачили у вашій інженерній навчальній програмі, оскільки їх важко проаналізувати; вам, як правило, доведеться повозитися з ними в кожному конкретному випадку, щоб змусити їх працювати.

Я не знаю, що роблять комерційні контролери, хоча я підозрюю, що там є різноманітні рішення. Що я робив у минулому з такими речами, як це, коли сигнал приводу двигуна з мого PID-контролера опускається нижче деякого порогового значення (напевно, від 60 до 70 рахунків у вашому випадку), я починаю пульсувати привід мотора на порозі, з обов'язком цикл, що робить середній привід рівним виходу PID. Я зазвичай використовую для цього модулятор сигма-дельта-іш, оскільки він може бути реалізований у дуже небагато рядків, але ви можете працювати з будь-якими роботами для вас.


4

Здається, більша частина шуму надходить від сигналу приводу ШІМ.

Ви спробували синхронізувати захоплення АЦП до циклу ШІМ? У більшості мікроконтролерів є спосіб запустити захоплення АЦП на таймері, тому ви завжди можете спрацьовувати в одній точці циклу.

Для найнижчого рівня шуму оптимальне положення відбору проб було б правильним перед включенням живлення до двигуна, оскільки тоді будь-які шипи мали найдовший час, щоб осісти. Але незалежно від положення, синхронізація захоплення зменшить шипи, тому що величина зміщення залишиться приблизно однаковою в тій же точці циклу ШІМ.


3

Тому мені доведеться знайти спосіб відфільтрувати цей шум, перш ніж знову почати працювати над контролером.

Ви можете відфільтрувати шум датчика (або будь-який інший шумний вимірювальний / змінний) у коді приблизно таким чином (фільтрація низьких частот):

Sфільтрують[к]=αSфільтрують[к-1]+(1-α)Sсирий[к]

0<<α1


Я спробував це, але недостатньо, щоб позбутися від піків, і це додає занадто великого відставання.
tttapa

@tttapa Я бачу. Яке значення для альфа ви спробували? (0.8,0.9) Здійснюється певна настройка, яку ви, можливо, вже зробили, просто цікаво.
Big6

Я оновив свій початковий пост, щоб додати сюжет фільтрів EMA, які я спробував. Я також спробував 0,9, і це було навіть гірше, ніж 0,75, приріст повинен бути набагато нижчим через затримку. Я думаю, що я буду використовувати обмежену EMA для очищення шуму АЦП, але поки що конденсатора вистачає.
tttapa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.