文章目录
- 一、sg90简介
- 二、引脚连接
- 三、控制方法
- 四、程序设计
- 4.1 配置定时器
- 4.2 编写控制程序
- 五、360°舵机
一、sg90简介
首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。
舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
二、引脚连接
sg90有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。通常使用5V供电,信号线接单片机引脚,用老来接收单片机发送的PWM。
三、控制方法
控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。高电平持续时间与旋转角度的对应关系如下
高电平持续时间/ms | 舵机角度/° |
---|---|
0.5 | 0 |
1.0 | 45 |
1.5 | 90 |
2.0 | 135 |
2.5 | 180 |
四、程序设计
这里以180°的sg90,来展示一下程序设计
4.1 配置定时器
要使用sg90,首先要配置定时器,产生PWM。关于定时器和PWM相关知识,可以看博主STM32速成笔记定时器篇,这里就不再做详细介绍了。上面说,控制sg90需要一个20ms左右的脉冲,也就是说PWM的周期为20ms左右。计算一下可以知道,配置定时器时,预分频系数设置为7199,自动重装载值设置为200。我们初始化TIM3的通道1来控制sg90。PWM引输出脚映射到PC6。初始化程序如下
/*
*==============================================================================
*函数名称:TIM3_CH1_PWM_Init
*函数功能:初始化定时器3的PWM通道1
*输入参数:per:自动重装载值;psc:预分频系数
*返回值:无
*备 注:无
*==============================================================================
*/
void TIM3_CH1_PWM_Init (u16 per,u16 psc)
{
// 结构体定义
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
// 初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE); // 改变指定管脚的映射
// 初始化定时器参数
TIM_TimeBaseInitStructure.TIM_Period = per; // 自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
// 初始化PWM参数
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 比较输出模式
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 输出极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OC1Init(TIM3,&TIM_OCInitStructure); // 输出比较通道1初始化
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); // 使能TIMx在 CCR1 上的预装载寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE); // 使能预装载寄存器
TIM_Cmd(TIM3,ENABLE); // 使能定时器
}
初始化时,程序如下
TIM3_CH1_PWM_Init(200,7199); // 初始化TIM3 PWM1
4.2 编写控制程序
根据高电平持续时间与角度关系对应表格来编写sg90的控制程序
while(1)
{
TIM_SetCompare1(TIM3,195); // 旋转到0°
delay_ms(500);
TIM_SetCompare1(TIM3,190); // 旋转到45°
delay_ms(500);
TIM_SetCompare1(TIM3,185); // 旋转到90°
delay_ms(500);
TIM_SetCompare1(TIM3,180); // 旋转到135°
delay_ms(500);
TIM_SetCompare1(TIM3,175); // 旋转到180°
delay_ms(500);
}
五、360°舵机
除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下
高电平持续时间/ms | 舵机转向和转速 |
---|---|
0.5~1.5 | 正转,速度越来越慢 |
1.5 | 停止 |
1.5~2.5 | 反转,速度越来越快 |