Вимірювання опору та індуктивності двигуна постійного струму

Постановка завдання
Є двигун постійного струму. Завдання — розробити, зібрати і протестувати пристрій, позволяющиее реалізувати контур струму стосовно до цього двигуна. Бажаний час перехідного процесу на застопоренном двигуні (без противо-ЕРС) — не більше 10мс. Интерфес зв'язку із зовнішнім керуючим контролером — SPI.

Двигун постійного струму, колекторний, максимальна напруга 24В, робочий струм до 5А.

Що значить — контур струму? Найпоширеніші драйвери для управління двигунами це всякі варіації напівмостів, які посилюють напругу. А мені хочеться, щоб драйвер брав на вхід не напруга, а силу струму. Сила, що розвивається електроприводом, прямо пропорційна силі протікаючого струму. А значить, і прямо пропорційна прискоренню на валу двигуна. Такий контур струму дозволить уникнути перекручень, на які потрібно йти без нього, як я це робив тут.

Я розбив цей текст на дві статті (друга буде опублікована через кілька днів):
  • 1. Вимірювання опору та індуктивності двигуна
  • 2. Розробка управляючого контуру (скоро буде, залишайтеся на зв'язку)


Ось так виглядає макет керуючого заліза:





Залізо

До складу системи будуть входити:
  • Силова мікросхема ключів, що приймає вхідний сигнал PWM і посилює його.
  • Датчик струму.
  • Керуючий мікроконтролер, що реалізує зворотний зв'язок і закон управління.


Силовий драйвер
В якості силового драйвера обрана широкодоступная плата ($18) від Pololu на базі мікросхеми Freescale MC33926, максимальна частота ШІМ 20кГц, 5А в піке, комутована напруга від 5 до 28 вольт.

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

Датчик струму і його перевірка
Як датчка струму обраний датчик Холла Allegro ACS714 ($3), видає аналоговий сигнал з центром в 2.5 і 185мВ/А, типова помилка 1.5%. На датчик була додана RC-ланцюжок в якості фільтра низьких частот з частотою зрізу 16кГц.

Датчик струму був живиться від 4.96 У джерела, послідовно з датчиком був підключений резистор, через який було пропущено 2А. Теоретичне напруга на вихідному піне повинно бути 4.96/2 + (2 * 0.185 +- 1.5%), вимірювання показало 2.84, що вкладається в розрахункові параметри. Потім було поміняно напрямок перебігу струму через резистор, при -2А виміряна напруга на вихідному піне датчика склало 2.11, що знову вкладається в розрахункові параметри:



Ця перевірка була необхідна, т. к. я купив кілька макеток з ACS712 і ACS714 від різних виробників, і в параметри даташита потрапив тільки один!

Мікроконтролер
В якості керуючого мікроконтролера обраний ATMega328p, що працює на частоті 16МГц. Обв'язка мікроконтролера — китайський клон Arduino Nano v3 ($1.5).

Мікроконтролер генерує сигнал ШІМ через восьмибітний лічильник з подільником 8, таким чином, частота ШІМ сигналу 16 * 10^6 /255 /8 = 7.8 кГц, що вкладається в максимально доступні для драйвера 20кГц.

Дільник АЦП мікроконтролера встановлений на 128; оскільки кожне вимірювання вимагає приблизно 13 тактів, максимальна частота вимірювань протікаючого струму дорівнює приблизно 16 * 10^6 / 128 / 13 = 9.6 кГц. Вимірювання проводяться в фоновому режимі, сповіщаючи основну програму про закінчення за допомогою виклику відповідного переривання.

Логи

Я довго бився над тим, як записувати те, що відбувається внтри мікроконтролера, адже пам'яті у нього зовсім небагато. У підсумку я виявив, що рідний SPI інтерфейс дуже швидкий, і в підсумку вся налагоджувальна інформація передається мікроконтролером по інтерфейсу SPI, для її запису був застосований широкодоступний ($10 на дилэкстриме, $6 на алиэкспрессе) китайський клон логічного аналізатора Saelae Logic Pro 8. Після зовсім неважких маніпуляцій з перепрошиванню VID/PID, він може бути використаний з рідним софтом від Saelae. Я користуюся sigrok (pulseview). У нього виключно простий формат лог-файлів, які я просто читаю своєї самописною програмкою в п'ятдесят рядків. Я купив цей аналізатор за порадою gbg, який мені дистанційно лагодив мій спектрум (спасибі тобі величезне!), і вважаю це найбільш вигідним вкладенням грошей за останні два роки.

Наприклад, я подав синусоїдальний сигнал (ШІМ) на вихід контролера, і логічний аналізатор його прекрасно бачить:



Все це було з'єднане разом, дана фотографія в заголовку поста.

Ліричний відступ

Практично всі статті, що я розміщую тут, є моїм робочим щоденником. Я чомусь вчуся (в даному випадку теорії управління) і старанно записую те, що дізнався. Кращий спосіб записати — це написати пояснення того, як це все працює. Потім статті викладаю на різних майданчиках, наприклад тут.

Цілей при написанні тексту у мене дві:

а) отримати зворотний зв'язок від людей, які знають більше за мене. Наприклад, практично все, що я дізнався для даних двох статей, мені розповів шановний Arastas, прошу любити і жалувати: людина, яка витрачає свій особистий час на навчання таких телепнів, як я.

