【STM32F103】PWM驱动舵机(SG90MG995)

news2024/11/15 23:34:37

PWM

关于如何发出PWM可以参考我之前的文章。

【STM32F103】TIM定时器&PWM-CSDN博客

SG90&MG995

以这两款舵机为例是因为我手上碰巧只有这两款舵机。不过实际上舵机的操作基本上差不了多少,基本上都是给频率为50Hz的PWM,然后就可以让舵机旋转不同角度。

下面是我截取自某宝卖家给的说明书的关于舵机的介绍

1.       什么是舵机:

    在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。

   舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。  

2.     其工作原理是:

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。当然我们可以不用去了解它的具体工作原理,知道它的控制原理就够了。就象我们使用晶体管一样,知道可以拿它来做开关管或放大管就行了,至于管内的电子具体怎么流动是可以完全不用去考虑的。

3.     舵机的控制:

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

我们只需要知道我们要操作舵机,那么就给它频率为50Hz,占空比大于等于2.5%并且小于等于12.5%的PWM就可以控制舵机旋转角度了。占空比越大旋转的角度越大。

一些电气参数什么的随便找个网店,商家都会贴出来。

简单来说就是SG90和MG995都是只能旋转180度,它们之间的区别就在于MG995更贵,MG995的扭矩以及旋转速度什么的更快,总之就是性能更好一点。

没什么可说的,那就简单测评一下吧。

SG90

SG90就长得这个样子,很小巧一个玩意儿。接出来三根线,黄色红色棕色。

一般来说红色接VCC,棕色接GND,黄色接PWM(一般来说的,具体还是要看商家)。

工作电压为:4.8-7.2V。我们一般接个5V就可以了。

运行速度为:0.3秒/60度

尺寸:23mmX12.2mmX29mm

重量:9克

扭矩:1.5kg/cm

当然,上面都是商家给的参数。

我们还是自己实测一下。

没给他通电的时候我们也是可以自己扭动它的。

SG90直接给它掰的话是可以掰差不多两百多度的。

然后不通电的时候扭动它用的力度差不多等于扭开一个已经开过的瓶盖,还是比较轻松的。

MG995

MG995长得这样样子,跟SG90相比属于是大块头了。

尺寸:40.7*19.7*42.9mm

重量 :66.2克

反应转速:无负载速度0.17秒/60度(4.8V);0.13秒/60度(6.0V)

工作电压;3.0V-7.2V。3V我试过了,基本上没有啥用,我们还是接5V即可。

工作扭矩:13KG/cm

测试发现最多可以掰差不多270度左右,但是它还是只能自己旋转180度。

掰动这个明显比掰动SG90要多费点力。差不多是扭开一瓶没开过的矿泉水瓶的程度。

STM32F103驱动代码

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

int main(void){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //打开TIM2的外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef gitd;
    gitd.GPIO_Mode=GPIO_Mode_AF_PP;                         //配置为复用推挽输出
    gitd.GPIO_Pin=GPIO_Pin_0;
    gitd.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOA,&gitd);
    
    TIM_InternalClockConfig(TIM2);                          //选择内部时钟(72MHz)作为时钟源
    TIM_TimeBaseInitTypeDef itd;
    itd.TIM_ClockDivision=TIM_CKD_DIV1;                     //时钟1分频
    itd.TIM_CounterMode=TIM_CounterMode_Up;                 //向上计数模式
    itd.TIM_Period=1000-1;                                   //设置自动重装器的值
    itd.TIM_Prescaler=1440-1;                                 //设置预分频器的值
    itd.TIM_RepetitionCounter=0;                            //重复计数器的值,但是仅高级定时器有效
    TIM_TimeBaseInit(TIM2,&itd);
    
    TIM_OCInitTypeDef itd1;
    itd1.TIM_OCMode = TIM_OCMode_PWM1;                      //比较输出模式为PWM1
    itd1.TIM_OCPolarity = TIM_OCPolarity_High;              //输出极性为高电平
    itd1.TIM_OutputState=TIM_OutputState_Enable;            //使能
    itd1.TIM_Pulse=0;                                       //初始化输出比较的阈值          
    TIM_OC1Init(TIM2,&itd1);
    
    TIM_Cmd(TIM2,ENABLE);                                   //使能定时器
    while(1){
        
        TIM_SetCompare1(TIM2,25);           //占空比为2.5%;角度为0
        Delay_s(1);     
        TIM_SetCompare1(TIM2,50);           //占空比为5%;角度为45
        Delay_s(1);
        TIM_SetCompare1(TIM2,75);           //占空比为7.5%;角度为90
        Delay_s(1);
        TIM_SetCompare1(TIM2,100);          //占空比为10%;角度为135
        Delay_s(1);
        TIM_SetCompare1(TIM2,125);          //占空比为12.5%;角度为180
        Delay_s(1);
        TIM_SetCompare1(TIM2,150);          //占空比为15%;角度还是180,做测试是否真的只能转180度用的.
        Delay_s(1);
    }
    
}

 PWM代码部分我直接复制我之前的博文。

