当前位置: 首页 > news >正文

stm32:sg90 和 mg90s舵机学习

早上好啊,大伙。这一期咱们来看看两个舵机,它们的工作模式是不同的,但是都是舵机,实现的原理是一样的,所以放一起讲一下。(工程链接在文章最后)

请添加图片描述

文章目录

  • 整体说明
    • 相同点
    • 不同点
  • sg90舵机
    • 基本介绍
    • 实现原理
    • 工作流程
    • 控制方法
        • 注意接线的时候 stm32 和 舵机要共地,否则会没有效果。
    • 代码实现
    • 实现效果
  • MG90s
    • 控制方式
    • 接线
    • 代码实现
    • 实现效果
  • 结尾
  • 感谢大伙观看,别忘了三连支持一下
  • 大家也可以关注一下我的其它专栏,同样精彩喔~
  • 下期见咯~

整体说明

相同点

供电电压 : 5V左右
三根线 —— 红(VCC)、棕(GND)、黄(信号)

不同点

sg90 --> PWM控制 指定角度 旋转
mg90s --> PWM控制 转动方向转动角度

sg90舵机

首先是这个小蓝 —— sg90。
也就是长这样vvv
在这里插入图片描述

基本介绍

SG90 是一款常见的微型舵机(伺服电机),因其体积小、价格低、易于控制等特点,广泛应用于电子制作、机器人、模型遥控等领域。

尺寸:约 22.2 × 11.8 × 31mm(长×宽×高)
重量:约 9g
工作电压:3.0V - 6.0V(推荐 4.8V-5V
扭矩:
4.8V 时约 1.2kg·cm
6.0V 时约 1.6kg·cm
转动角度:0° - 180°(部分型号支持 360° 连续旋转)
响应速度:约 0.1秒/60°(4.8V 时)
齿轮材质:塑料(部分型号为金属齿轮,更耐用)

它有三个接口也就是三根线 —— 信号线、电源正极、地线

红色线 —— 电源线(VCC)
棕色线 —— 地线 (GND)
黄色线 —— 信号线

在这里插入图片描述

实现原理

舵机是一种根据输入PWM信号占空比来控制输出角度的装置输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms。
下面是它的一个解剖图 ——
在这里插入图片描述

SG90 舵机由以下组件构成:

直流电机:提供动力。
减速齿轮组:降低转速、增加扭矩。
控制电路:接收 PWM 信号并控制电机。
电位器(反馈传感器):检测舵机当前位置,形成闭环控制。

工作流程

接收外部 PWM(脉冲宽度调制)信号,控制电路根据脉冲宽度调整电机转动方向及角度,电位器实时反馈位置,确保精准控制。

控制方法

控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。
高电平持续时间与旋转角度的对应关系如下 ——

高电平持续时间/ms舵机角度/°
0.50
1.045
1.590
2.0135
2.5180
注意接线的时候 stm32 和 舵机要共地,否则会没有效果。

代码实现

下面代码是一个定时器控制四路舵机的代码 ——
这里就只放一些关键的地方,需要完整代码的可以直接去下载。

Sg90.c

void Sg90_Init(void)
{
	PWM_Init();
}

void Sg90_Reset(void)
{
	PWM_SetCompare1(500);
	PWM_SetCompare2(500);
	PWM_SetCompare3(500);
	PWM_SetCompare4(500);
}

void Sg90_SetAngle1(float Angle)
{
	PWM_SetCompare1(Angle / 180 * 2000 + 500);
	
}
void Sg90_SetAngle2(float Angle)
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
	
}
void Sg90_SetAngle3(float Angle)
{
	PWM_SetCompare3(Angle / 180 * 2000 + 500);
	
}
void Sg90_SetAngle4(float Angle)
{
	PWM_SetCompare4(Angle / 180 * 2000 + 500);
	
}

Timer.c 时基单元配置

	/*时基单元初始化*/
	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_TimeBaseInit,配置TIM2的时基单元	

实现效果

这里放了OC1 和 OC4的效果,其它的大家可以自己看看效果。

sg90演示视频1

sg90演示视频2

MG90s

下面对MG90s的介绍主要就说一下他们的不同点。

控制方式

mg90s是不能控制转动的角度,因此它的占空比是用来控制舵机转动的速度和方向。

脉冲周砌(20ms)速度
0.5ms
1.0ms
1.5ms停止
2.0ms
2.5ms

