STM32CubeIDE基础学习-舵机控制实验

STM32CubeIDE基础学习-舵机控制实验


文章目录

  • STM32CubeIDE基础学习-舵机控制实验
  • 前言
  • 第1章 硬件介绍
  • 第2章 工程配置
    • 2.1 基础工程配置部分
    • 2.2 生成工程代码部分
  • 第3章 代码编写
  • 第4章 实验现象
  • 总结


前言

SG90、MG996舵机在机器人领域用得非常多,因为舵机有内置控制电路,它们的尺寸虽然很小,但输出力够大,但不同型号的舵机对应的力矩也有不同,具体要看具体参数选择。
例如:船舵、航模、机器人等都用得非常多。

STM32CubeIDE基础知识学习回顾

实验目的:
学习使用定时器输出PWM功能,从而实现控制舵机转动指定的角度。


第1章 硬件介绍

舵机控制接口采用定时器4通道3,配置时使能该通道即可。

SG90舵机实物如下图所示:

在这里插入图片描述

这款舵机的控制需要一个20ms为周期的脉冲信号,其中高电平的占比在0.5ms ~ 2.5ms之间,当高电平的脉宽在0.5ms ~ 2.5ms之间时舵机就可以对应旋转到0 ~ 180度不同的角度。所以可以通过控制控制信号的高电平宽度来调节输出角度,从而实现方向的控制。

时间和角度对应的控制关系如下:

在这里插入图片描述

当然,上面这些只是常用且比较好计算的时间和角度关系,如果需要旋转其它任意的角度,可以改变对应时间即可。

第2章 工程配置

2.1 基础工程配置部分

本实验采用LED实验的工程作为模板,直接在上面添加定时器PWM的功能配置即可。

第一步:配置定时器时钟源。

在这里插入图片描述

按照标号步骤依次选择即可,定时器4使用的是内部时钟源,通道3输出。

第二步:配置定时器和PWM相关参数。

在这里插入图片描述

计数配置:PSC取7199,ARR取199,向上计数模式。

PWM配置:采用PWM1模式,极性为高电平有效,参数Pulse的值可以设置也可以不设置,让其默认为0,这里问题不大,后面在使用时还是会改变该值的。

最终定时器及PWM功能配置完成之后,可以看到芯片的PA8引脚被配置为了TIM4_CH3,如下图所示:

在这里插入图片描述

2.2 生成工程代码部分

配置完功能之后就可以点击生成工程代码了。
可以看到main文件多了一个定时器的初始化函数和tim.c文件,如下图所示:

在这里插入图片描述
进入定时器初始化函数后如下图所示:

在这里插入图片描述

里面主要是设置定时器相关参数等。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到此,检查生成的初始化代码部分没有问题后就可以编写完成后面的控制功能代码就可以了。

第3章 代码编写

在输出PWM之前,需要使能输出通道才可以,即使能CC1E位,使能之后就可以输出PWM了。直接调用函数如下图所示:

在这里插入图片描述
根据舵机的控制原理及公式计算,比较值为5对应舵机是0度,15对应舵机是90度,代码编写如下图所示:

在这里插入图片描述
编译下载代码后,可以看到舵机先归零再转90度,如此往返旋转。

能单独控制指定角度之后,就可以控制常用的角度了,代码如下图所示:

在这里插入图片描述

代码片示例如下:

  /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 5);     /* 0度 */HAL_Delay(1000);     /* 旋转间隔时间 */__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 10);    /* 45度 */HAL_Delay(1000);__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 15);    /* 90度 */HAL_Delay(1000);__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 20);    /* 135度 */HAL_Delay(1000);__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 25);    /* 180度 */HAL_Delay(1000);/* USER CODE END WHILE */}

注意:如果前面的PWM模式和极性选择不同,则这里的比较值大小也会不同,要结合具体情况分析代入。

第4章 实验现象

下载代码后,就可以看到舵机可以分别从0度旋转到180度了,每次递增45度,间隔1秒,当旋转到180度时则复位到0度,如此往返旋转。


总结

这款SG90舵机还是比较好玩的,只要能熟练PWM的使用就可以容易驱动舵机了,弄明白时间计算公式,把时间代进公式算即可。

注意:普通的(没做过电路特殊处理的)单片机开发板不建议接多个舵机,3个内一般还可以,3个以上可能会对板子造成损害,具体要根据板子自身来接。

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

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

相关文章

基于51单片机的数字时钟与日历显示控制设计

**单片机设计介绍, 基于51单片机的数字时钟与日历显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的数字时钟与日历显示控制设计是一个结合了硬件与软件技术的综合性项目。以下是该设计的概要…

SpringBoot中application.yml引入多个YML文件

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等)…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白,首先我们要进行一些准备工作,安装一些基础软件, 备注一下:这里安装的vue环境的后台管理系统,不同的后台管理系统,需要安装不同的插件 准备工作: 安装 Visual Studio Code …

刷代码随想录有感(27):重复的子字符串

题干&#xff1a; 代码&#xff1a; class Solution { public:void getNext(int *next, string &s){int j 0;next[0] 0;for(int i 1; i < s.size(); i){while(j > 0 && s[i] ! s[j]){j next[j - 1];}if(s[i] s[j]){j;}next[i] j;}}bool repeatedSubst…

基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

Python创建现代GUI应用程序库之ttkbootstrap使用详解