我们主要要做的就是修改PWM的频率和占空比。频率需要为50,因此我设置的自动重装计数器的值为(1000-1),10的整数倍比较好计算占空比的比率。预分频器就设置为(1440-1),这样发出的PWM就是50Hz的了。

代码中我用的TIM2的通道1,因此对应的引脚是GPIOA的0号引脚。因此我这边接线是SG90/MG995的红线接到ST-Link的5V,棕线与STM32共地,黄线接到GPIOA的0号引脚,也就是接收PWM。

这样就可以通过PWM来操作这两个型号的舵机啦,两个舵机共用一套代码都行。

其他型号的舵机改改应该也能用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1438863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解C++类和对象(中(类的6个默认成员函数))

文章目录 写在前面1. 类的6个默认成员函数2. 构造函数2.1 构造函数的引入2.1 构造函数的特性 3. 析构函数3.1 析构函数的引入3.2 析构函数的特性 4. 拷贝构造函数4.1 拷贝构造函数概念4.2 拷贝构造函数的特性4.3 拷贝构造函数典型调用场景 5. 赋值运算符重载5.1 运算符重载5.2 …

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…

寻迹模块——红外循迹模式使用介绍

目录 循迹模式——红外循迹模式使用介绍 红外循迹模块介绍 接线 循迹小车原理 安装与接线 实验程序 实验效果 循迹模式——红外循迹模式使用介绍 实验效果: 寻迹模块-CSDN直播 红外循迹模块介绍 传感器的红外发射二极管不断发射红外线,当发射出…

RabbitMQ-5.消费者的可靠性

消费者的可靠性 5.消费者的可靠性5.1.消费者确认机制5.2.失败重试机制5.3.失败处理策略5.4.业务幂等性5.4.1.唯一消息ID5.4.2.业务判断 5.5.兜底方案 5.消费者的可靠性 当RabbitMQ向消费者投递消息以后,需要知道消费者的处理状态如何。因为消息投递给消费者并不代表…

jvm几个常见面试题整理

1. Full GC触发机制有如下5种情况。 (1)调用System.gc()时,系统建议执行Full GC,但是不必然执行。(2)老年代空间不足。(3)方法区空间不足。(4)老年代的最大可用连续空间小于历次晋升到老年代对象的平均大小就会进行Full GC。(5)由Eden区、S0(From)区向S…

前端vite+vue3——自动化配置路由布局

文章目录 ⭐前言💖vue3系列文章 ⭐ 自动化配置路由💖引入vite版本自定义目录映射💖自动化读取文件下的路由💖main入口加载路由💖入口app.vue配置💖layout基础布局配置💖效果 ⭐总结⭐结束 ⭐前言…

python实现中国剩余定理

中国剩余定理又称孙子定理,是数论中一个重要定理。最早可见于我国的数学著作《孙子算经》卷下“物不知数”问题,原文如下: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?即…

