管理编码器的值以了解编码器本身的方向(逆时针或顺时针)

时间:2016-04-05 09:09:19

标签: c embedded real-time sampling

我正在对编码器进行采样,此样本的值介于[30,230]之间;我必须使用这个值来定义两个输出计数器变量(一个递增计数器和一个递减计数器)。

问题在于,有时当翻转时,这意味着编码器从230传递到30,反之亦然,采样速度太慢,我失去了运动方向(逆时针或顺时针),这导致一个错误的行为。

示例:

如果编码器在220值上并且我在顺时针方向上移动它非常快,我的下一个值是例如100,这意味着值通过30(翻转):方向应该顺时针< / em>的。但该软件认为我将编码器从230移动到100,它给我一个逆时针运动。

提醒我不能提高采样速度,它是稳定的。

这是一个实时的环境。

1 个答案:

答案 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 ;
}