Знову ж таки, gbg, який написав мені лінійну алгебру для моїх лекцій з комп'ютерної графіки, а потім за багато тисяч кілометрів по телефону дебажил мені електроніку.

б) просто записати: таким чином я отримую бібліотеку особистого досвіду, до якої періодично повертаюся. до Речі, тематичні медіа, який відсоток авторів погоджуються на ваші умови програми підтримки?

Необхідний лікнеп
Перетворення Фур'є

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

На цю тему добре висловився Валерій Іванович Обпивайлів (Бос):

В будь-якій області корисно опинитися у відповідній середовищі усного спілкування, де обсипається книжкова лушпиння. Там іноді нічого не змінюється по суті, зате виникає відчуття попадання в колію і звільнення від догм. Для науки, яка завжди в масці, це особливо важливо. Суть за кадром, перед очима — мережива. І вічно чогось не вистачає. То простоти, то складності, так точно і не визначиш — чого. Щось кудись крокує, ти — на узбіччі, а час йде в пісок, не кажучи про життя.

Далі робиться спроба зрушити ситуацію з місця, моделюючи письмову середовище, де «спадають покрови». Зовнішня канва утримання більш-менш ясна зі змісту, але головна мета — та, що за кадром. Зняти вуаль, грим, прибрати декорації. Переупростить, навіть трохи прибрехати, бо дозування правди — наріжний камінь пояснення. Результати, перевантажені деталями, не пролазять куди треба. Осяяння трапляється, коли пухнущая голова провалюється на рівень «двічі два», в той час як рахунок йде на мільйони. Така вже тут діалектика.


Якщо у нас є вектор (7,12,18,-2), то його можна розглядати як набір коефіцієнтів у зваженій сумі. 7*(1,0,0,0) + 12*(0,1,0,0) + 18*(0,0,1,0) + (-2)*(0,0,0,1). Рівно так само можна вважати цей вектор значень функції в точках 0, 1, 2, 3, адже наші вектори (0,1,0,0) і йому подібні можна розглядати як зрушення одиничного імпульсу:



Якщо постійно збільшувати кількість векторів (зрушених одиничних импуьсов) у базисі, то отримаємо звичайні функції.

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



Ми вже розмовляли про те, що таке перетворення Фур'є. Якщо коротко, то це зміна базису.

У нашому випадку перетворення Фур'є — це функція речовинних чисел комплексні:


Аргумент функції (дійсне число) — це просто номер базисної функції або вектора (насправді, пари базисних функцій), а її значення — це відповідна (пари) координат для цих двох векторів в базисі. Базис Фур'є — це синуси і косинуси різних частот. Частота і є номером базисної функції.

Для нашої конкретної функції f(t), яка вже є зваженою сумою синуса і косинуса, дуже легко порахувати її розкладання в базис Фур'є:



Тобто, наша функція f(t) має нульові координати для всіх векторів базису, крім векторів номер 11 41.

Чим корисний базис Фур'є? Наприклад тим, що операція диференціювання лінійно перетворює цей базис. Припустимо, ми хочемо порахувати перетворення Фур'є від похідної f'(t). Як це зробити? Як варіант, в лоб: спочатку порахувати похідну, а потім порахувати перетворення Фур'є:



Очевидно, що при диференціюванні sin(x) він стане sin(x+90°), то є вкрай легко знайти відповідність розкладання в базис Фур'є вихідної функції та її похідної:



Множення на i — це просто поворот комплексної площини, який відповідає +90° в аргументі нашої функції. Тобто, операція диференціювання, яку складно робити в базисі одиничних імпульсів, в базисі Фур'є — це просто масштабування і поворот на 90 градусів. Красиво, правда?

Перетворення Лапласа

Приблизно та ж сама історія відбувається і з перетворенням Лапласа. На жаль, на відміну від базису Фур'є, базис Лапласа неортогонален, тому для інтуїтивного розуміння трішки більш складний. Ну так не суть. Лаплас пішов трохи далі. Якщо у Фур'є в базисі були тільки синусоїди, то у Лапласа в базисі синусоїди з експоненціальним загасанням. Звідки він їх взяв? Це вкрай, вкрай корисно при вирішенні лінійних диференціальних рівнянь. Давайте подумаємо, яка функція перетвориться сама в себе при диференціюванні? Експонента. А при диференціюванні два рази? Синус. А їх комбінації дають всі можливі функції, які можуть з'явитися при вирішенні (лінійних) диффуров, що і використовував маркіз де Лапласа.

