我有一个绝对编码器,它输出一个10位值(0到1023)的格雷码。 我正在尝试解决的问题是如何确定编码器是向前还是向后移动。
我决定“最佳”算法如下: 首先将格雷码转换为常规二进制代码(全功劳归于此前答案:https://www.daniweb.com/programming/software-development/code/216355/gray-code-conversion):
当我感到自己很聪明的时候,令我失望的是我意识到这个算法有一个致命缺陷。当我比较二进制值824和1015时,这个解决方案效果很好。此时我知道编码器的方向。然而,在某个时刻,编码器将从1023滚动到0并上升,当我比较第一次采样的值(例如1015)与第二次采样的值(例如44)时,尽管我在物理上沿着相同的方向移动,但我编写的逻辑不能正确捕捉到这一点。另一个不行的方案是将Gray码值作为int进行比较。
如何比较两个Gray码值,它们相隔250毫秒,并在考虑编码器溢出方面确定旋转方向? 如果您能够帮助,可以提供一个简单的代码示例吗?
我决定“最佳”算法如下: 首先将格雷码转换为常规二进制代码(全功劳归于此前答案: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;
}
其次,我比较了两个相隔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)时,尽管我在物理上沿着相同的方向移动,但我编写的逻辑不能正确捕捉到这一点。另一个不行的方案是将Gray码值作为int进行比较。
如何比较两个Gray码值,它们相隔250毫秒,并在考虑编码器溢出方面确定旋转方向? 如果您能够帮助,可以提供一个简单的代码示例吗?