学习笔记12-SG90舵机
一、简介
舵机是一种位置(角度)伺服的驱动器,适用于需要角度不断变化并可以保持的控制系统,可以根据控制信号来输出指定的角度(常见的有0-90°、0-180°、0-360°)。
实质是一个伺服马达。又分为模拟舵机和数字舵机。
- 模拟舵机:需要不断发送目的地PWM信号,才能旋转到指定位置。(想转10°,要不断发送10°PWM信号直到指定位置才能停止)
- 数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。(想转10°,发送一次10°PWM信号就可以转到10°)
接线
红色----VCC
棕色----GND
橙色----信号线(连接到单片机输出PWM的引脚)
二、原理
舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分,对应控制180°舵机的0-180°,呈线性变化。
给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。
控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。
以180度角度伺服为例,那么对应的控制关系是这样的(t为高电平时间):
t=0.5ms(占空比2.5%)---------0°;
t=1.0ms(占空比5%)-----------45°;
t=1.5ms(占空比7.5%)---------90°;
t=2.0ms(占空比10%)---------135°;
t=2.5ms(占空比12.5%)-------180°;
即:高电平时间=0.5ms+(角度/180°)×2ms
3、代码段
根据PWM周期为20ms = (7200*200)/72000000=0.02。故TIM_Period=199
,TIM_Prescaler=7199
。
以转动45°为例,占空比为5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190。
以下是代码展示,仅供参考:
3.1、sg90.c
void TIM1_PWM_Init(void)//自动重装载值 预分频系数
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(SG90_TIM_CLK, ENABLE);// //使能定时器1的时钟
RCC_APB2PeriphClockCmd(SG90_GPIO_CLK , ENABLE); //使能GPIO外设时钟使能
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = SG90_Pin; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(SG90_Port, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(SG90_TIMx, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(SG90_TIMx, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_CtrlPWMOutputs(SG90_TIMx,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(SG90_TIMx, TIM_OCPreload_Enable); //CH1预装载使能 //使能输出比较预装载
TIM_ARRPreloadConfig(SG90_TIMx, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(SG90_TIMx, ENABLE); //使能TIM1
}
3.2、main.c
int main(void)
{
u16 pwmval;
DelayInit();
TIM1_PWM_Init();
while(1)
{
DelayMs(500);
pwmval=195; //0°
TIM_SetCompare1(TIM8,pwmval);
DelayMs(500);
pwmval=190; //45°
TIM_SetCompare1(TIM8,pwmval);
DelayMs(500);
pwmval=185; //90°
TIM_SetCompare1(TIM8,pwmval);
DelayMs(500);
pwmval=180; //135°
TIM_SetCompare1(TIM8,pwmval);
DelayMs(500);
pwmval=175; //180°
TIM_SetCompare1(TIM8,pwmval);
}
}
关于选择TIM_OCMode_PWM2等的原因,详见:TIM_OCMode_PWM2;TIM_OCMode_PWM1
参考自:
1、单片机——SG90舵机工作原理
2、STM32控制SG90舵机
3、SG90舵机