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库的源码,大家学习后一定要自身实践实践。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java8中Stream流API最佳实践Lambda表达式使用示例

文章目录 一、创建流二、中间操作和收集操作筛选 filter去重distinct截取跳过映射合并多个流是否匹配任一元素:anyMatch是否匹配所有元素:allMatch是否未匹配所有元素:noneMatch获取任一元素findAny获取第一个元素findFirst归约数值流的使用中…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了,指针数组的存放指针的数组,那数组指针变量是什么呢? 显而易见,数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址,我们可以…

每周AI新闻(2024年第11周)Meta公布Llama 3集群细节 | Sora将于年内推出 | 全球首个AI软件工程师发布

这里是陌小北,一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的,背诗的里面最会写段子的,写段子的里面代码写得最好的…厨子。 每周日解读每周AI大事件。 欢迎关注同名公众号【陌北有棵树】,关注AI最新技术…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装: 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图: 2.热力图: 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…

【ollama】linux、window系统更改模型存放位置,全网首发2024!

首先是window系统 so easy 直接进入系统环境变量添加就行 其次是linux系统 全靠自己试出来的,去Ollama官网找半天文档不知道在哪,而且linux也没有说:【 https://github.com/ollama/ollama/blob/main/docs/README.md https://github.com/ollama/ollama/blob/main/docs/li…

Ubuntu 如何安装 Beyond Compare?

Ubuntu20.04安装Beyond Compare 4.3.7 一、官网下载方式一:方法二:使用 .deb 包安装 二、安装相关依赖和bcompare三、破解常见错误解决方法 ) 文件比较工具Beyond Compare是一套由Scooter Software推出的文件比较工具。主要用途是对比两个文件夹或者文件…

HCIA——30奈奎斯特定理、香农定理

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextTimer)

通过文本显示计时信息并控制其计时器状态的组件。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextTimer(options?: TextTimerOptions) 参数: 参数名参数类型…

Kotlin进阶之协程从入门到放弃

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从入门到放弃 协程Coroutine是最新式的并发编程范式,它是纯编程语言层面的东西,不受制于操作系统,轻量级,易于控制,结构严谨,不易出错,易于…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点: 缺点: 四、改进与完事 LDM代表作 原理概括 Latent Space(潜空间) 五、总结 引…

提高安全投资回报:威胁建模和OPEN FAIR™风险分析

对大多数人和企业来说,安全意味着一种成本。但重要的是如何获得适合的量,而不是越多越好。然而,你如何决定什么时候可以有足够的安全性,以及你如何获得它?则完全是另一回事。 该篇文章是由The Open Group安全论坛主办&…

【PyTorch】进阶学习:一文详细介绍 load_state_dict() 的应用场景、实战代码示例

【PyTorch】进阶学习:一文详细介绍 load_state_dict() 的应用场景、实战代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图: 思路:先生成1个单位的二维码,然后再通过像素填充颜色,颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了,那么一直重新生成食物,直到生成不冲突…

GenAI开源公司汇总

主要分类如下: 1. 基础模型:这些是机器学习和AI的核心模型提供商,它们提供基础的算法和技术支持。 2. 模型部署与推断:提供云服务和计算资源,帮助用户部署和运行AI模型。 3. 开发者工具:支持AI/ML的开发…

【网络原理】TCP 协议中比较重要的一些特性(三)

目录 1、拥塞控制 2、延时应答 3、捎带应答 4、面向字节流 5、异常情况处理 5.1、其中一方出现了进程崩溃 5.2、其中一方出现关机(正常流程的关机) 5.3、其中一方出现断电(直接拔电源,也是关机,更突然的关机&am…

拜占庭将军问题相关问题

1、拜占庭将军问题基本描述 问题 当我们讨论区块链共识时,为什么会讨论拜占庭将军问题? 区块链网络的本质是一个分布式系统,在存在恶意节点的情况下,希望 整个系统当中的善良节点能够对于重要的信息达成一致,这个机…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码 上机代码: # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

第十三篇:复习Java面向对象

文章目录 一、面向对象的概念二、类和对象1. 如何定义/使用类2. 定义类的补充注意事项 三、面向对象三大特征1. 封装2. 继承2.1 例子2.2 继承类型2.3 继承的特性2.4 继承中的关键字2.4.1 extend2.4.2 implements2.4.3 super/this2.4.4 final 3. 多态4. 抽象类4.1 抽象类4.2 抽象…