如何使伺服达到一定的角度,例如60度

时间:2014-05-18 12:34:31

标签: c# netduino

我有以下代码来回转动伺服,一遍又一遍。我得到它的工作,但我怎么能创建一个功能,将其设置到一定程度...例如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?

1 个答案:

答案 0 :(得分:3)

您需要运行代码,对伺服位置进行一些测量,然后将这些测量值反馈给您的程序,以便它可以自行调整。这称为调整和校准。

你应该得到一个函数,它的输入是一个所需的角度,输出的是你需要命令伺服的PWM值。在移动伺服系统之前调用此功能。

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

确定校准系数(在最简单的变换中为gainoffset,假设伺服控制是线性的。y = mx + b,其中gain是{{} 1}}和moffset。):

  1. 将其启动,并将您的PWM设置为最小值(假设最小值为0)。
  2. 测量伺服角度。
  3. 将PWM设置为最大值(假设最大值为1.0)。
  4. 测量伺服角度。
  5. 我正在做一些假设并随意挑选数字,但让我们说测量结果如下:

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

    我们称之为测量:

    b

    x1 = angle1 = -10; y1 = pwm1 = 0; x2 = angle2 = 80; y2 = pwm2 = 1; 有两个值,x有两个值,因此您可以求解联立方程yy1 = x1 * m + b。由于y2 = x2 * m + bmgainb,因此我们最终得出以下等式:

    offset

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

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

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

    如果范围不是线性的,则变得更复杂(例如,伺服移动越接近最大值,越小越小)。您需要使用二次方程,高阶方程或完全不同的方程。选择取决于您能够在伺服位置承受多少误差。

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

    另请注意,这是开环控制,至少是您的系统。在伺服内,存在非常类似的控制回路。而不是gain = 1/90; offset = 1/9; dacValue = gain * angle + offset; ,而是angle to PWM,其中位置可能未校准到某个真实世界角度。这就是你需要在你的计划中照顾这份工作的原因。