车载网络测试 - 总线基础 - CAN总线负载计算

我想做过CAN总线测试的都有遇到过拉高总线负载相关的测试,这个时候我们一般都会通过增加报文的数量或者减小报文的周期来实现,但是CAN总线上的负载到底是如何计算的呢?我想很多人都会有这个疑问吧,那么今天我们一起来看下如何计算…

CX341A 安装驱动与刷固件

参考 驱动安装1 DPDK编译:支持Mellanox 25Gbps网卡 - 知乎 NVIDIA Mellanox CX网卡固件、驱动系列操作 - 知乎 驱动安装2 Mellanox网卡驱动安装指南 Mellanox OFED_崇尚匀速 追求极致的技术博客_51CTO博客 驱动与固件: 家用万兆网络指南 6 - 比…

当前的脑机交互更像是自动化交互,而不是智能化交互

脑机交互是指通过直接连接人类大脑与外部设备,实现人与计算机、机器或其他设备之间的交互。目前的脑机交互技术还存在许多挑战和限制,因此可以说脑机交互还远远不成熟。当前的脑机交互更像是自动化交互,而不是智能化交互。 目前的脑机交互技术…

ArcGIS学习(六)地理数据库

ArcGIS学习(六)地理数据库 上个任务我们讲了一个非常重要的知识点一一坐标系。这个任务我们带来另外一个很重要的知识点一一地理数据库。 地理数据库的内容相比于坐标系简单很多! 首先,先让我们来学习下地理数据库的理论。 ArcGIS 中的地理数据库(Geodatabase)是一个用…

Verilog刷题笔记22

题目: Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high. For example, the input 8’b100…

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目:函数将str字符串中的5个数字字符串转换为整数,并保存在二维数组m的最后一行,各元素为3、-4、16、18、6。并经函数move处理后,运行结果如下: 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

Spark安装(Yarn模式)

一、解压 链接:https://pan.baidu.com/s/1O8u1SEuLOQv2Yietea_Uxg 提取码:mb4h tar -zxvf /opt/software/spark-3.0.3-bin-hadoop3.2.tgz -C /opt/module/spark-yarn mv spark-3.0.3-bin-hadoop3.2/ spark-yarn 二、配置环境变量 vim /etc/profile…

macbook电脑如何永久删除app软件?

在使用MacBook的过程中,我们经常会下载各种App来满足日常的工作和娱乐需求。然而,随着时间的积累,这些App不仅占据了宝贵的硬盘空间,还可能拖慢电脑的运行速度。那么,如何有效地管理和删除这些不再需要的App呢&#xf…

【51单片机】外部中断和定时器中断

目录 中断系统中断介绍中断概念 中断结构及相关寄存器中断结构中断相关寄存器 外部中断实验外部中断配置软件设计实验现象 定时器中断定时器介绍51 单片机定时器原理51 单片机定时/计数器结构51 单片机定时/计数器的工作方式 定时器配置硬件设计软件设计实验现象 中断系统 本章…

运维必会篇-日志(错误日志,二进制日志,查询日志,慢查询日志)

日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过 程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日 志。 该日志是默认开启的&#x…

SpringBoot 事务管理Transactional 数据回滚 数据一致性

介绍 SpringBoot当中的事物他保证了一致性,要么全部一起成功(提交),要么一起失败,失败(回滚)后数据会回到当初的样子,是一组操作的集合。 事物类型 开启事物提交事物回滚事物 案…

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1,绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约,外国人迈克尔库伦开设了第一家合作商店,为了更好地吸引大量客流量,迈克尔库伦精心设计了低价策略,通过大量进货把商品价格压低,通过商店一次性集…

面试经典150题——两数之和 II - 输入有序数组

"The only limit to our realization of tomorrow will be our doubts of today." - Franklin D. Roosevelt 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 暴力求解的思路就是通过两次for循环,外层循环遍历整个数组,内层循环遍…