Comments 8
Это статический стенд? И задача вентилятора поддерживать горизонтальное положение стол (луч)?
Если да, то я предлогаю полностью отказаться от MPU6050, и подобных микросхем, и вместо них, использовать концевик начала отсчёта (оптический лучше энкодер) и дисковый энкодер для получения точного угла поворота. Это простое решение и надежное (если будет защита энкодера от пыли).
Можно ещё магнитный датчик положения поставить. Да можно и обычный потенциометр, в принципе.
Да, магнитные сейчас довольно хорошие, небольшая проблема - держатель магнита с диаметральной намагниченностью, обычно делаемый 3Д-печатью и заливкой эпоксидкой, хотя некоторую кривизну можно довольно неплохо исправить программно полиномом или таблицей.
Всё так
Причина использования IMU в том, что энкодер на шарнире не позволит определить опрокидывание стенда, и такую систему сложнее монтировать.
Но истинная причина заключается в том, что мне очень хотелось пристроить куда-нибудь MPU6050.
Интересная задача. Попытался посмотреть аппроксимацию нелинейности звеном

Скрипт в Maxima для нахождения параметров колебательного звена
Программа
V1:b[0]/(a[2]*p^2+a[1]*p+1)
/*Переход к КЧХ*/;
V2:p=%i*2*%pi*f;
/*Комплексно-частотная характеристика КЧХ*/
V3:V1,V2;
/*Мнимая и действительная части*/
V3R:realpart(V3);V3I:imagpart(V3);
/*Точка с нулевой фазой - действительная часть равна нулю (частота свободных колебаний)*/
V4:solve(V3R=0,[a[2]]);
/*находим в точке f0*/
V5:V4,f=f0;
/*Подставляем в исходное выражение*/
V6:factor(V1),V5;
/*Обратное преобразование Лапласа (получение импульсной характеристики)
выбрать n - дискриминант отрицательный*/
V6i:ilt(V6,p,t);
/*Амплитуда при синусе при t=0*/
V6a1:V6i/sin(2*%pi*f0*sqrt(1-%pi^2*a[1]^2*f0^2)*t);
V6a:V6a1,t=0;
/*В самом начале амплитуда равна значению в точке A*/
V6b:V6a=A;
/*решение для корректировочного коэффициента b0*/
Vb0:solve(V6b,b[0]);
assume(τ>0,f0>0);
/*Постоянная времени переходного процесса*/
V7:2*%pi^2*a[1]*f0^2=τ;
/*Решение для коэффициента a[1]*/
V8:solve(V7,a[1]);
Vb01:factor(Vb0),V8;
/*Нахождение постоянной времени по уровню*/
V9:A*exp(-τ*t0)=B;
V10:solve(V9,τ);
/*Нахождение численных параметров
по графику f0 - за 16+1/4 периода время 15 секунд
точка A в самом начале, точка B - 10 периодов
*/
V11:[f0=(16+1/4)/15, A=39, B=10];V111:t0=10*f0,V11;
/*полный набор численных параметров*/
Num:push(V111,V11);
/*Постоянная времени*/
V12:V10,Num;;
Num1:append(V12,Num);
Vbn:factor(Vb01),Num1;
/*коэффициенты a1 , a2, b[0]*/
V13:[V8,V5,Vbn],Num1;
float(V13);
/*подстановка в импульсную характеристику*/;
V14:factor(-V6i),[V13,Num];
wxplot2d(V14,[t,0,25]);
В итоге получилась следующая аппроксимация звеном вида :,
при этом, . В результате имеем следующую импульсную характеристику (с нулевыми начальными условиями, в исходной модели, видимо, они не нулевые, -40 начальный угол)

Видно, что +- график одинаковый с точки зрения общей "энергетики" переходного процесса. В конце имеется в оригинальной модели статическое значение порядка -2, и более быстрая диссипация, связанная с сухим трением (вязкий коэффициент). Поэтому для управления целесообразно рассмотреть применение корневых методов для линеаризированного объекта управления.
Что касается замкнутой системы то желаемый результат есть фактически предельно апериодический процесс с кратным апериодическим полюсом. В этом случае все полюса расположены рядом в левой полуплоскости на действительной оси. Как только появляются комплексно-сопряжённые полюса, то имеется перерегулирование. Чем левее они расположены - тем быстрее, но тем больше может быть всплеск, также он характерен и для апериодического процесса с разнесёнными постоянными времени. Круговая частота колебаний определяется мнимой осью, постоянная времени - действительной. В этом случае полюса рационально расположить в секторе порядка 45 град исходящего из нуля, там будет и быстродействие приемлемое и колебательность небольшая. Также ПИД-регулятор с таким объектом сразу в замкнутой системе даст 4й порядок (2+2). Поэтому рационально использовать компенсатор. Очень грубо он может быть синтезирован из указанного выше объекта управления как режекторный фильтр , то есть как обратная передаточная функция с вспомогательным дважды апериодическим полюсом
. Компенсатор позволяет "выровнять" АЧХ объекта управления, но уменьшает быстродействие. В этом случае он ставится в ошибку управления и к нему суммируется интегратор (и небольшая пропорциональная составляющая), либо на выходе интегратора, для таких объектов производная (дифференциальная) - явный путь к автоколебаниям, интересно взглянуть на результаты оптимизации по времени на соотношения этих постоянных времени, скорее всего дифференциальная будет практически нулевой. Ну и разумеется возможность применения апериодического управления - deadbeat control, но это только для дискретных систем.
Ещё один PID-контроллер. Теория