Последний раз редактировалось AlekseyK; 20.03.2016 в 14:20.
m : WORD; (* текущее значение fast encoder *)
ottuda : WORD; (* прошлое показание encoder'а *)
c: DINT; (* абсолютное положение encoder'а, без проблем с 65535 *)
c := c + WORD_TO_INT(m - ottuda);
ottuda := m;
Проверил на железе, у меня вопросов нет.
во первых (#55) - в правом верхнем углу есть тоже ссылка, не обязательно указывать страницу и говорить какой пост прочитать
во вторых, ни какого подтверждения там нет, есть просьба что то подтвердить или опровергнуть (докопаляся до какой то ерунды)
в третьих и я обозначил что так с энкодером можно работать в отддельной задача или в главном цикле, не важно
в четвертых по мне так подход в исходной программе не совсем логичный, за основу берется условие состояния одного из входов и внутри этого условия анализируется состояние второго входа, хоть и правильно всё но в железе мало ли могут быть ошибки из-за дребезгов и т.п. Я бы анализировал что пришел импульс по поднятию обоих входов, а направление учитывал, кто из входов в предыдущей итерации был false
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
а как вы отличите полезный сигнал от дребезга? Если на первом высокий уровень, на втором тоже высокий но от дребезга, то по условию, что на втором в предыдущей итерации был 0 надо засчитывать движение в одну из сторон. Алгоритм получается абсолютно такой же, только момент засчитывание такта сместиться на четверть периода вперед.
с дребезгом может и погорячился, хотя есть фильтрация, но от неё может быть больше вред чем польза
только Вы от сигнала берете передний фронт, в это единичный момент времени на входах может произойти всё что угодно, просело напряжения и вместо логической единицы получили логический ноль, вот и произошло неверное трактование сигнала и как следствие неверный подсчет импульсов, не трудно же написать что то подобноеКод:IF in.0 AND in.1<>oldIn1 THEN ELSIF in.1 AND in.0<>oldIn0 THEN или (но с дополнительным отдельным учетом обработки направления) foo:=in.0 AND in.1; IF foo<>oldFoo THEN
Последний раз редактировалось capzap; 20.03.2016 в 16:51.
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран