PDA

Просмотр полной версии : Реализация плавного увеличения значения напряжения аналогового выхода.



Дмитрий Александрович
01.12.2022, 14:38
Здравствуйте!
Подскажите с решением задачи:
Есть сервопривод, управляемый напряжением 0 - 10 В. Нулю вольт соотвествует 0 об/мин. 10 вольт - 3000 об минуту.

Нужно реализовать плавный разгон, то есть плавное нарастание напряжение управления на выходе ПР от нуля до заданной величины за задаваемое время.

То есть - есть время в диапазоне от 1 до 10 секунд. Допустим 5 секунд. Есть уставка 1500 оборотов. По внешнему сигналу должно запустится нарастание переменной управления аналоговым выходом от 0 до в данном случае 0.5 и значение 0.5 должно быть получено через dT=10 секунд от старта.

На микроконтроллере я такую задачу делал так: прерывание по таймеру 10 раз в секунду, домножал уставку времени на 10 - получал число шагов. Далее уставку управления делил на число шагов получая приращение на шаг. И собственно дальше уже вычислял значение переменной увеличивая ее от нуля по прерыванию на величину шага и посылая в АЦП.

Возможно ли такой алгоритм реализовать на ПР или есть более изящное решение?

Благодарю.

petera
01.12.2022, 16:27
Здравствуйте!
Подскажите с решением задачи:
Есть сервопривод, управляемый напряжением 0 - 10 В. Нулю вольт соотвествует 0 об/мин. 10 вольт - 3000 об минуту.

Нужно реализовать плавный разгон, то есть плавное нарастание напряжение управления на выходе ПР от нуля до заданной величины за задаваемое время.

То есть - есть время в диапазоне от 1 до 10 секунд. Допустим 5 секунд. Есть уставка 1500 оборотов. По внешнему сигналу должно запустится нарастание переменной управления аналоговым выходом от 0 до в данном случае 0.5 и значение 0.5 должно быть получено через dT=10 секунд от старта.

На микроконтроллере я такую задачу делал так: прерывание по таймеру 10 раз в секунду, домножал уставку времени на 10 - получал число шагов. Далее уставку управления делил на число шагов получая приращение на шаг. И собственно дальше уже вычислял значение переменной увеличивая ее от нуля по прерыванию на величину шага и посылая в АЦП.

Возможно ли такой алгоритм реализовать на ПР или есть более изящное решение?

Благодарю.

Как-то так, например
64213

https://owen.ru/forum/attachment.php?attachmentid=64215&d=1669901241

Дмитрий Александрович
01.12.2022, 18:15
Спасибо Петр! Отличное решение, которое меня устраивает полностью.

1exan
02.12.2022, 06:27
Рампа с заданием скорости увеличения/уменьшения:


FUNCTION RAMP : REAL;
VAR_INPUT
Q_FB : REAL; (* Значение выхода на предыдущем цикле (ОС с задержкой с выхода функции) *)
X : REAL; (* Входное значение *)
VU_MAX : REAL; (* Скорость увеличения *)
VD_MAX : REAL; (* Скорость уменьшения *)
CYCLE : REAL; (* Цикл, в СЕК *)
RST : BOOL; (* Сброс *)

END_VAR


IF 0.0 > VU_MAX THEN VU_MAX := 0.0; END_IF
IF 0.0 > VD_MAX THEN VD_MAX := 0.0; END_IF

IF RST THEN
RAMP := X;

ELSIF X > Q_FB THEN
VU_MAX := VU_MAX * CYCLE;
VD_MAX := X - Q_FB;
IF VU_MAX > VD_MAX THEN VU_MAX := VD_MAX; END_IF
RAMP := Q_FB + VU_MAX;

ELSIF X < Q_FB THEN
VD_MAX := -1.0 * VD_MAX * CYCLE;
VU_MAX := X - Q_FB;
IF VD_MAX < VU_MAX THEN VD_MAX := VU_MAX; END_IF
RAMP := Q_FB + VD_MAX;

ELSE
RAMP := X;

END_IF

END_FUNCTION