STM32---SG90舵机控制(HAL库,含源码)

写在前面:在嵌入式的项目中,舵机是一个十分常见的元器件模块,其主要的功能是实现机械转动,实质上舵机是一个伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。例如在机器人的电控制器系统中,飞行器设计,遥控机器人等。舵机的使用需要PWM信号,所以在学习STM32控制舵机之前,必须对于STM32的定时器输出PWM波形十分熟悉。

stm32基本定时器输出PWM波形实验:CSDN

目录

一、SG90舵机介绍

1.1舵机的基本参数

1.2舵机工作原理

二、硬件设计

 2.1定时器设计

2.2 定时器参数设计 

2.3硬件连接

三、软件设计

3.1 pwm.c

3.2 main.c

3.3 实验现象


一、SG90舵机介绍

1.1舵机的基本参数

        本次我们使用的是SG90舵机,其电气特性为:

工作电压:4.8-6V;

操作角度:0-180度;

线序定义:VCC(红色)、GND(棕色)、SIG(橙色);分别为:电源线、接地线、数据(信号)线;

实物图:

        该舵机的使用较为简单,通电后直接由单片机驱动,通过控制单片机输出一个占空比不同的PWM波形来控制舵机转动的角度

1.2舵机工作原理

        舵机的工作方式是由PWM波形控制的,在这里简单说明一下PWM波形中的主要参数:PWM波形的周期,也就是一个PWM波形的时间长短;PWM波形的占空比,即高电平占整个周期的比率;通过控制占空比来控制舵机转动的角度。

        一般情况下,舵机的控制需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围控制转动的角度。如下图所示:

20240316_210243

高电平时间转动角度
0.5ms0度
1.0ms45度
1.5ms90度
2.0ms135度
2.5ms180度

在调节的过程中,我遇到了一些困惑,在此与大家共享,希望能帮到大家:

1、高电平时间为小于0.5ms,舵机是个什么状态?

        在通电后,PWM波形中高电平时间小于0.5ms,舵机不转,或通电一瞬间有少许转动属于正常情况。

2、在通电后,一直输出一种占空比的PWM波形,舵机会持续转动吗?

        不会,一种PWM对应一个角度,在通电后,舵机会迅速转动到对应的角度,此后,PWM的电平不变,舵机会一直停留到对应的角度。

3、舵机转动后,还会回到初始状态吗?

        不会,一旦舵机转动到对应的角度,不会再回到0°,除非有对应的pwm波形。例如:如果要让舵机在0-90度之间来回转动,就需要在两种PWM波形之间来回变化。

4、当给转动90度指令,再迅速转动45度的指令,舵机会怎样?

        舵机转到需要一定的时间,而且转动到角度越大,所需要的时间越长,如果还没转到90度,就给了45度的指令,舵机可能直接转回到45度,所以转动角度指令给后,会有一定的延时,保证舵机能转到对应的角度。

二、硬件设计

 2.1定时器设计

       本次使用的开发板是STM32F103精英版,该开发板中定时器共有8个,其中定时器TIM6、7为基本定时器,TIM2-5为通用定时器,TIM1、8为高级定时器。那我们就利用通用定时器来输出PWM波形。其中对于通用定时器输出PWM的详细说明,大家可以看我之前对定时器的相关博客已经讲解的十分详细了。

        本次采用的定时器为通用定时器3,其输出通道为定时器3的通道1,通过查阅开发书册CH1通道的输出IO口为PA6,所以可以使用,不需要复用与重映射。

2.2 定时器参数设计 

         首先我们需要控制PWM波形的周期为20ms的时基脉冲,我们之前讲过PWM的周期由预分频系数psc以及自动重装载值arr共同决定。

T=(psc+1)(arr+1)/72MHz

psc:预分频系数;arr:自动重装载值;T:周期(单位s)

故:取psc=200-1;arr=7200-1;

此时计算得到的PWM的周期为20ms;

        旋转的角度由脉冲的高电平部分控制,0.5ms-2.5ms范围控制转动的角度。计数器计一个数的时间为72MHz/7200=0.1ms.则0.5ms比较捕获器CCR的值为5,1ms比较捕获器CCR的值为10,1.5ms比较捕获器CCR的值为15,2ms比较捕获器CCR的值为20,2.5ms比较捕获器CCR的值为25.分别对应的角度为0,45,90,135,180。

2.3硬件连接

三、软件设计

链接:https://pan.baidu.com/s/1XRcyXjD2FSD1ZA_odJbkuA 
提取码:1022

3.1 pwm.c

