舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
舵机是一种俗称,其实是一种伺服马达。可以旋转到 0 到 180 度之间的任何角度,然后根据您的指令精确停止,因此适用于需要角度变化和保持的控制系统。舵机是一个不专业的名称,实际上它是一种伺服电机,一套自动控制装置,由直流电机,减速齿轮组,传感器和控制电路组成。 什么是自动控制? 所谓的自动控制 - 通过使用闭环反馈控制电路不断调整输出偏差 - 使系统输出恒定。
舵机是一种伺服马达,在0到180度之间进行旋转。英文名为micro servo。
舵机控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为 0,电机停止转动。舵机具有最大旋转角度,中间位置是指从该位置到最小角度的体积,并且最大角度完全相同。 最重要的部分,最大旋转角度随着不同的转向齿轮而变化,但中间位置的带宽是确定的,即 1.5 毫秒。
有一个基准电路,产生周期为 20ms,宽度为 1.5ms 的基准信号,与输入信号进行对比,正负决定正反转。
舵机的控制一般需要一个 20ms 左右的时基脉冲,该脉冲的高电平部分一般为 0.5ms~2.5ms 范围内的角度控制脉冲部分。以 180 度角度伺服为例,那么对应的控制关系是这样的:
⚫ 0.5ms--------------0 度;
⚫ 1.0ms------------45 度;
⚫ 1.5ms------------90 度;
⚫ 2.0ms-----------135 度;
⚫ 2.5ms-----------180 度
旋转角度由来自控制线的连续脉冲产生。 该方法称为脉冲调制。 脉冲长度决定了转向器的旋转角度。
当舵机接收到小于 1.5ms 的脉冲时,输出轴将作为标准中间位置,逆时针旋转一定角度; 当接收
脉冲大于 1.5ms 时,输出轴顺时针旋转。 不同品牌的转向器,甚至同一品牌的不同转向器,最大值和最小值可能不同。
舵机的旋转由脉冲来控制。对于数字和模拟的舵机来说,其控制方式还有些区别
一般来说,舵机由三根线进行控制,电源线,地线,信号线,实际上舵机的只由信号线进行控制。
红色线是电源线,棕色线是底线,橙色线是信号线。
接线方式如下:
代码:
其实就是使用io空输出一个0.5ms到2.5ms的周期为20ms的脉冲,但是总感觉控制不太准确,可能是io模拟的原因。
映射关系:
时间(ms) | 角度(°) |
---|---|
0.5 | 0 |
1.0 | 45 |
1.5 | 90 |
2.0 | 135 |
2.5 | 180 |
#include
#include
#include
#include
int cyc = 20000;
int pwmPin = 28;
int value;
/**
* @brief 将0~180°映射到0.5ms到2.5ms的一次脉冲(周期为20ms)
*
* @param temp
*/
void pwm_fun(int temp)
{
digitalWrite(pwmPin, HIGH);
delayMicroseconds(500 + temp * 500 / 45);
digitalWrite(pwmPin, 0);
delayMicroseconds((cyc - (500 + temp * 500 / 45)));
}
int main()
{
wiringPiSetup();
pinMode(pwmPin, OUTPUT);
for (int i = 0; i <= 180; i += 10)
{
pwm_fun(i);
}
int angle;
while (1)
{
printf("Please the angle of spin [0,180]:\n");
scanf("%d",&angle);
printf("The angle is %d\n",angle);
pwm_fun(angle);
}
}
我手中的这个SG90是模拟的、360°的,只能控制它的旋转速度和方向。也就是说在工作范围内(0.5-2.5),当脉冲在中间值1.5ms的时候是停止的,中间值两边旋转的方向不一样,和中间值的差值越大,旋转速度越快(或者说一次脉冲的旋转方向越大)。
还有一个数字的mg90s,是180°的,这个时侯的脉冲相当于直接控制舵机的角度,如0.5ms的脉冲控制舵机转到0°位置,2.5ms的脉冲控制舵机转到180°位置,这个数字的只需要一次脉冲就可以。