我正在对编码器进行采样,此样本的值介于[30,230]之间;我必须使用这个值来定义两个输出计数器变量(一个递增计数器和一个递减计数器)。
问题在于,有时当翻转时,这意味着编码器从230传递到30,反之亦然,采样速度太慢,我失去了运动方向(逆时针或顺时针),这导致一个错误的行为。
示例:
如果编码器在220值上并且我在顺时针方向上移动它非常快,我的下一个值是例如100,这意味着值通过30(翻转):方向应该顺时针< / em>的。但该软件认为我将编码器从230移动到100,它给我一个逆时针运动。
提醒我不能提高采样速度,它是稳定的。
这是一个实时的环境。
答案 0 :(得分:1)
如果您无法保证编码器在一个轮询周期内不会移动超过范围的一半,则问题无法解决。如果你认为它不会移动那么远,那么它是可以解决的 - 你只是假设两个轮询事件之间的移动是两个可能方向的最短。
您没有解释为什么您的编码器范围从非零开始,但如果您删除该偏移并且通过减去偏移量来使用范围0到200,则算术更容易遵循(和代码)。
给定编码器读取函数uint8_t ReadEnc()
,例如:
#define ENCODER_RANGE 200
#define ENCODER_OFFSET 30 // remove offset for range 0 to 200
static unsigned ccw_counter = 0 ;
static unsigned cw_counter = 0
static uint8_t previous_enc = ReadEnc() - ENCODER_OFFSET ;
uint8_t enc = ReadEnc() - ENCODER_OFFSET ;
signed enc_diff = enc - previous_enc ;
previous_enc = enc ;
// If absolute difference is greater then half the range
// assume that it rotated the opposite way.
if( enc_diff > ENCODER_RANGE / 2)
{
enc_diff = -(ENCODER_RANGE - enc_diff)
}
else if( enc_diff < -(ENCODER_RANGE / 2) )
{
enc_diff = (ENCODER_RANGE + enc_diff)
}
// Update counters
if( enc_diff < 0 )
{
// Increment CCW counter
ccw_counter -= enc_diff ;
}
else
{
// Increment CW counter
cw_counter += enc_diff ;
}