gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:10:03 24 4
gpt4 key购买 nike

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

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

示例:

如果编码器位于 220 值并且我沿顺时针方向快速移动它,则我的下一个值例如是 100,这意味着该值通过 30(翻转):方向应该是顺时针.但软件认为我将编码器从 230 移动到 100,它给了我一个逆时针运动。

提醒一下,我无法提高采样速度,它是稳定的。

它处于实时环境中。

最佳答案

如果不能保证编码器在一个轮询周期内移动的范围不会超过一半,那么问题就无法解决。如果您假设它不会移动那么远,那么它是可以解决的 - 您只需假设两个轮询事件之间的移动是两个可能方向中最短

您没有解释为什么编码器范围从非零开始,但如果您删除该偏移量并通过减去偏移量来处理 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 ;
}

关于c - 管理编码器的值以了解编码器本身的方向(逆时针或顺时针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36421876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com