这一篇我要先写sg90这篇,因为比hsr04简单。总体的介绍思路是:实物讲解、模块原理、代码详解
1、实物讲解
首先我们先来看sg90的样子:
然后再看看它的接线,买过来的sg90舵机模块引出来了三根线,分别为黄色、红色、棕色,他们分别为信号线、3.3V电源线和地线,接的时候要注意,不要接错了。
2、模块原理
1、其实舵机可以分为两种,一种是模拟舵机,一种是数字舵机,这两者的区别是:模拟舵机需要一直给与要转的角度命令,直到到自己想要的角度,注意这个给定的时间许多不许少,就像是小孩子一样,你要不断的给与鼓励和奖赏,才会达到自己的要求;而数字舵机是只需要给定一次角度命令就行了,就像是长大了的孩子,你可以把事情很放心的交给他,说一次就好。
2、说了半天,那么角度命令是什么呢?其实就是我们熟悉的pwm信号,下面给出占空比与旋转的角度之间的关系:
高电平 | 低电平 | 旋转角度 |
---|---|---|
0.5ms | 19.5ms | -90度 |
1.0ms | 19ms | -45度 |
1.5ms | 18.5ms | 0度 |
2.0ms | 18ms | 45度 |
2.5ms | 17.5ms | 90度 |
我要对这个表格做一些说明:
1)、高电平加上低电平等于 20ms,那是因为要求的pwm频率是50hz,1s/50 = 20ms,所以周期就是20ms。
2)、角度怎么看,想象自己站在xy轴的0坐标上,正对着y轴,y轴就是0度。负度在左手边,正度在右手边。
3)、其实低电平的时间并没有那么死板,只要在0.5ms和20ms之间就可以。
3、代码详解
我使用的是野火指南者开发板,黄色信号线连接的是pb8。
先来看gpio配置,配置为推挽输出模式
void SG90_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( SG90_GPIO_CLK , ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = SG90_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(SG90_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
}
接着是主函数里的代码,我实现的功能是先0度,在-90度,在90度旋转。
int main(void)
{
int i;
/* LED 端口初始化 */
LED_GPIO_Config();
/* 配置SysTick 为10us中断一次 */
SysTick_Init();
SG90_GPIO_Config();
i = 0;
{
//舵机的左转,50,1950 舵机的正向 130,1860 舵机的右转 230,1750
//舵机的正向
for(;i<35;i++)
{
GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(130);//延时一毫秒
GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(1860);//延时一毫秒
}
i= 0;
// //舵机的左转
for(;i<30;i++)
{
GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(50);//延时一毫秒
GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(1950);//延时一毫秒
}
//
i = 0;
//舵机的右转
for(;i<30;i++)
{
GPIO_SetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(230);//延时一毫秒
GPIO_ResetBits(SG90_GPIO_PORT, SG90_GPIO_PIN);
Delay_us(1860);//延时一毫秒
}
//
}
}
附上代码包链接快上车
打完收工。。。。。。