这一篇我要先写sg90这篇,因为比hsr04简单。总体的介绍思路是:实物讲解、模块原理、代码详解 1、实物讲解 首先我们先来看sg90的样子: 然后再看看它的接线,买过来的sg90舵机模块引出来了三根线,分别为黄色、红色、棕色,他们分别为信号线、3.3V电源线和地线,接的时候要注意,不要接错了。 2、模块原理 1、其实舵机可以分为两种,一种是模拟舵机,一种是数字舵机,这两者的区别是:模拟舵机需要一直给与要转的角度命令,直到到自己想要的角度,注意这个给定的时间许多不许少,就像是小孩子一样,你要不断的给与鼓励和奖赏,才会达到自己的要求;而数字舵机是只需要给定一次角度命令就行了,就像是长大了的孩子,你可以把事情很放心的交给他,说一次就好。 2、说了半天,那么角度命令是什么呢?其实就是我们熟悉的pwm信号,下面给出占空比与旋转的角度之间的关系:
高电平低电平旋转角度0.5ms19.5ms-90度1.0ms19ms-45度1.5ms18.5ms0度2.0ms18ms45度2.5ms17.5ms90度
我要对这个表格做一些说明: 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 |