Техника для балансировки контроллера ввода и вывода
У меня есть система, в которой я использую RS232 для управления лампой, которая принимает входное значение, заданное в виде числа с плавающей запятой, в диапазоне 2,5 - 7,5). Затем система управления выдает выходной сигнал в диапазоне от 0 до 6000, который является яркостью, измеряемой датчиком.
Я хочу уравновесить систему, чтобы я мог указать значение яркости, и система должна сбалансировать значение напряжения, которое достигает этого.
Существует ли какой-нибудь стандартный алгоритм или метод, чтобы найти, какое должно быть напряжение на входе, чтобы получить конкретный выход? Я думал об алгоритме, который итеративно пытается значения, и с каждой попытки он определяет какое-то новое значение, которое должно быть лучше для достижения определенного выходного значения. (в моем случае это 3000).
Требуемые значения напряжения, как правило, различаются в разных системах, а также в течение срока службы лампы, поэтому предпочтительно, чтобы это делалось полностью автоматически.
Я просто ищу название для техники или алгоритма, но псевдокод работает так же хорошо.:)
3 ответа
Я совсем не увлекаюсь физикой, но если вы можете предположить, что соотношение между напряжением и яркостью несколько близко к линейному, вы можете использовать стандартный двоичный поиск.
Помимо этого, это напоминает мне перевернутый маятник, который является одним из стандартных примеров использования нечеткой логики.
Откалибруйте систему при первоначальном запуске, испытав все напряжения от 2,5 до 7,5 с шагом, например, 0,1 В, и запишите выходной сигнал датчика.
Учитывая, например, 3000, как желаемый уровень яркости, выберите напряжение, которое дает ближайшую яркость, затем настройте с небольшим шагом вверх / вниз на основе выходного сигнала датчика, пока не будет достигнута желаемая яркость. Время от времени (на основании того, что ваши калиброванные значения становятся менее точными) перекалибруйте.
После еще одного просмотра википедии я нашел это:
Механизм обратной связи контура управления:
previous_error = setpoint - actual_position
integral = 0
start:
error = setpoint - actual_position
integral = integral + (error*dt)
derivative = (error - previous_error)/dt
output = (Kp*error) + (Ki*integral) + (Kd*derivative)
previous_error = error
wait(dt)
goto start
[редактировать]
Удаляя "интегральный" компонент и настраивая веса (Ki и Kd), цикл работает отлично.