2

我有以下代码来回转动伺服,一遍又一遍。我让它工作了,但我怎样才能创建一个将它设置到一定程度的函数......例如60?

我当前的代码:

public static void Main()
{
    PWM servo = new PWM(PWMChannels.PWM_PIN_D5, 100, .5, false);
    servo.Start();

    while (true)
    {
        double startValue, endValue;

        for (startValue = 4.712; startValue < 10.995; startValue = startValue + 0.0005)
        {
            endValue = System.Math.Sin(startValue) * 0.5 + 0.5;
            servo.DutyCycle = endValue;
        }
    }

}

例如,我如何设置 60 度,然后再将其设置为 164?

4

1 回答 1

3

您需要运行您的代码,对伺服位置进行一些测量,然后将这些测量结果返回给您的程序,以便它可以正确调整自身。这称为调整和校准。

您应该最终得到一个函数,其输入是所需角度,而输出是您需要命令伺服的 PWM 值。在移动伺服之前调用此函数。

注意:你的代码中的循环有点奇怪,所以我不知道你的特定伺服是如何控制的。PWM 控制基于它们的占空比工作,这是它们高与低的时间之比,或 0 到 100%。对于这个答案,这相当于 0.0 到 1.0 的 PWM 值。当然,您必须自己将这些想法和方程式集成到您的代码中。

要确定您的校准系数(这将是gain并且offset在最简单的转换中,假设伺服控制是线性的。y = mx + b,其中gainmoffsetb。):

  1. 启动它,并将您的 PWM 设置为最小值(假设最小值为 0)。
  2. 测量伺服的角度。
  3. 将 PWM 设置为最大值(假设最大值为 1.0)。
  4. 测量伺服的角度。

我正在做出一些假设并任意选择数字,但假设测量结果是:

  • -10 度,PWM 设置为 0(最小值)。
  • +80 度,PWM 设置为 1(最大值)。

我们称这些测量为:

x1 = angle1 = -10;
y1 = pwm1 = 0;
x2 = angle2 = 80;
y2 = pwm2 = 1;

我们有两个值x和 两个值y,因此您可以求解联立方程y1 = x1 * m + by2 = x2 * m + b。由于misgainbis offset,我们最终得到以下等式:

y = (1/90) * x + (1/9)

或者

gain = 1/90;
offset = 1/9;
dacValue = gain * angle + offset;

现在,假设伺服是可重复的,并且 PWM 控制是线性的,当请求 45 度时,您将使用上面的等式应用系数并得到 0.6111 的答案。你用这个命令你的 PWM,你的伺服应该移动。如果测量伺服位置,应该是 45 度。

请注意,由于伺服、电子电路、机械连接等的变化,系统中每个伺服的增益和偏移可能会有所不同。如果系统的任何部分被修改,您可能必须重新校准该伺服系统.

如果范围不是线性的,这会变得更加复杂(例如,伺服器在最大值附近移动得更近,在最小值处移动得更少)。您将需要使用二次方程、高阶方程或完全不同的方程。选择取决于您在伺服位置能够容忍多少错误。

如果伺服不可重复(例如,每次进入特定的 PWM 值,伺服停止在不同的位置),控制也会很困难。

另请注意,这是开环控制,至少在您的系统中是这样。在伺服系统内,存在一个非常相似的控制回路。取而代之的是angle to PWMPWM to position位置可能未校准到某个真实世界的角度。这就是为什么你需要在你的程序中处理好这项工作。

于 2014-05-18T12:57:32.343 回答