#include "./BSP/PWM/pwm.h"
/*** @brief     定时器TIM3的初始化函数* @param     arr:自动重装载值;psc:预分频系数;* @retval    无*/
TIM_HandleTypeDef btim_pwm_handle; /* 定时器句柄 */ void btim_pwm_init(uint16_t arr,uint16_t psc){btim_pwm_handle.Instance=TIM3;/* 定时器基地址 */ btim_pwm_handle.Init.Period=arr;  /* 设置预自动重装载值 */ btim_pwm_handle.Init.Prescaler=psc; /* 设置预分频系数 */ btim_pwm_handle.Init.CounterMode=TIM_COUNTERMODE_UP;   /* 设置计数模式向上计数 */ HAL_TIM_PWM_Init(&btim_pwm_handle);TIM_OC_InitTypeDef timx_oc_pwm_struct;timx_oc_pwm_struct.OCMode=TIM_OCMODE_PWM1; /* 设置比较输出模式PWM1 */ timx_oc_pwm_struct.Pulse=0;/* 设置捕获/比较寄存器的值,后面还会根据角度重新设置*/timx_oc_pwm_struct.OCPolarity=TIM_OCPOLARITY_LOW;/* 输出比较极性为低 */HAL_TIM_PWM_ConfigChannel(&btim_pwm_handle,&timx_oc_pwm_struct,TIM_CHANNEL_1);/* 定时器的 PWM 通道设置初始化函数 */HAL_TIM_PWM_Start(&btim_pwm_handle, TIM_CHANNEL_1);/* 定时器的 PWM 输出启动函数,参数1为句柄,参数2为通道数 */}/**
* @brief定时器底层驱动,时钟使能,引脚配置此函数会被 HAL_TIM_PWM_Init()调用
* @param       htim:定时器句柄
* @retval无
*/ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim){if(htim->Instance==TIM3)/* 判断是否为定时器3 */{__HAL_RCC_TIM3_CLK_ENABLE();/* 使能定时器时钟 */__HAL_RCC_GPIOA_CLK_ENABLE();/* 使能输出io时钟 */GPIO_InitTypeDef gpio_init_struct;gpio_init_struct.Mode= GPIO_MODE_AF_PP;gpio_init_struct.Pin=GPIO_PIN_6;gpio_init_struct.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &gpio_init_struct);}}

3.2 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/PWM/pwm.h"/************************************************************************************/
/*以下函数为0-180度舵机角度控制测试函数*	PWM 信号与0-180舵机的关系:*	0.5ms ---------------- 0度*	1ms   ---------------- 45度*	1.5ms ---------------- 90度*	2ms   ---------------- 135度*	2.5ms ---------------- 180度*	舵机频率与占空比的计算:*	设舵机的频率为50HZ,则PWM周期为20ms,0度对应的占空比为2.5%,即0.05ms的高电平输出。*/
int main(void)
{HAL_Init();                              /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */delay_init(72);                          /* 延时初始化 */led_init();                              /* LED初始化 */btim_pwm_init(200-1,7200-1);while(1){ __HAL_TIM_SET_COMPARE(&btim_pwm_handle,TIM_CHANNEL_1,5); /* 0°*/delay_ms(1000);/* 延时一定时间,保证能够转动到一定的角度 */__HAL_TIM_SET_COMPARE(&btim_pwm_handle,TIM_CHANNEL_1,25); /*180°*/delay_ms(1000);__HAL_TIM_SET_COMPARE(&btim_pwm_handle,TIM_CHANNEL_1,15); /* 90°*/delay_ms(1000);  /* 最后就会停到90°位置 */   }
}

3.3 实验现象

舵机实验

不能转动常见问题:

1、确保舵机是否正常,连线是否正常,对应的IO口是否合适;

2、确保PWM波形是否按照要求;

3、代码书写问题,IO口,定时器,以及延迟是否到位!!!

总结:本节我们利用STM32输出不同占空比的PWM波形,成功实现了SG90舵机的转动。讲述了转动的原理,连接线以及分享了HAL库的源码,大家学习后一定要自身实践实践。

创作不易,还请大家多多点赞支持!!!

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

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

相关文章

深入解析 Kafka生产者:关键特性与最佳实践

引言 Apache Kafka作为一个高度可扩展且具有高效性的消息中间件,已经成为现代大数据生态系统中的核心组件之一。在本文中,我们将专注于Kafka中的一个重要角色——生产者(Producer),探讨其核心功能、工作原理及其关键配…

用户数据的FLASH存储与应用(FPGA架构)

该系列为神经网络硬件加速器应用中涉及的模块接口部分,随手记录,以免时间久了遗忘。 一 背景 我们知道,在FPGA做神经网络应用加速时,涉及到权重参数的存储和加载。通常在推理过程中,会将权重参数存储在外部DDR或片上S…

c++简单实现avl树

文章目录 AVL树节点类节点类的构造函数 AVLinsert()插入RotateL(左单旋)RotateR(右单旋)RotateLR(右双旋)RotateRL(左双旋) Find(查找)IsBalance(检查是否是avl树) AVL树 AVL树:又名高度平衡树,在二叉搜索树的基础上加上了一个条件,条件是左右子树高度差…

vulhub中GitLab 远程命令执行漏洞复现(CVE-2021-22205)

GitLab是一款Ruby开发的Git项目管理平台。在11.9以后的GitLab中,因为使用了图片处理工具ExifTool而受到漏洞CVE-2021-22204的影响,攻击者可以通过一个未授权的接口上传一张恶意构造的图片,进而在GitLab服务器上执行任意命令。 环境启动后&am…

