Вход

Просмотр полной версии : Вопрос про ШИМ



Dmitry Dedkov
25.06.2024, 14:09
День добрый, возникла необходимость использования ШИМ в обычных DO на ПЛК210-03 тк не хватает быстрых выходов в проекте. Используются для управления пропорциональных клапанов (I=0.3...0.75A, R=13.4Ом и I=0.3...0.5A, R=20,8Ом). МУ210-412 не подходит, поэтому и хочется использовать обычные DO (ну и из-за того что там тоже транзисторные ключи). Написал простой вариант ШИМа для этих выходов, но при включении получаются сильные мерцания. Частота шим должна быть 50 ГЦ. Так вот вопрос: возможно ли избавиться от мерцаний пограммным способом (ошибки в коде, либо же другой варинт исполнения ШИМ), либо же получится только аппаратным

FUNCTION_BLOCK PWM6
VAR_INPUT
pwm_coef: UDINT;
END_VAR
VAR_OUTPUT
out_value: BOOL;
END_VAR
VAR
x: UINT := 0;
COEF17: ARRAY [0..5] OF BOOL := [1,0,0,0,0,0];
COEF34: ARRAY [0..5] OF BOOL := [1,1,0,0,0,0];
COEF50: ARRAY [0..5] OF BOOL := [1,1,1,0,0,0];
COEF67: ARRAY [0..5] OF BOOL := [1,1,1,1,0,0];
COEF84: ARRAY [0..5] OF BOOL := [1,1,1,1,1,0];
END_VAR



CASE pwm_coef OF
0:
out_value := FALSE;
1:
out_value := COEF17[x];
2:
out_value := COEF34[x];
3:
out_value := COEF50[x];
4:
out_value := COEF67[x];
5:
out_value := COEF84[x];
6:
out_value := TRUE;
END_CASE

x := x+1;

IF x > 6 THEN
x := 0;
END_IF

capzap
25.06.2024, 14:32
tm_TON(IN:=NOT tm_TON.Q, PT:= UDINT_TO_TIME(REAL_TO_UDINT(1000 * (1.0/50.0)/2.0)));
IF tm_TON.Q THEN
out_value := NOT out_value;
END_IF;

а если так написать, будет мерцание?

Dmitry Dedkov
25.06.2024, 15:17
так вообще ничего не происходит

Dmitry Dedkov
25.06.2024, 15:59
А, я то пытался внутри ФБ использовать код. Но все-равно попробовал и лампочка мерцает + как задать коэффициент заполнения при данном подходе

capzap
25.06.2024, 16:27
А, я то пытался внутри ФБ использовать код. Но все-равно попробовал и лампочка мерцает + как задать коэффициент заполнения при данном подходе

желтым выделена требуемая частота

Dmitry Dedkov
25.06.2024, 16:51
Так это частота, а не коэффициент заполнения

IVM
25.06.2024, 16:51
Зачем такой маленький период ШИМ при управлении пропорциональным клапаном ?

Dmitry Dedkov
25.06.2024, 16:57
У "недружественной" компании на аналогичной машине частота ШИМ на клапанах 200 Гц, нам бы хотя бы 50-40

Dmitry Dedkov
25.06.2024, 16:57
нет, это про сообщение выше

Dmitry Dedkov
25.06.2024, 16:59
Частоту понятно как задать, а как теперь задать коэффициент заполнения (ширна сигнала/период ШИМ) в этом случае?

capzap
25.06.2024, 17:07
Так это частота, а не коэффициент заполнения

Библиотека оскат блок tpx

Валенок
25.06.2024, 17:16
//50Гц
клапан := заполнение >= time_to_dword(time()) mod 20;

заполнение 0..20 (шаг 1), что есть 0.00..1.00 (шаг 0.05)

Вопрос только в цикле ПЛК.
Точней только железные

FPavel
25.06.2024, 21:12
Только что узнал о существовании подобных устройств...
Первый вопрос, который возник - увидел в брошюре, что эти клапаны могут дооснащаться преобразователями 4-20 мА -> ШИМ (2 А) - может быть дооснастить штатным устройством?

Dmitry Dedkov
27.06.2024, 16:41
Получилось реализовать ШИМ на основе двух таймеров, только вот мерцания все так же сохранились. Скорее всего это из-за того, что эти выходы работают с максимальной частотой 300 Гц в зависимости от цикла ПЛК

PROGRAM PWM
VAR_INPUT
pwm_coef: UDINT := 0; //1%=10
pwm_freq: UDINT := 20; //в UW
time_set: TIME;
END_VAR
VAR_OUTPUT
out_value: BOOL;
END_VAR
VAR
freqTimer: OSCAT_BUILDING.OSCAT_BASIC.CLK_PRG; //таймер, выводящий сигнал с потоянной частотой
pwmTimer: OSCAT_BUILDING.OSCAT_BASIC.TP_X; //таймер ШИМ
END_VAR


//time_set := REAL_TO_TIME(1000*REAL_TO_UDINT(1.0/TO_REAL(pwm_freq)));
freqTimer(PT := time_set);
//time_set := REAL_TO_TIME(REAL_TO_UDINT((1.0/TO_REAL(pwm_freq))*TO_REAL(pwm_coef)));
time_set := TO_TIME(TO_REAL(T#20ms) * TO_REAL(pwm_coef)/1000);
pwmTimer(IN := freqTimer.Q, PT := time_set);

out_value := pwmTimer.Q;