本文章学习借鉴于野火团队资料,以表感谢。官网http://products.embedfire.com/
舵机的原理与应用。
有一种电机可以在程序的控制下,在一定范围内连续改变输出轴角度并且可以保持住。这种电机最早被用在航模和船模等遥控模型中,控制各种舵面的转动,这就是舵机。现在舵机除了运用在遥控模型中,也大量的运用在各种机器人、机械臂的关节以及智能小车的转向机构中。下图就是一种标准舵机的外形。
按照舵机的控制电路可以分为:
1、模拟舵机
2、数字舵机
模拟舵机和数字舵机的机械结构可以说是完全相同的,模拟舵机的控制电路为纯模拟电路,需要一直发送目标信号,才能转到指定的位置,响应速度较慢,无反应区较大;数字舵机内部控制电路则加上了微控制器,只需要发送一次目标信号,即可到达指定位置,速度比模拟舵机更快,无反应区也更小。
按照使用对象的不同可以分为:
航模舵机、车模舵机、船模舵机和机器人舵机。
航模舵机一般要求速度快、精度高,而车模和船模用的舵机一般要求具有大扭矩和防水性好。
按照内部机械材质,又可分成:
塑料齿舵机和金属齿舵机。塑料齿舵机内部的传动齿轮是
塑料的,重量轻价格便宜,但是扭矩一般较小无法做大;金属齿舵机的扭矩更大,舵机更
结实耐用,但是相比塑料齿更重也更贵。
按照外部接口和舵机的控制方式,又可分为:
PWM 舵机和串行总线舵机。
舵机的分类根据应用场景的不同可以划分开来。
舵机主要由以下几个部分组成:外壳、舵盘、直流电机、减速齿轮组、角度传感器、控制驱动电路和接口线缆等。常见的舵机内部结构如下图所示。
其中角度传感器负责舵机的位置反馈,直接装在舵机的主输出轴上,将轴旋转后产生的角度变化变成电压信号发回控制电路,当前轴角度;控制驱动电路用来接收外部接口传来的信号和角度传感器反馈的电压值,以及驱动直流电机旋转;减速齿轮组则是降低直流电机的转速并且放大扭矩。
模拟舵机和数字舵机内部电路不同,所以原理上稍有差别,这里以模拟舵机进行讲解。模拟舵机内部的控制驱动电路板从外界接收控制信号,经过处理后变为一个直流偏置电压,在控制板内部有一个基准电压,这个基准电压由电位器产生并反馈到控制板。将外部获得的直流偏置电压与电位器的电压进行比较获得电压差,并输出到电机驱动芯片驱动电机,电压差的正负决定电机的正反转,大小决定旋转的角度,电压差为 0 时,电机停止转动。大致原理框图如下图所示。
从图中可以看到,舵机内部是闭环控制的,所以这一类电机实际上是一种位置(角度)伺服的简化版伺服电机,将工业伺服电机的三闭环控制简化成了只有一个位置闭环。舵机这个名字是国内起的一种俗称,本质上属于伺服电机,它的英文就直接叫 Servo,或者 RC Servo。
舵机的输入有三根线,一般的中间的红色线为电源正极,咖啡色线的为电源负极,黄色色线为控制线号线。如下图所示。
舵机的控制通常采用 PWM 信号,例如需要一个周期为 20ms 的脉冲宽度调制(PWM),脉冲宽度部分一般为 0.5ms-2.5ms 范围内的角度控制脉冲部分,总间隔为 2ms。当脉冲宽度为 1.5ms 时,舵机旋转至中间角度,大于 1.5ms 时舵机旋转角度增大,小于 1.5ms 时舵机旋转角度减小。舵机分 90°、180°、270° 和 360° 舵机,以 180° 的舵机为例来看看脉冲宽度与角度的关系,见下图所示。
20ms 周期 频率为50hz
舵机速度的单位是 sec/60°,就是舵机转过 60° 需要的时间,如果控制脉冲变化宽度大,变化速度快,舵机就有可能在一次脉冲的变化过程中还没有转到目标角度时,而脉冲就再次发生了变化,舵机的转动速度一般有 0.16sec/60°、0.12sec/60° 等,0.16sec/60° 就是舵机转动 60° 需要 0.16 秒的时间。舵机的速度还有工作电压有关,在允许的电压范围内,电压越大速度越快,反之亦然。
舵机扭矩的单位是 KG*CM,这是一个扭矩的单位,可以理解为在舵盘上距离舵机轴中心水平距离 1CM 处,舵机能够带动的物体重量,如下图所示。
通常说的 55g 舵机、9g 舵机等,这里的 55g 和 9g 指的是舵机本身的重量。
根据选择的 IO 口选择使用的定时器 (定时器 IO 配置)
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//PWM输出管脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM模式配置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
TIM_SetCompare1(TIM3,150); //设置舵机占空比,控制舵机转动
TIM_SetCompare2(TIM3,150); //设置舵机占空比,控制舵机转动
了解舵机的分类以及选择舵机,舵机的工作原理以及使用方法,控制代码程序的编写