1.5ms是一个分界线,方向会在再此发送改变,距离1.5ms这个阈值越近,舵机转动速度越慢,反之越快。但上限2.5ms 下限是0.5ms ,超过阈值舵机将不工作。

接线

这个比较重要,虽然和sg90一样但也说一下。
它也有三个接口也就是三根线 —— 信号线、电源正极、地线

红色线 —— 电源线(VCC)
棕色线 —— 地线 (GND)
黄色线 —— 信号线

电源在 3 ~ 6V,不能超过6V,会烧掉的,最好是在5V左右,3V可能转不起来。

代码实现

Mg90s.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Mg90s_Init(void)
{
	PWM_Init();
}

void Mg90s_Stop(void)
{
	PWM_SetCompare1(1500);
	PWM_SetCompare2(1500);
	PWM_SetCompare3(1500);
	PWM_SetCompare4(1500);
}

//如果 speed 为 0 就是 stop

//顺时针
//speed 为速度,分为10个等级(1 - 10)
void Mg90s_1_Clockwise(int speed)
{
	PWM_SetCompare1(speed *100 + 1500);
}

void Mg90s_2_Clockwise(int speed)
{
	PWM_SetCompare2(speed *100 + 1500);
}

void Mg90s_3_Clockwise(int speed)
{
	PWM_SetCompare3(speed *100 + 1500);
}

void Mg90s_4_Clockwise(int speed)
{
	PWM_SetCompare4(speed *100 + 1500);
}


//顺时针
//speed 为速度,分为10个等级(1 - 10)
void Mg90s_1_Anticlockwise(int speed)
{
	PWM_SetCompare1(1500 - speed *100);
}

void Mg90s_2_Anticlockwise(int speed)
{
	PWM_SetCompare2(1500 - speed *100);
}

void Mg90s_3_Anticlockwise(int speed)
{
	PWM_SetCompare3(1500 - speed *100);
}

void Mg90s_4_Anticlockwise(int speed)
{
	PWM_SetCompare4(1500 - speed *100);
}

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "Mg90s.h"

int main()
{
	Mg90s_Init();
	
	while (1)
	{
		Mg90s_1_Clockwise(5);
		Delay_s(2);
		Mg90s_Stop();
		Delay_s(2);
		
		Mg90s_1_Anticlockwise(5);
		Delay_s(2);
		Mg90s_1_Clockwise(0); //相当于 Mg90s_Stop()
		Delay_s(2);
	}
}

实现效果

mg90s演示视频

结尾

先给代码:
链接:小白兔的礼物——舵机代码
提取码:pPYN

OKK,这一期的内容就这么多,主要是说了一些舵机的内容。

感谢大伙观看,别忘了三连支持一下

大家也可以关注一下我的其它专栏,同样精彩喔~

下期见咯~

请添加图片描述

http://www.dtcms.com/a/108455.html

相关文章:

  • Python----计算机视觉处理(Opencv:道路检测之提取车道线)
  • 好玩有趣的github开源项目分享(持续更新)
  • 【MySQL基础】 JSON函数入门
  • 代码随想录-动态规划18
  • 如何学习C++以及C++的宏观认知
  • AI:机器学习模型-线性回归
  • 清华大学:网络大模型NetGPT研究进展(2025)
  • 深入解析JavaScript混淆加密与Python逆向调用实战-题八
  • 蓝桥杯-算法基础-For循环
  • [CISSP] [5] 保护资产安全
  • Mybatis 如何自定义缓存?
  • UML 关系探秘:理论与实践双维度剖析
  • Cesium for Unreal 源码编译
  • php开发rest api,哪个框架最好
  • C# 窗体应用(.FET Framework) 与 visionpro 连接
  • Unity Final IK:下一代角色动画与物理交互的技术解析
  • 合合信息TextIn大模型加速器2.0:图表解析能力的横向测评
  • Ansible(1)—— Ansible 概述
  • Spring常见题
  • Go语言学习(15)结构体标签与反射机制
  • ES6(8) Fetch API 详解
  • C#:base 关键字
  • 铂卡梭 智能羽翼 AI 系统:交易科技的未来引擎
  • php8 match表达式使用教程
  • 软件重构与项目进度的矛盾如何解决
  • Node.js全局生效的中间件
  • pytorch中Dropout
  • Vue + Scss项目中实现自定义颜色主题的动态切换
  • 深入解析Translog机制:Elasticsearch的数据守护者
  • MySQL 服务基础介绍