Не будемо вдаватися в подробиці того, як виводяться ці властивості (краще розгляньте уважно властивості базису Фур'є, він простіше), давайте просто відзначимо наступні факти:

1. Перетворення Лапласа лінійно:



2. Перетворення Лапласа похідної — це афінне дію над перетворенням самої функції:


Переходимо безпосередньо до справи

Отже, якщо у нас є двигун постійного струму, що протікає струм I(t) і напруга на клемах U(t) пов'язані наступним диференціальним рівнянням, де w(t) — швидкість обертання валу двигуна:



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

Оскільки наше завдання знайти L і R, давайте жорстко зафіксуємо вал двигуна, таким чином змусивши w(t) бути нульовою:


За порадою Arastas я подав два типи сигналів на мій двигун: меандр і синусоїду. Потім я виміряв протікає струм, картинка виходить приблизно наступна:



Тут сині криві — це вхідна напруга, яке я контролюю, а зелені — це вимірювання сили струму, отримані за допомогою ACS714.

Мій микроконтроллерный код, який генерує 11 експериментів з меандром та синусоидами різних амплітуд і частот, можна подивитися тут.

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

Вхідний сигнал — функція Хэвисайда (напівперіод меандру)

Отже, w(t) = 0, початкові умови I(0) = 0, струм в самому початку не тече. Докладемо постійна напруга U0 до клем мотора, як себе повинен буде вести протікає струм?

Давайте візьмемо перетворення Лапласа від лівої і правої частин диференціального рівняння (1):



Для отримання другої строчки я використовував лінійність перетворення Лапласа, U0/s — взяв з таблиці (зазвичай перетворення Лапласа вручну не вважають, користуються таблицями).

Для отримання третього рядка використано властивість похідної.

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

Тепер залишилося застосувати зворотне перетворення Лапласа (для правої частини ми дивимося таблицю) і ми вирішили наш диффур. Перехід в базис Лапласа перетворив диференціальне рівняння в звичайне алгебраїчне!



Швидка перевірка результату: по закінченні декількох мілісекунд індуктивність вже не буде грати ролі, і ми отримаємо протікає струм U_0 / R (закон Ома). У самому ж початку протікає струм дорівнює нулю і експоненціально зростає, причому швидкість зростання безпосередньо залежить від індуктивності. Sanity check passed.

Файл з вимірами лежить здесь. Три колонки, секунди, прикладена напруга (у вольтах), виміряна сила струму (в амперах).

Ось код, який підбирає параметри опору та індуктивності для цього експерименту:
Прихований текст
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

U0 = 19.2

def unit_step_current(x, R, L):
return [U0/R - U0/R*np.exp(-t*R/L) for t in x]

data = np.genfromtxt('unit_step_19.2V.csv', delimiter=',', names=['t', 'V', 'A'])

[R, L] = curve_fit(unit_step_current, data['t'], data['A'])[0]
print(R, L)

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

ax1.set_title("Resistance/inductance fitting")
ax1.set_xlabel('Time, seconds')
ax1.set_ylabel('Current (A), tension (V)')

ax1.plot(data['t'], data['V'], color='b' label='input tension')
ax1.plot(data['t'], data['A'], color='g', label='measured current')
model=unit_step_current(data['t'], R, L)
ax1.plot(data['t'], model, color='r', label='fitted curve')
ax1.legend()

plt.show()



Він каже, що добре підходить пара R=4.4 Ома, L=6мГенри, ось графік:



Вхідний сигнал — синус

Повторимо процедуру для синусоїди напруги з амплітудою U0 і частотою F0. Застосуємо перетворення Лапласа до рівняння (1), спочатку до правої частини:



а потім і до лівої:



Тепер зворотне перетворення нам дасть наступний закон протікання струму:



Знову швидкий sanity check: нульовий струм в самому початку, кілька мілісекунд перехідних процесів (експонента, безпосередньо залежить від індуктивності). По закінченню деякого часу протікає струм — це зважена сума синуса і косинуса однієї і тієї ж частоти (частота дорівнює вхідний, це добре). Ця сума дає синусоїду, трохи зміщену в часі. Відмінно, результат правдоподібний.

Вимірювання лежать здесь, а код підбору параметрів тут. Він дає приблизно такі ж значення опору й індуктивності, що нам і потрібно. Ось графік:



Висновок

Чому не виміряти параметри безпосередньо, навіщо весь цей город з мікроконтролерами? По-перше, мені нема чим вимірювати індуктивність. Та й вимірювання опору двигуна омметром може мати свої нюанси.

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

Ну а далі залишилося розробити регулятор, який буде на вхід брати необхідну силу струму. Залишайтеся на зв'язку!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.