Показано с 1 по 10 из 10

Тема: Подключение энкодера - что не так?

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    С чем связано - не знаю. Абсолютно то же самое. Просто пользуйтесь, как есть. Скорее всего, если помучать разработчиков вопросами, выяснится, что подсчет импульсов в целях повышения точности идет как по фронту так и по спаду (х2). А изменение регистра происходит как от импульса фазы А, так и от импульса фазы Б (еще раз х2). Итого х4.
    Это может быть от того, что кто то подумал: "а если детское питание заваривать не на воде, как в инструкции, а на молоке - будет вкуснее". А в итоге - у ребеночка - понос.
    Сам налетал на эти грабли, когда энкодер на 2500... Выбирался для работы на длинном рельсовом пути. И все в итоге переполнялось. Пришлось уродоваться - ловить отдельно Z, и организовывать самому еще один регистр со "старшими разрядами", прибавляя или вычитая единичку в зависимости от направления движения телеги. Сам энкодер, разумеется, описывался в ПЛК как RING.

  2. #2

    По умолчанию

    Цитата Сообщение от D_O_K Посмотреть сообщение
    С чем связано - не знаю. Абсолютно то же самое. Просто пользуйтесь, как есть. Скорее всего, если помучать разработчиков вопросами, выяснится, что подсчет импульсов в целях повышения точности идет как по фронту так и по спаду (х2). А изменение регистра происходит как от импульса фазы А, так и от импульса фазы Б (еще раз х2). Итого х4.
    Это может быть от того, что кто то подумал: "а если детское питание заваривать не на воде, как в инструкции, а на молоке - будет вкуснее". А в итоге - у ребеночка - понос.
    Сам налетал на эти грабли, когда энкодер на 2500... Выбирался для работы на длинном рельсовом пути. И все в итоге переполнялось. Пришлось уродоваться - ловить отдельно Z, и организовывать самому еще один регистр со "старшими разрядами", прибавляя или вычитая единичку в зависимости от направления движения телеги. Сам энкодер, разумеется, описывался в ПЛК как RING.
    Досадная неточность в документации. Исправим.
    Действительно, модуль энкодера работает по 2 фронтам и 2 фазам. Но что в этом плохого?
    Диапазон настроек числа импульсов для энкодера до 65000, поставьте вместо 200 - 800 импульсов.
    Это было сделано для повышения точности, к-я очень бывает нужна в нек-х случаях.
    А если хочется снизить точность, то просто делите значение на 4.

  3. #3

    По умолчанию

    Цитата Сообщение от Филоненко Владислав Посмотреть сообщение
    Досадная неточность в документации. Исправим.
    Действительно, модуль энкодера работает по 2 фронтам и 2 фазам. Но что в этом плохого?
    Диапазон настроек числа импульсов для энкодера до 65000, поставьте вместо 200 - 800 импульсов.
    Это было сделано для повышения точности, к-я очень бывает нужна в нек-х случаях.
    А если хочется снизить точность, то просто делите значение на 4.
    Плохого - ничего. Предупреждать надо. На работе из-за этого был грандиозный скандал.

    На высокоточном энкодере 2500 отсчетов на диске. Рельс длинный. Выбирали как раз так, чтобы 16-разрядный регистр не переполнялся. Банально не хватило 65000 импульсов на рельсовый путь.

    Ладно, подтвердили, и ладно. В конце концов - "Овен", не рекордсмен по потерянному времени. Прощаем )))

  4. #4

    По умолчанию

    Собственно, вот текст той "кривой козы", на которой объезжали недостаточную разрядность регистра кодесисовского "encoder":

    Во первых, в настройках модуля "энкодер" указывается RING - энкодер будет кольцевым, и количество импульсов, равное тому, который считает ПЛК на цикл. Т.е. 200-импульсному энкодеру соответствует 800 в настройках.

    Далее, определяем программно направление вращения вала энкодера:

    STATE1.0 := ENCODER_A; - вход с фазой А
    STATE1.1 := ENCODER_B; - вход с фазой В

    IF STATE0 = 1 AND STATE1 = 3 THEN
    DIRECT_MOVE :=TRUE;
    END_IF;

    IF STATE0 = 3 AND STATE1 = 2 THEN
    DIRECT_MOVE :=TRUE;
    END_IF;

    IF STATE0 = 2 AND STATE1 = 0 THEN
    DIRECT_MOVE :=TRUE;
    END_IF;

    IF STATE0 = 0 AND STATE1 = 1 THEN
    DIRECT_MOVE :=TRUE;
    END_IF;



    IF STATE0 = 0 AND STATE1 = 2 THEN
    DIRECT_MOVE :=FALSE;
    END_IF;

    IF STATE0 = 2 AND STATE1 = 3 THEN
    DIRECT_MOVE :=FALSE;
    END_IF;

    IF STATE0 = 3 AND STATE1 = 1 THEN
    DIRECT_MOVE :=FALSE;
    END_IF;

    IF STATE0 = 1 AND STATE1 = 0 THEN
    DIRECT_MOVE :=FALSE;
    END_IF;


    STATE0 := STATE1;

    Синтезировать последовательностные схемы на языках МЭК можно, но было лень. Поэтому и была сделана поочередная проверка на направление вращения. Два бита фаз энкодера образовывали число, которое менялось либо так:
    1->3->2->0->1...
    либо так:
    0->2->3->1->0...
    В зависимости от направления вращения.

    Делаем из уровня фронт:
    Z_TRIG(CLK := ENCODER_Z ); - третий вывод энкодера, Z


    При наезде на концевик телегой происходило следующее:

    IF SW1_END_RAIL THEN

    HI_BITS_ENCODER :=0; - это переменная, в которой запоминается, сколько оборотов (через через метку Z) сделал вал телеги

    END_IF;

    После чего телега ехала в сторону увеличения координат до тех пор, пока не случался первый Z. Он и становился меткой начала пути.


    IF ENCODER_Z THEN
    ENCODER_PT := ADR(ENCODER); - а это - волшебная штука, которая
    ENCODER_PT^:= 0; работает только на самой последней прошивке ПЛК Овен - обнуление регистра "энкодера" через указатель.
    Иначе говоря, проходя каждый оборот, синхронизируется метка Z и счетчик импульсов энкодера.
    END_IF;

    А при возникновении фронта импульса Z в дополнительно созданном регистре, где хранятся "старшие биты" - а точнее - количество полных оборотов вала телеги учитываем их в зависимости от заранее определенного направления движения.
    IF Z_TRIG.Q AND DIRECT_MOVE THEN
    HI_BITS_ENCODER := HI_BITS_ENCODER + 1;
    END_IF;

    IF Z_TRIG.Q AND (NOT DIRECT_MOVE) THEN
    HI_BITS_ENCODER := HI_BITS_ENCODER - 1;
    END_IF;

    Таким способом, можно учитывать пробег энкодером существенных расстояний. При этом в переменной, не совсем удачно названной HI_BITS_ENCODER, можно хранить огромное количество полных оборотов вал, а точный "хвост" внутри каждого оборота считывать собствеенно из регистра модуля "энкодер".

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •