对模拟舵机的驱动很感兴趣,于是想用迷你麒麟座学习控制,并和大家分享一下,用的舵机是SG90
想要驱动这款舵机就要先了解它的相关参数和控制方式
首先看看这款舵机的相关参数
1.重量:9g
2.尺寸:23x12.2x29mm
3.无负载操作速度:0.12秒/60度(4.8V);0.10秒/60度(6.0V)
4.扭矩:1.6kg·cm(4.8V)
5.使用温度:-30~+60摄氏度
6.死区设定:5微秒
7.工作电压:3.5V~6V
8.附件:三种功能舵角、固定螺钉,线长 25CM
橙色信号线
红色正极
棕色负极
(技术参数参考链接
https://wenku.baidu.com/view/b746f2d59ec3d5bbfd0a7453.html)
从参数我们可以知道这款舵机可以用5V电源供电,但这里要注意两个接线原则
1.舵机要单独供电
2.舵机的电源和控制信号要共地
第一点是从电流大小考虑的,第二点则是数字电路的基础,这两个原则对于初学者来说很容易被忽略,从而导致舵机控制不成功
然后看看舵机的控制,sg90需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
信号脉冲与角度的对应关系:
0.5ms-------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
引用一张比较形象的图
知道信号脉冲与角度的对应关系后就可以开始编程了
SG90是一款模拟舵机 要不断地给它输入信号才能稳定运转 所以要到PWM
void SG90_Init(void)
//PWM初始化 使用TIM2定时器通道1 对应IO口为PA0
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PWM信号电平跳变值 */
/*PCLK1经过2倍频后作为TIM2的时钟源等于72MHz*/ // /72mhz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 20000-1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //设置预分频:72/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置为PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low; //当定时器计数值小于CCR1时为高电平
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
/* TIM3 enable counter */
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
void SG90Run(u8 angle)
//输入角度控制舵机 舵机将运转到指定角度 角度输入范围0-180
{
TIM_SetCompare1(TIM2,11.111111*angle+500);
}
最后说说舵机和伺服电机的关系
伺服电机有个很重要的特点 就是闭环控制 而舵机其实也就是伺服电机的一种 简单地说 舵机=伺服电机+变速齿轮
对模拟舵机的驱动很感兴趣,于是想用迷你麒麟座学习控制,并和大家分享一下,用的舵机是SG90
想要驱动这款舵机就要先了解它的相关参数和控制方式
首先看看这款舵机的相关参数
1.重量:9g
2.尺寸:23x12.2x29mm
3.无负载操作速度:0.12秒/60度(4.8V);0.10秒/60度(6.0V)
4.扭矩:1.6kg·cm(4.8V)
5.使用温度:-30~+60摄氏度
6.死区设定:5微秒
7.工作电压:3.5V~6V
8.附件:三种功能舵角、固定螺钉,线长 25CM
橙色信号线
红色正极
棕色负极
(技术参数参考链接
https://wenku.baidu.com/view/b746f2d59ec3d5bbfd0a7453.html)
从参数我们可以知道这款舵机可以用5V电源供电,但这里要注意两个接线原则
1.舵机要单独供电
2.舵机的电源和控制信号要共地
第一点是从电流大小考虑的,第二点则是数字电路的基础,这两个原则对于初学者来说很容易被忽略,从而导致舵机控制不成功
然后看看舵机的控制,sg90需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
信号脉冲与角度的对应关系:
0.5ms-------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
引用一张比较形象的图
知道信号脉冲与角度的对应关系后就可以开始编程了
SG90是一款模拟舵机 要不断地给它输入信号才能稳定运转 所以要到PWM
void SG90_Init(void)
//PWM初始化 使用TIM2定时器通道1 对应IO口为PA0
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PWM信号电平跳变值 */
/*PCLK1经过2倍频后作为TIM2的时钟源等于72MHz*/ // /72mhz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 20000-1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //设置预分频:72/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置为PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low; //当定时器计数值小于CCR1时为高电平
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
/* TIM3 enable counter */
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
void SG90Run(u8 angle)
//输入角度控制舵机 舵机将运转到指定角度 角度输入范围0-180
{
TIM_SetCompare1(TIM2,11.111111*angle+500);
}
最后说说舵机和伺服电机的关系
伺服电机有个很重要的特点 就是闭环控制 而舵机其实也就是伺服电机的一种 简单地说 舵机=伺服电机+变速齿轮