首页 > 其他分享 >SG90舵机介绍与PWM驱动代码

SG90舵机介绍与PWM驱动代码

时间:2024-07-14 11:25:47浏览次数:19  
标签:Servo 舵机 TIM 180 GPIO PWM SG90

目录

舵机简介

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博客

标签:Servo,舵机,TIM,180,GPIO,PWM,SG90
From: https://blog.csdn.net/m0_75090944/article/details/140412467

相关文章

  • Linux下PWM子系统
    1pwm子系统框架内核态分为:pwmcore:pwm_chip的添加删除,pwm_class类pwm_chip/pwm_device的sysfs创建。pwmdriver:pwm_chip对象实例,注册添加到pwmcore。 pwm_chip可以包含一个或多个pwm_device,每个pwm_device通过设置不同pwm_state来达到目的。1.1源码结构drivers/pwm/......
  • stm32f429i-Disc PWM生成 + 输入捕获测频率与占空比
    产生PWMvoidMy_PWM_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); GPIO_InitTypeDefGPIO_InitStructure; GPIO_InitStru......
  • 树莓派4B-PCA9685驱动舵机
    前言不知道你们有没有遇到过这么一种情况,直接用树莓派的引脚输出PWM控制舵机,舵机是会出现抖动的。就算代码进行一定的时延迟优化还是会有影响的。现在我们可以使用PCA9685这个模块去驱动舵机。PCA9685是一种常用的PWM(脉冲宽度调制)驱动器芯片,通常用于控制舵机、电机和其他需要......
  • Linux驱动之利用STM32、设备树、pwm子系统实现风扇的分级调控
    Linux驱动之利用STM32、设备树、pwm子系统实现风扇的分级调控系统:Linux5.10.61开发板:STM32mp157a硬件:风扇一、首先我们需要对PWM和定时器(TIM)的联系简单的做一下了解,具体详细的PWM原理可见PWM原理PWM频率与占空比详解。​PWM(脉宽调制)和TIM(定时器)在嵌入式系统中有着......
  • 零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频
    文章目录一.概要二.PWM输入框架图三.CubeMX配置一个PWM输入例程1.硬件准备2.创建工程3.调试四.CubeMX工程源代码下载五.讲解视频链接地址六.小结一.概要脉冲宽度调制(PWM),是英文“PulseWidthModulation”的缩写,简称脉宽调制,是利用单片机数字输出(1或0)来对外部模拟......
  • TMS320F28377D学习日志:day4基于ePWM的呼吸灯
    文章目录前言一、TMS320F28377D的ePWM介绍1.1PWM的复用引脚1.2PWM模块的组成1.3TB模块1.4CC模块1.5AQ模块二、程序介绍前言28377D具有24路PWM输出引脚,14路高分辨率的HRPWM。ePWM是对PWM的加强型。其中一个ePWM通道有2个PWM输出引脚EPWMxA、EPWMxB,可以用于配置......
  • WS2812b彩灯(DMA+PWM)
    一.WS2812B简介        WS2812B是一种数字可编程的LED灯条,可以使用单个数据线进行通讯控制LED灯的颜色和亮度。每个WS2812B都有一个唯一的地址,可以通过单个数据线进行级联。二.WS2812B参数简介 三.WS2812B数据通讯简介 1.级联电路2.数据传输    ......
  • 树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi)本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询:​​ Python版本3.7.3:​​ IIC驱动_PCA9685(16路舵机驱动模块)文章提供测试代码讲解,整体代码贴出、测试效果图目录 开启树......
  • 基于STM32F103C8T6的同步电机驱动-PWM驱动代码以及SVPWM的实现
    基于STM32F103C8T6的同步电机驱动-PWM驱动代码以及SVPWM的实现本系列文章:基于STM32F103C8T6的同步电机驱动-CubeMX配置与IQmath调用基于STM32F103C8T6的同步电机驱动-PWM驱动代码以及SVPWM的实现一、PWM驱动代码的编写在系列文章的第一篇中已经对主定时器TIM1进行了P......
  • STM32-PWM配置流程及作用
    STM32F407ZET6单片机配置PWM(脉冲宽度调制)PWM配置流程STM32F407ZET6单片机配置PWM的流程通常包括以下几个步骤:时钟使能:首先,需要使能定时器和相关IO口的时钟。这通常通过调用RCC(ResetandClockControl)相关的函数来实现,比如RCC_APB1PeriphClockCmd()用于使能APB1总线上的定时......