【STM32F103】PWM驱动舵机(SG90MG995)

2024-02-07 20:36

本文主要是介绍【STM32F103】PWM驱动舵机(SG90MG995),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;                      //比较输出模式为PWM1itd1.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%;角度为0Delay_s(1);     TIM_SetCompare1(TIM2,50);           //占空比为5%;角度为45Delay_s(1);TIM_SetCompare1(TIM2,75);           //占空比为7.5%;角度为90Delay_s(1);TIM_SetCompare1(TIM2,100);          //占空比为10%;角度为135Delay_s(1);TIM_SetCompare1(TIM2,125);          //占空比为12.5%;角度为180Delay_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来操作这两个型号的舵机啦,两个舵机共用一套代码都行。

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

这篇关于【STM32F103】PWM驱动舵机(SG90MG995)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688858

相关文章

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,