SG90舵机介绍与PWM驱动代码

目录

舵机简介

SG90参数

工作原理

舵机接线

驱动方式

代码示例

Servo.h

Servo.c

main.c

360°舵机PWM控制


以180°SG90舵机为例学习舵机

舵机简介

 SG90舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。

伺服(Servo)是ServoMechanism一词的简写,来源于希腊,其含义是奴隶,顾名思义,就是指系统跟随外部指令进行人们所期望的运动,而其中的运动要素包括位置、速度和力矩等物理量。

常见舵机有数字舵机和模拟舵机:

数字舵机主要由马达、减速齿轮、控制电路等组成,只需要发送一次PWM信号就能保持在规定的某个位置。

模拟舵机是相对于传统的舵机,是需要多次发送PWM信号才能够保持在规定的位置上,实现对舵机的控制,按照规定的要求进行的速度进行转动。

SG90参数

工作电压建议:5V

工作原理

舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

了解即可

舵机接线

棕色(图中黑色)接GND,红色接5V,橙色(图中黄色)接单片机IO口

驱动方式

舵机的控制信号为周期是 20ms的脉宽调制(PWM)信号,其中脉冲宽度从 0.5ms-2.5ms,相对应舵盘的位置为0-180 度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期 20ms,宽度 1.5ms 的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号

注意:运转时,舵机转到你指定的角度需要一定的时间,转动的角度越大,需要的时间越久,所以你可能需要等待一定的时间。如果你刚刚给舵机发送指令转到180度,紧接着又发送指令转到90度,舵机会不转到180度再转到90度,而是在接受到信号时直接在当前的角度直接转到90度去。

将-90°定义为0度,则图中角度都加90度

高电平持续时间/ms舵机角度/°
0.50
1.045
1.590
2.0135
2.5180

代码示例

定时器的输出比较产生周期20ms的PWM,然后根据角度找到对应的高电平时间,然后通过Servo_SetAngle()函数映射到对应占空比。

void Servo_SetAngle(float Angle)
{
    TIM_SetCompare1(TIM2,Angle / 180 * 2000 + 500);
}

Servo.h

#ifndef     _SERVO_H_
#define			_SERVO_H_

void Servo_Init(void);
void Servo_SetAngle(float Angle);
#endif

Servo.c

#include "stm32f10x.h"                  // Device header

void Servo_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}



void Servo_SetAngle(float Angle)
{
	TIM_SetCompare1(TIM2,Angle / 180 * 2000 + 500);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
float angle;
int main(void)
{
	OLED_Init();
	Servo_Init();	
	while (1)
	{
		OLED_ShowNum(1,1,angle,3);
		Servo_SetAngle(angle);
		angle+=30;
		if(angle>180)
		{
			angle=0;
		}
		Delay_ms(500);	
	}
}

360°舵机PWM控制

除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下

高电平持续时间/ms舵机转向和转速
0.5~1.5正转,速度越来越慢
1.5停止
1.5~2.5反转,速度越来越快

参考博客:

STM32外设系列—sg90(舵机)-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值