概要 ttkbootstrap是一个基于Python的Tkinter库构建的,用于创建现代GUI应用程序。它结合了Tkinter的简洁性和Bootstrap框架的美观,提供了丰富的组件和样式,使开发人员能够快速构建美观、响应式的桌面应用程序。 安装 通过pip可以轻松安装ttkbootstrap: pip install ttkb…

阿里云服务器北京地域多少钱?北京地域最新收费标准及便宜购买教程

阿里云服务器在国内有十几个地域可选&#xff0c;北京地域主要适合北方用户选择&#xff0c;2024年阿里云中国内地地域云服务器做了降价调整&#xff0c;因此收费标准也有所变化&#xff0c;本文为大家展示阿里云服务器北京地域最新的收费标准&#xff0c;以及在实际购买过程中…

JUC-线程的创建、运行与查看

创建和运行线程 Thread创建线程 Thread 创建线程方式&#xff1a;创建线程类&#xff0c;匿名内部类方式 start() 方法底层其实是给 CPU 注册当前线程&#xff0c;并且触发 run() 方法执行线程的启动必须调用 start() 方法&#xff0c;如果线程直接调用 run() 方法&#xff…

设计模式-接口隔离原则

基本介绍 客户端不应该依赖它不需要的接口&#xff0c;即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类A通过接口Interface1 依赖类B&#xff0c;类C通过接口Interface1 依赖类D&#xff0c;如果接口Interface1对于类A和类C来说不是最小接口&#xff0c;那么类…

什么是多路复用器滤波器

本章将更深入地介绍多路复用器滤波器&#xff0c;以及它们如何用于各种应用中。您将了解到多路复用器如何帮助设计人员创造出更复杂的无线产品。 了解多路复用器 多路复用器是一组射频(RF)滤波器&#xff0c;它们组合在一起&#xff0c;但不会彼此加载&#xff0c;可以在输出之…

Linux网络名称空间与网络协议栈:区别、联系与理解

在深入探讨Linux网络名称空间和网络协议栈之间的区别和联系之前&#xff0c;重要的是先明确这两个概念的定义。网络名称空间是Linux提供的一种虚拟化技术&#xff0c;允许在同一物理机器上运行的不同进程组拥有独立的网络环境&#x1f3e2;。而网络协议栈是操作系统用于实现网络…

视频图像的两种表示方式YUV与RGB(3)

上篇文章介绍了YUV的采样格式&#xff0c;本篇重点介绍YUV的存储方式。接下来将用图形式给出常见YUV图像的存储方式&#xff0c;并在存储方式后面附有取样每个像素点YUV的数据方法&#xff0c;图中&#xff0c;Cb、Cr的含义等同于U、V。 YUYV为YUV422采样的存储格式中的一种&a…

探索 2024 年最佳编码自定义 GPT

如何利用GPT技术优化您的软件开发流程&#xff1f; 介绍 在快速发展的技术世界中&#xff0c;人工智能 (AI) 已成为创新的基石&#xff0c;特别是在编码和软件开发领域。 改变这一格局的人工智能工具之一是自定义 GPT。 这些先进的模型不仅彻底改变了我们的编码方式&#xff0c…

linux fixmap分析

本文基于Linux-4.19.125&#xff0c; ARM V7&#xff0c;dual core, MMU采用2级页表&#xff08;未开启LPAE&#xff09;。 1 为什么需要fixmap Linux内核启动过程中&#xff0c;经过汇编阶段后&#xff0c;mmu功能已经开启&#xff0c;后续只能通过虚拟地址来访问DDR&#x…

刷题日记——机试(3)

8.约瑟夫问题的实现 分析 创建一个队列和一个计数器&#xff0c;计数器初值为0&#xff0c;判断队列成员数是否为1&#xff0c;如果不是转3&#xff0c;是转6计数器每次1并且对k取余&#xff0c;然后将队首出队如果计数器值为0&#xff0c;那么回到2继续执行&#xff0c;如果不…

2024 年 3 月公链行业研报:比特币创新高、Meme 掀热潮、AI 板块露头角

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Footprint Analytics 公链研究页面 3 月份&#xff0c;加密市场表现强劲&#xff0c;比特币再创历史新高。以太坊价格稳步攀升&#xff0c;而坎昆升级则显著降低了交易成本。Solana 链上 Meme 热潮席卷而来&am…

【热门话题】 Fiddler:一款强大的Web调试代理工具——安装与使用详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Fiddler&#xff1a;一款强大的Web调试代理工具——安装与使用详解一、Fiddler的…

水位实时监测系统的工作原理

TH-SW3水位实时监测系统有多种应用场景&#xff0c;包括但不限于防汛、水文地质勘察、水资源管理等领域。例如&#xff0c;雷达水位监测站利用雷达微波技术进行水位测量&#xff0c;适用于河流、湖泊、水库等水域;积水监测站则主要使用在低洼地区&#xff0c;为城市内涝治理提供…

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …

二叉树的前序遍历、中序遍历、后序遍历

二叉树的前序遍历、中序遍历、后序遍历 一、递归算法的三个要素二、144. 二叉树的前序遍历三、94. 二叉树的中序遍历四、145. 二叉树的后序遍历 一、递归算法的三个要素 1、确定递归函数的参数和返回值&#xff1a; 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在…