а чего его крутить - на малых скоростях и на реверсировании возможно появление и накопление ошибок счета...
а чего его крутить - на малых скоростях и на реверсировании возможно появление и накопление ошибок счета...
Из-за смены фаз А и В при реверсе и алгоритме обработки их .
электронщик до мозга костей и не только
Можете на пальцах объяснить?
Попозже добавлю тест, который будет случайным образом крутить фазы A/B (ну, в смысле, виртуальный энкодер будет крутиться в случайных направлениях, и его ABZ будут подаваться на вход тестируемому блоку) и проверять, что распознаётся правильно.
Такой тест работает:
Код:abz.setA(cpu, 1); // A: 0 -> 1 executeBlock(cpu); assertEquals(abz.getCounter(cpu), 1, "counter"); assertEquals(abz.getPosition(cpu), ((-1) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); executeBlock(cpu); // Если входы не менялись, выходы меняться не должны assertEquals(abz.getCounter(cpu), 1, "counter"); assertEquals(abz.getPosition(cpu), ((-1) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); abz.setB(cpu, 1); // B: 0 -> 1 executeBlock(cpu); assertEquals(abz.getCounter(cpu), 2, "counter"); assertEquals(abz.getPosition(cpu), ((-2) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); abz.setA(cpu, 0); // A: 1 -> 0 executeBlock(cpu); assertEquals(abz.getCounter(cpu), 3, "counter"); assertEquals(abz.getPosition(cpu), ((-3) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); // Теперь крутим обратно abz.setA(cpu, 1); // A: 0 -> 1 executeBlock(cpu); assertEquals(abz.getCounter(cpu), 4, "counter"); assertEquals(abz.getPosition(cpu), ((-2) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); abz.setB(cpu, 0); // B: 1 -> 0 executeBlock(cpu); // Если входы не менялись, выходы меняться не должны assertEquals(abz.getCounter(cpu), 5, "counter"); assertEquals(abz.getPosition(cpu), ((-1) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); // Теперь снова меняем направление abz.setB(cpu, 1); // B: 0 -> 1 executeBlock(cpu); // Если входы не менялись, выходы меняться не должны assertEquals(abz.getCounter(cpu), 6, "counter"); assertEquals(abz.getPosition(cpu), ((-2) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected"); abz.setA(cpu, 0); // A: 1 -> 0 executeBlock(cpu); assertEquals(abz.getCounter(cpu), 7, "counter"); assertEquals(abz.getPosition(cpu), ((-3) & 0xffff), "position"); assertEquals(abz.getZeroDetected(cpu), 0, "zero detected");
Последний раз редактировалось Владимир Ситников; 07.10.2016 в 16:45.
Владимир, объясните на пальцах как java даёт команды в плк110?
Через сеть?
Объясню: пока ещё никак.
Код выше работает на эмуляторе PRU сопроцессора.
Эмулятор повторяет логику процессора (регистры, память, IO), поэтому мне не нужен ПЛК, чтобы тестировать логику ФБ. Тем не менее, тут тестируется почти тот же самый бинарный код, который будет загружен в ПЛК.
До тестирования "в железе" ещё доберёмся, но попозже
Последний раз редактировалось Владимир Ситников; 07.10.2016 в 17:16.
Начальные состояния: 0,0.
Импульсы не пропали. Сначала один посчитался как -1, потом рервес и он учёлся как +1 -- в итоге 0.Код:// Приходит фаза A; B ещё нет abz.setA(cpu, 1); executeBlock(cpu); System.out.println("position = " + (short)(abz.getPosition(cpu)) + ", counter = " + abz.getCounter(cpu)); // Реверс -- фаза A пропала, B тоже молчит abz.setA(cpu, 0); executeBlock(cpu); System.out.println("position = " + (short)(abz.getPosition(cpu)) + ", counter = " + abz.getCounter(cpu)); Вывод: position = -1, counter = 1 position = 0, counter = 2 Если при исходных нулях моргнёт и пропадёт фаза B, то будет такой вывод: position = 1, counter = 1 position = 0, counter = 2
Тут немного непонятно. Что значит "есть A и B и команда на реверс". В каком порядке должны мигать A/B?
Последний раз редактировалось Владимир Ситников; 07.10.2016 в 17:03.
энкодер.jpgКоманда на реверс может придти в любое время (00,10,11,01,00 или 00,01,11,10,00) ..однозначно можно судить ,что это не помеха ,в момент +- импульс .-то есть ловим задний фронт А или В на одном и потенциал "1" на другом входе В или А .
электронщик до мозга костей и не только
Предлагается ловить только 1 фронт одной фазы? (при одном направлении вращения)
Это же в 4 раза снижает точность получаемых данных.
Можно же ловить все фронты (и передние и задние обоих сингалов) и тем самым повысить получаемую точность.
И, да, в моём алгоритме все переходы между 00,10,11,01,00 будут правильно обрабатываться. Грубо говоря: мы знаем прошлое состояние, мы видим какой фронт пришёл, и можем понять в какую сторону крутили.
О каких потерях идёт речь -- не могу понять.