前言

舵机——能通过不同的程序设计,来旋转不同的角度,他不同与普通的电机,只能在通电时按照一定的速度旋转,而舵机的功能不是循环旋转,只是旋转一定的角度,通过舵盘旋转的角度,从而带动外部的机械结构,我们可以用于小车的方向控制,机器人的手臂控制等

——————————————————-

舵机的基本工作原理

蓝色部分是舵机的主机,红色部分是舵盘,橙色箭头表示舵盘所在的角度

PWM也就是波形输入,单片机需要通过IO端口在这条线上输入一个固定的波形,通过波形来让舵机旋转一定角度

VCC(5V) GND(-)

 

 两个波都是以 20ms 为一个周期,但是他们因为所处在高电平的时间不同,让他们旋转角度不同(0~180)

————————————

但是需要注意下面几点

 ————————————————————————————————————

利用 delay 函数进行驱动

!正常情况下,舵机是利用PWM信号进行驱动的,但是我们在学习的开始,就先使用延时函数进行学习,之后进行用PWM进行说明

在驱动舵机里,我们新加了两个函数

SG90_Init();
SG90_angle(0);

接下来是主循环里的函数,我们通过按键来控制旋转角度

if(!GPIOReadInputDataBit(GPIOA,key0))
{
OLEDShowchar(1,1,Angle 45,7);
SG90_angle(45);
}
//也就是按键0按下后,舵机旋转45°

我们就要看看我们所新加的两个函数是怎么用的了

void SG90_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //LED0-->PA.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA.8
 GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(0));         //设置好后,端口保持低电平状态
}

接下来是舵机的角度控制

void SG90_angle(u8 a)
{
u8 b = 100;//角度偏移量
GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1));
delay_us(500+a*10+b);
GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(0));
delay_us(19500-a*10-b);
}
//延时考验的是一个计算

我们的时间是从 5ms 开始,然后把每一个角度对应到我们的微秒,再和我们的角度偏移量进行计算,就可以得到我们所要的角度

——————————————————————————————————

PWM 舵机驱动

在前面我们已经学过了PWM(TIM定时器)

我们在这注意我们所设置的预分频值就可以确定我们PWM的周期

TIMX_PWM_Init(59999,23);

在主循环里,依然是判断按键,但是不同的是,SG90_angle被我们替换成了比较PWM的函数

if(!GPIOReadInputDataBit(GPIOA,key0))
{
OLEDShowchar(1,1,Angle 45,7);
TIM_SetCompareX(TIMX,3000);
//1500 0° 3000 45° 4500 90° 这样类推
}

而对PWM的说明,前面也已经说过,这里我们设置为 PWM模式1,有效为高电平就可以了

物联沃分享整理
物联沃-IOTWORD物联网 » STM32——舵机驱动

发表评论