У меня есть абсолютный датчик, который выводит 10-битное значение (от 0 до 1023) в коде Грея.Проблема, которую я пытаюсь решить, состоит в том, чтобы выяснить, движется ли кодировщик вперед или назад.
Я решил, что «лучший» алгоритм выглядит следующим образом: сначала я преобразовываю код Грея в обычный двоичный код (полный текст последнего ответа в: https://www.daniweb.com/programming/software-development/code/216355/gray-code-conversion):
int grayCodeToBinaryConversion(int bits)
{
bits ^= bits >> 16; // remove if word is 16 bits or less
bits ^= bits >> 8; // remove if word is 8 bits or less
bits ^= bits >> 4;
bits ^= bits >> 2;
bits ^= bits >> 1;
return bits;
}
Второй Iсравнить два значения, которые были выбраны с интервалом в 250 миллисекунд. Я думал, что сравнение двух значений даст мне знать, если я двигаюсь вперед или назад. Например:
if((SampleTwo – SampleOne) > 1)
{
//forward motion actions
}
if((SampleTwo – SampleOne) < 1)
{
//reverse motion actions
}
if(SampleTwo == SampleOne)
{
//no motion action
}
Прямо как я начал чувствовать себя умным, чтобыК моему разочарованию, я понял, что у этого алгоритма есть фатальный недостаток. Это решение прекрасно работает, когда я сравниваю двоичное значение, скажем, от 824 до 1015. На данный момент я знаю, в каком направлении движется кодер. Однако в какой-то момент кодер перевернется с1023 до 0 и подниматься, и когда я затем иду, чтобы сравнить первое значение выборки, скажем, 1015, со вторым значением выборки, скажем, 44, даже если я физически двигаюсь в том же направлении, логика, которую я написал, неправильно фиксирует этоЕще один вариант - взять значение кода Грея как целое и сравнить два целых числа.
HКак я могу сравнить два значения кода Грея, которые были взяты на расстоянии 250 миллисекунд, и определить направление вращения, принимая во внимание аспект переворачивания энкодера?Если вы любезны помочь, не могли бы вы привести простой пример кода?