[C++ 从入门到精通] 20.对象移动、移动构造函数、移动赋值运算符

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览: 一. 对象移动的概念二. 移动构造函数和移动赋值…

FFmpeg查看所有支持的编码/解码器/封装/解封装/媒体格式/滤镜

查看所有支持的编码器与解码器 ffmpeg -codecs 只查看所有编码器: ffmpeg -encoders 只查看所有解码器: ffmpeg -decoders 只查看H264编码器: ffmpeg -h encoderh264 只查看H264解码器: ffmpeg -h decoderh264 查看所有支持的封装: ffmpeg -muxers 查看所有支持的解封装…

【开源鸿蒙】为QEMU RISC-V虚拟平台构建OpenHarmony轻量系统

文章目录 一、背景介绍二、准备OpenHarmony源代码三、准备hb命令3.1 安装hb命令3.2 检查hb命令 四、编译RISC-V架构的OpenHarmony轻量系统4.1 设置hb构建目标4.2 启动hb构建过程 五、问题解决5.1 hb set 报错问题解决 六、参考链接 开源鸿蒙坚果派,学习鸿蒙一起来&a…

【每日算法】常见AIGC模型; 刷题:力扣单调栈

上期文章 【每日算法】理论:生成模型基础; 刷题:力扣单调栈 文章目录 上期文章一、上期问题二、理论问题1、stable diffusion模型的网络架构2、T5的网络架构(Text-To-Text Transfer Transformer模型)3、SDXL模型4、DA…

Git全套教程一套精通git.跟学黑马笔记

Git全套教程一套精通git.跟学黑马笔记 文章目录 Git全套教程一套精通git.跟学黑马笔记1.版本管理工具概念2. 版本管理工具介绍2.1版本管理发展简史(维基百科)2.1.1 SVN(SubVersion)2.1.2 Git 3. Git 发展简史4. Git 的安装4.1 git 的下载4.2 安装4.3 基本配置4.4 为常用指令配置…

【jeecgboot】微服务实战LISM

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因(基于Spring Cloud Alibaba的试用场景)1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎,根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…

SpringBoot中的HttpServletRequest

1.HttpServletRequest javax.servlet.http.HttpServletRequest是SUN制定的Servlet规范,是一个接口,表示请求, 其父接口是 javax.servlet.ServletRequest。“ HTTP 请求协议”的完整内容都被封装到 request对象中。 2.HttpServletRequest的生…

【C++中日期类的实现】

一路,一路,一路从泥泞到风景............................................................................................... 目录 前言 一、【什么是日期类】 二、【代码实现】 1.【Date.h】部分: 2.【Date.cpp】部分:…

面试经典-32-判断子序列

题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列…

【图像生成】(四) Diffusion原理 pytorch代码实例

之前介绍完了图像生成网络GAN和VAE,终于来到了Diffusion。stable diffusion里比较复杂,同时用到了diffusion,VAE,CLIP等模型,这里我们主要着重介绍diffusion网络本身。 2.原理 Diffusion扩散模型从字面上来理解&#…

通用的springboot web jar包执行脚本,释放端口并执行jar包

1、通用的springboot web jar包执行脚本,释放端口并执行jar包: #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/data/yitu-projects/yitu-xzhq/sftp # 服务名称。同时约定部署服务的 jar 包名字也为它。 SERVER_NAMEyitu-server # 环境…

C++从零开始(day52)——unordered_set,unordered_map学习使用

1.unordered系列关联式容器 C98中,STL提供了底层为红黑树结构的一系列容器,在查找时效率可以达到时间复杂度可以达到O(logN),即红黑树的高度次,当树中的结点非常多时,查询效率也不理想,因此在C11中&#x…

代码随想录算法训练营第11天|20.有效的括号 1047.删除字符串中的所有相邻重复项

20.有效的括号 栈类的题目都很神奇,这道题分有不有效有三种情况,一种是左括号多了,一种是右括号多了,一种是左括号和右括号不匹配。我们设置一个栈来放s[i]所对应的右括号,如果s[i]‘{’,那么就在栈里放‘}…

大模型语言系列-Agent

文章目录 前言一、Agent是什么?二、LLM Agent1.西部世界小镇Agent2.BabyAGI3.AutoGPT4.Voyager Agent 总结 前言 自2022年ChatGPT诞生以来,LLM获得了收获了大量关注和研究,但究其根本,技术还是要为应用服务,如何将LLM…

Lua中文语言编程源码-第五节,更改lcorolib.c协程库函数, 使Lua加载中文库关键词(与所有的基础库相关)

源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lcorolib.c协程库函数,Coroutine Library:表明这个C源文件实现了Lua的协程库(Coroutine Library),即提供了…

探索编程新纪元:Code GeeX、Copilot与通义灵码的智能辅助之旅

在人工智能技术日新月异的今天,编程领域的革新也正以前所未有的速度推进。新一代的编程辅助工具,如Code GeeX、Copilot和通义灵码,正在重塑开发者的工作流程,提升编程效率,并推动编程教育的普及。本文将深入探讨这三款…