
舵机的输入线共有三条,红色中间,是电源线,一边黑色的是地线,这两根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,另外一根线是控制信号线,一般为白色。
    3.2 单舵机和多舵机的角度控制
    3.2.1 单舵机的角度控制:
    由舵机的工作原理可知,给舵机输入一个周期在20ms 左右,脉冲宽度在0.5ms 至2.5ms 之间的周期性脉冲信号,驱动舵机输出轴达到-90°到90° 之间的转角,呈线性变化。并且无论外界转矩怎样改变,舵机的输出轴都会保持在一个相对应的角度上,直到给它提供一个另外宽度的脉冲信号,才会改变输出角度到新的对应的位置上。通过编程,借助单片机的输出端口得到需要的周期性脉冲信号。
    程序示例:(晶振为:4MHZ,脉冲从PORTDbits.RD0 输出)
    void delay(int j) //此函数用于产生0.25ms*j 的延时
    {
        for(i=0;i<j;i++)
        {
        INTCONbits.TMR0IF=0; //清TMR0 中断标志位
            T0CON=0XCF; //设定TMR0L 工作于8 位定时器方式、内部时钟、
            TMR0 不用分频
            TMR0L=0X14; //设定TMR0 每0.25ms 产生一次中断
            L1: if(INTCONbits.TMR0IF==1)
                {
                INTCONbits.TMR0IF==0; //清TMR0 中断标志位,关计时器
                T0CON=0X4F;
                }
            else goto L1;
        }
    }
    PORTDbits.RD0=1; // 输出脉冲宽度为2ms,周期为20ms 的脉冲信号
    delay(8);
    PORTDbits.RD0=0;
    delay(72);
    从上面的程序可知,通过改变delay 函数的形参j,可以根据需要,得到具有相应脉冲宽度和周期的脉冲信号。例如,改变以上程序段的1 至4 行为:
    PORTDbits.RD0=1;
    delay(4);
    PORTDbits.RD0=0;
    delay(76);
    得到输出脉冲宽度为1ms,周期为20ms 的脉冲信号,然后借助for 循环,将能得到所需要的周期性脉冲信号,驱动舵机输出轴达到-90°到90° 之间的转角。
    3.2.2 多舵机不同角度的控制:
    通过多舵机不同角度的控制,可以控制几个舵机同时向不同角度扭转,以达到预期的控制目的。
    具体的实现方法是:在定时器延时函数中设定一个计时值t(在程序中t 在初始化时值为0),使t 在每次定时器计时完毕时加1。例如,定时器一周期的定时时间为0.25ms,则t值每加1 就相当于0.25ms。当t 的代表值达到20ms 也就是当t 等于80 时清零,这样就可以将脉冲周期控制在20ms,再通过使用if 语句查询方式,可以调节同一周期脉冲的脉冲宽度,即能使多舵机同时向不同角度旋转。
    程序示例:(晶振为:4MHZ,脉冲从PORTDbits.RD0,PORTDbits.RD1,PORTDbits.RD2三个端口中输出)
    if(t=0) //端口初始化
    {
        PORTDbits.RD0=1
        PORTDbits.RD1=1
        PORTDbits.RD2=1
    }
    INTCONbits.TMR0IF=0; //清TMR0 中断标志位
    T0CON=0XCF; //设定TMR0L 工作于8 位定时器方式、内部时钟、TMR0不用分频
    TMR0L=0X14; //设定TMR0 每0.25ms 产生一次中断
    L1: if(INTCONbits.TMR0IF==1)
    {
        INTCONbits.TMR0IF==0; //清TMR0 中断标志位,关计时器
        T0CON=0X4F;
        t++
    }
    else goto L1;
    if(t=4)
        PORTDbits.RD0=0; //脉冲宽度为:1ms
    else if(t=6)
        PORTDbits.RD1=0; //脉冲宽度为:1.5ms
    else if(t=8)
        PORTDbits.RD2=0; //脉冲宽度为:2ms
    else(t=80)
        t=0; //脉冲周期为:0.25ms*80=20ms