Может стоит с временем фильтрации поиграться.
Может стоит с временем фильтрации поиграться.
Спасибо за совет, уменьшение времени существенно помогло, но не до конца, раз-два в минуту считает один лишний импульс.
Почему время у таймера 2s? Ведь по условию "Один оборот - один импульс".
Вариант
Код:VAR TRIG1: R_TRIG; D_IN1: BOOL; INT1: INT; old: TIME; new: TIME; Period: TIME; Kol_v_Sec: REAL; END_VAR TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*) CASE INT1 OF 0: IF TRIG1.Q THEN old:=TIME(); INT1:=1; END_IF; 1: IF TRIG1.Q THEN new:=TIME(); Period:= new - old; Kol_v_Sec:=1000/TIME_TO_REAL(Period); INT1:=0; END_IF; END_CASE
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.
Можно попробовать ФБ FREQ_MEASURE
Вложение 25532
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
А каков "период стабильности нужен"? Иначе говоря: "если скорость вращения изменилась, то через какое время усреднённое значение должно совпасть с новой скоростью"?
Попробуйте экспоненциальное сглаживание
В простейшем слуаче -- просто скопируйте как в том проекте-примере.
В основном цикле просто подсчёт импульсов, а во вспомогательной программе -- усреднение.
Как часто запускать программу и какой "усредняющий" интервал ставить -- зависит от конкретной задачи.
Да, freq_measure тоже обсуждали и при его использовании нужно справку хорошенько смотреть. Например при "periods=1 этот блок вырождается в простое 1/время_между_импульсами". Или то, что максимальное значение periods равно 10, т.е. больше чем по 10 импульсам усреднять уже невозможно и т.п.
Спасибо, сейчас попробую разобраться. "Период стабильности" должен быть не более 2-х секунд, в идеале 1.
Добрый день. Подскажите, как (на CFC) реализовать принудительный сброс булевой переменной в false раз в минуту.
Если так часто, то можно попробовать сглаживать каждый интервал.
Т.е.
Вот пример, как оно может выглядеть: https://docs.google.com/spreadsheets...it?usp=sharingКод:Period := new-old; (* т.е. время, прошедшее с прошлого раза, в миллисекундах *) a := 1.0 - EXP(-Period / 200.0); (* тут 200.0 мс это как раз период усреднения -- его можно менять *) avg_period := a*Period + (1.0-a)*avg_period; (* тут накапливается усреднение *) rate := 1000/avg_period; (* что выводить в случае "деления на ноль" предлагаю рассмотреть отдельно *)
Видно, что при увеличении константы результат сглаживания меняется более плавно, но медленнее.
Если характерная частота -- 5-20Гц, то, судя по графику, значение 200 должно неплохо работать. За секунду-полторы оно "выходит на режим", и потом несильно колбасится.