Математическая модель двигателя Lego NXT

в 9:09, , рубрики: lego, open source, автоматическое управление, двигатели, идентификация, Песочница, Учебный процесс в IT, метки: , , ,

Добрый день, уважаемые коллеги. В этой статье Я хочу поделиться с Вами своими методическими наработками, которые использую в курсе «Теория автоматического управления» на кафедре СУиИ НИУ ИТМО.
Основной задачей, которую Я перед собой ставил, было объединение теоретических знаний для решения практической задачи. Такой задачей стало управление приводами Lego робота. Лишний повод поиграть в игрушки, да и студентам проще воспринимать суровый матан… Вот пример описания этого набора: habrahabr.ru/post/166449/.

Пойдем по порядку, для начала нужно было составить адекватную математическую модель двигателя. И уже здесь Я столкнулся с проблемой: производители не указали технических характеристик двигателей в наборе. Поиcк в Google дает некоторое количество вариантов (например, nxt-unroller.blogspot.ru/2011/01/motor-controller-with-feed-forward-for.html), но Мне нужно было получить характеристики тех двигателей, которые использовались в роботе. Вот тут и пригодилось знание физики и теоретической механики.
Составим уравнение Лагранжа-Эйлера и учтем влияние противо-ЭДС в обмотке ротора двигателя постоянного тока (ДПТ), получим:
image
где w, w0 — угловая скорость вращения мотора, M, M0 — момент, J — момент инерции ротора двигателя. Решением дифференциального уравнения будет следующее выражение:
image
где J*w0/M0 = Tm, Tm — это электромеханическая постоянная двигателя.
Функция изменения угла во времени будет интегралом функции скорости с учетом начальных условий:
image
Как раз-таки она нам и нужна.
Далее, нужно было написать программу, которая снимет характеристику разгона ДПТ, описанную обозначенным уравнением. Для этого использовал nxcEditor для Linux и Bricxcc для Windows. На выходе получил файл, содержащий значения угла и соответствующие им показания времени.
Данные с двигателя обработал в Scilab (открытый аналог Matlab), получив значения электромеханической постоянной и установившейся скорости вращения двигателя методом наименьших квадратов, которые будут равны aa(2)=0.081 и aa(1)=14.7 соответственно.

data=read("/home/kasper/Number.txt",-1,2);
time=(data(:,2)-data(1,2))/1000;
angle=data(:,1)*%pi/180;
angle=angle';
time=time';
f=[time;angle];

function e=G(a, z),
	e = z(2) - a(1)*(z(1)-a(2)+a(2)*%e^(-z(1)/a(2))); 
endfunction 

a0=[1;4];
[aa,er]=datafit(G,f,a0); 
model=aa(1)*(time+aa(2)*(%e^(-time/aa(2))-1));
xtitle('Зависимость угловой скорости от времени','time','$dotphi,[frac{рад}{сек}]$');
plot2d(time,model,[5]);
a=gca();
a.children.children(1).thickness=2;
plot2d(time,angle,[2]);
a.children.children(1).thickness=2;
a.children.children(1).text=["$dotphi(t)$"];

image
Теперь можно было спокойно перейти к вычислению коструктивных постоянных двигателя, которые необходимы для управления его моментом. Для этого воспользовался системой уравнений двигателя, описывающих электрические процессы:
image
Измерил пусковой ток 0.9[А] (измеряется при стопорении ротора) и рассчитал момент инерции ротора. Пользуюсь следующими формулами, получил вращающий момент, выдаваемый двигателем:
image
Коэффициент передачи по току получил равное 0.42, поделив пусковой момент на выходном валу (не забыв про коэффициент редуктора) на пусковой ток. Коэффициент передачи противоЭДС, равный 0.48, вычислил, как отношение установившейся угловой скорости к подаваемому напряжению.
Следующий шаг, запрограммировать управление углом поворота ДПТ. Для этого использовал пропорциональный регулятор. Программная реализация выглядит следующим образом:

task main() {
string filename = " Number.txt";
DeleteFile(filename);
float err,f;
int u=100;
byte h = 0;
string r;
unsigned int b=8192;
unsigned int result=CreateFile(filename,b,h);
unsigned int first_time=FirstTick();
unsigned int time=0;
int kp=20;
float q;
while(1){
	time=CurrentTick()-first_time;
	f=MotorRotationCount(OUT_A);
	err=(180-f)*PI/180;
	q=BatteryLevel();
	q=q/1000;
	u=err*kp*100/q;
	OnFwdReg(OUT_A,u,OUT_REGMODE_SPEED);
	if (abs(u)>100)
	{u=sign(u)*100;}
	r= NumToStr(f) +" "+ NumToStr(time);
	WriteLnString(h,r,b);
	Wait(MS_6);
}
CloseFile(h);
ResetRotationCount(OUT_A);
}

И вот наступает момент истины, насколько наша расчитанная модель соответствует реальной ситуации (модель собиралась в Scilab Xcos).
image
Привожу модельную и экспериментальную кривую:
image
Как видите, все сходится с отклонением не более 3 %.
Такие простые эксперименты, проделанные собственными руками, позволяют понять основы математического моделирования и теории управления.
В свою очередь готов поделиться пособием для выполнения работ.
С удовольствием выслушаю Ваши отзовы и предложения.

Автор: kap2fox

Источник

Поделиться

* - обязательные к заполнению поля