STM32CubeMX教程---通用定时器_PWM_舵机角度控制

实验摘要:

  • 通过舵机的角度控制,示范通用定时器如何输出PWM信号;

目录

一、舵机速读

二、舵机如何控制角度

三、CubeMX配置 (TIM时基、PWM周期)

四、Keil编写代码 (启动TIM、输出PWM、改变PWM脉宽)

五、角度控制-封装成函数

 一 、舵机概述

二、舵机控制原理

一、常用型号的TIM时钟频率

二、CubeMX配置

三、编写代码



一、舵机

本篇测试所用:MG996R 、 MG995,均为180°舵机 。 

1、舵机的分类

①  按 旋转角度 分类:

  • 180°舵机:能给定角度、转速固定。 在0°~180°之间运动,超过范围,轻则齿轮打坏,重则烧坏内部电路.
  •  360°舵机:360度转动,、转速能控制。但不能控制角度。

②  按 控制信号 分类:

  • 模拟舵机:持续提供PWM信号才能固定角度。优点:便宜。
  • 数字舵机:只要给一次PWM信号就能固定角度。优点:高精度、响应快、抖动小、大扭矩。

2、舵机的重要参数

  • 最大扭矩:如上面的MG996, 最大扭矩: 13KG/cm. 这个是在舵机堵转时测得的, 即距离轴中心1cm处能挂起的重量.
  • 工作电压:如常用的3.0V~7.2V, 接入电压不同, 所能产生的工作扭矩自然不同. 直接影响角度固定力。

3、引脚接线说明

  • 红色:供电;电流比较大,建议独立供电; 小舵机在测试时可以开发板上取电;

  • 粽色:地线;如果独立供电,必须与SMT32控制芯片共地(GND互接);

  • 橙色:PWM信号线;接芯片TIM_CH引脚(PWM输出通道),本篇使用TIM2_CH1,即PA0;


二、舵机如何控制角度

本篇使用舵机型号:MG996R,180度、模拟舵机。

1、原理简述

舵机的角度控制使用PWM信号,它让舵机内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,当电压差为零时,电机停转,从而达到伺服的效果。

人话:按舵机的要示,发送特定的PWM信号,就能控制舵臂旋转到指定位置。

2、PWM信号、角度

舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。

          

为了更好地理解其信号,和编写代码,把PWM关键点转换如下:

  1. PWM信号周期:       20000us 
  2. 0度时,高电平时长:    500us
  3. 180度时, 高电平时长:2500us
  4. 每增加1 °,需增加高电平时长:(2500-500)÷180 = 11.1us
  5. 某角度值A,需要的总高电平时长:(A x11.1 +500)us 

特别地说明: 把所有ms值, 转换为us值, 是为了方便代码的编写和理解. 


三、CubeMX配置 (TIM时基、PWM周期)

1、TIM的配置

2、引脚的使用

四、Keil编写代码 (启动TIM、输出PWM、改变PWM脉宽)

1、初始化

2、改变周期的脉宽

五、角度控制-封装成函数


实验目标:

1:通过CUbeMX+HAL,配置通用定时器 TIM2,产生舵机PWM信号(周期20ms,初始化占空比);

2:通过调用HAL库函数,控制舵机转动 (修改占空比值);

3:设计角度控制函数,调用函数即可实现舵臂旋转至指定角度(0°:500us ~180°:2500us)。


// 舵机1#配置角度
// 【可选参数】 [angle]0.0°~180.0°;
void AnalogServo_1_Angle(float angle)
{
    u16 ccr_1=0;
    xServo.angleNow_1 = angle;
    if(xServo.angleNow_1>180)    xServo.angleNow_1 =180;                    // 限制最大值, 防止出错
    if(xServo.angleNow_1<  0)    xServo.angleNow_1 =2;                      // 限制最小值, 防止出错
    
    ccr_1 = xServo.angleNow_1*11.11 +500;                                   // 把角度值, 换算成CCR值
    TIM_SetCCR(SERVO_1_TIM_PORT, SERVO_1_TIM_CH, ccr_1);                    // 配置TIMx的CCR寄存器值   
}


// 控制TIMx的CCRx的值;【可选参数】 [TIMx]TIM1~8, [CHx]1~4, [CCR]0~65535;
void TIM_SetCCR(TIM_TypeDef* TIMx, u8 CHx, u16 CCR) 
{    
    if(CHx==1)    TIMx->CCR1 = CCR;
    if(CHx==2)    TIMx->CCR2 = CCR;
    if(CHx==3)    TIMx->CCR3 = CCR;
    if(CHx==4)    TIMx->CCR4 = CCR;        
}

一、常用型号的TIM时钟频率

1. STM32F103系列:

  • 所有 TIM 的时钟频率都是72MHz;
  • F103C8不带基本定时器,F103RC及以上才带基本定时器。

2、STM32F407系列:

  • TIM1、8、9、10、11的时钟频率是168MHz;
  • 其它TIM的时钟频率是84MHz。    

二、CubeMX配置

        这里使用现有的CubeMX工程,略过工程配置部分。

        如果学习如何新建CubeMX工程, 可以参考下面文章:

        STM32CubeMX新建一个工程_STM32F103

        STM32CubeMX新建一个工程_STM32F407

        使用CubeMX对定时器进行定时配置,过程相当简单便捷。

        我们只需配置几个重要参数:时钟源、PSC、ARR、中断。

1、主要参数配置

主要参数讲解:

        ① Prescaler(预分频系数):即PSC寄存器值。简单地理解:内部时钟分频后再给CNT计数器使用,用于控制每一计数脉冲的时长。按上文内容得知,STM32F407的TIM1时钟是168M,在设置预分频为168后,计数脉冲频率:168MHz÷168=1MHz,即每秒产生1百万个计数信号,每个计数脉冲的时长:1秒/1M=1us。

        ② Counter Mode (计数方向):  向上计数;   

        ③ Counter Period (计数周期):  即ARR寄存器值,多少个计数脉冲作为1个波形周期。

        ④ Repetition Counter(重复计数器):   简单地理解,多少个周期才触发1次中断;

        ⑤ auto-reload preload (自动重载值的预装载):  当改变周期值ARR时,是否等到下一个更新事件再写入数值,使得数值的更改不影响执行中的波形。

2、打开中断

        高级定时器,和通用定时器不同,即使没有使能通道,也有多种中断。

        本篇只使用了周期更新中断,如下图,  打勾: update interrupt (更新中断) 。

        当计数器(CNT)的值,达到周期值(ARR)时,就会触发中断。

        注意:打勾中断后,生成的代码,只是帮我们添加了中断的配置; 而中断的开启,需要使用代码“手动”开启。


三、编写代码

        代码共为3部分:初始化配置、开启TIM、中断回调函数。

1、初始化配置

        CubeMX根据我们的配置,已生成好了初始化代码,我们不用管它。

        如果想查看它的初始化实现过程,可以双击 "tim.c"。

2、开启TIM、中断

        谨记一个,当我们使用CubeMX配置外设功能时,它只是根据参数的配置生成初始化代码(即上面的第1步),而不会主动开启外设功能,特别是中断的开启,如TIM、ADC、UART等。

        所以,我们需要在main.c中,“手动”开启TIM1。

        如下图,在while前,添加:

        HAL_TIM_Base_Start_IT(&htim1); 

        调用HAL_TIM_Base_Start_IT(&htim1)后,TIM1就会开始工作。

        下面是它的工作原理,硬件自动运行,不用干预,我们只需大概地知道工作过程、原理:

        ① TIM会自动检测脉冲信号,每来一个脉冲,计数器CNT就会硬件自动加1。

        ② 当寄存器CNT的计数值==设定的自动重装载值ARR,就会产生溢出中断。

        ③ 发生溢出中断时,CNT值被硬件置0,开始新一轮计数; 硬件自动找寻中断服务函数入口。

        使用CubeMX生成的HAL代码,我们不需要像使用标准库时那样自己编写中断函数,CubeMX已帮我们整理好中断函数的跳转,只需要重写中断回调函数。

3、重写TIM1的中断回调函数

        按上面CubeMX的配置,我们使用了周期中断(计数器CNT溢出),当中断触发时,硬件会自动调用相关的中断服务函数,而中断服务函数里,CubeMX的工程会调用回调函数: 

        HAL_TIM_PeriodElapsedCallback();

        即:即1周期结束,硬件自动调用中断服务函数,继而调用回调函数,我们无需干预。

        我们只需在工程中任意一个c文件里编写这个回调函数。

        习惯上,会在main.c的尾部编写这个函数。

        如下图,我们在main.c的  注释行 /* USER CODE BEGIN 4 */ 下面编写它。

        如果工程中已有这个函数,我们只需在函数内增加TIM2的判断部分;

        如果工程中没有这个函数,增加即可。

        注意:所有TIM的计数器溢出中断(即1周期结束),  都会统一调用它。

        在这个回调函数中,我们执行的动作是:每1000ms, 反转PB2电平(LED)。

        如果你的开发板上,PB2引脚接的是 LED, 而且也初始化成输出模式,它就会每1秒闪烁1次。

4、优化思路:

        上述操作,将会每1s进入1000次中断,当发现变量cnt累加到1000后,才反转LED。

        频繁地出入中断,大大地浪费着芯片运行资源。本篇如此设计,仅为了直观地展示和理解。

        我们在设计时,应该尽量地节省运行资源。

        上面的定时操作,有多种优化的方法:

        方法1:原参数不改,重复计数器Repetition Counter改为1000, 即1000个周期才产生1次中断;

        方法2:psc改为16800(脉冲0.0001s),ARR改为10000(1万个脉冲组成1周期)

        然后,修改回调函数,取消计数判断那部分。

        这样修改后,将会每1s进入1次中断,调用回调函数1次,能有效地节省运行资源。

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

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

相关文章

“antd“: Unknown word.cSpell

你遇到的问题是 VS Code 的 Code Spell Checker 插件在检查拼写时&#xff0c;将 "antd" 标记为未知单词。"antd" 是 Ant Design 的缩写&#xff0c;是一个流行的 React UI 库&#xff0c;不是一个英语单词&#xff0c;所以 Spell Checker 会将其标记为错误…

案例分析篇04:数据库设计相关28个考点(1~8)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

智慧水务大数据,信息化云平台建设,综合运营管理平台

一、水务信息化的建设方向 1、完善基础设施构建软件定义的数据中心 基础设施&#xff0c;建设新一代软件定义的数据中心;逐步整合水务和海洋资源、统一、规范化各业务系统,按照一体化、一站式的服务进行建设。 2、整合信息资源建立智慧决策体系 统一信息采集方式&#xff0c;…

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

以垂直列表形式显示的菜单。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 Menu组件需和bindMenu或bindContextMenu方法配合使用&#xff0c;不支持作为普通组件单独使用。 子组件 包含MenuIt…

线性代数(一)——向量基础

向量基础 1、向量和线性组合2、向量的模和点乘3、矩阵4、参考 线性代数的核心是向量的加和乘两种运算的组合&#xff0c;本篇博客为线性代数的一个引子&#xff0c;主要从向量、线性组合和矩阵逐步引出线性代数的相关知识。 1、向量和线性组合 首先介绍的是向量相关&#xff0…

Python机器学习预测+回归全家桶,新增TCN,BiTCN,TCN-GRU,BiTCN-BiGRU等组合模型预测...

截止到本期&#xff0c;一共发了4篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&#xff01; 2.机器学习预测全家桶-Python&#xff…

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作

好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…

科技云报道:两会热议的数据要素,如何拥抱新技术?

科技云报道原创。 今年全国两会上&#xff0c;“数字经济”再次成为的热点话题。 2024年政府工作报告提到&#xff1a;要健全数据基础制度&#xff0c;大力推动数据开发开放和流通使用&#xff1b;适度超前建设数字基础设施&#xff0c;加快形成全国一体化算力体系&#xff1…

【C语言】InfiniBand驱动mlx4_register_interface函数

一、讲解 mlx4_register_interface函数是Mellanox InfiniBand驱动程序的一部分&#xff0c;这个函数的作用是注册一个新的接口(intf)到InfiniBand设备。这允许不同的子系统&#xff0c;如以太网或存储&#xff0c;能够在同一个硬件设备上注册它们各自需要的接口&#xff0c;在…

Vue 中的 key:列表渲染的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Transformer模型引领NLP革新之路

在不到4 年的时间里&#xff0c;Transformer 模型以其强大的性能和创新的思想&#xff0c;迅速在NLP 社区崭露头角&#xff0c;打破了过去30 年的记录。BERT、T5 和GPT 等模型现在已成为计算机视觉、语音识别、翻译、蛋白质测序、编码等各个领域中新应用的基础构件。因此&#…

pytorch安装记录

pytorch安装记录 1 安装anconda2 安装pycharm3 安装显卡驱动4 根据显卡驱动版本下载CUDA5 cudnn安装6 根据CUDA版本安装pytorch7 pytorch卸载 1 安装anconda 下载地址: https://www.anaconda.com/download#downloads 验证是否安装成功&#xff1a;打开cmd, 输入 conda 验证环…

蓝桥杯第十一届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十一届比赛原题 1.比赛题目 2.赛题解读 1&#xff09;计数功能 2&#xff09;连续按下无效按键 二、部分功能实现 1.计数功能的实现 2.连续按下无效按键的处理 3.其他处理 1&#xff09;对于…

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

WPF Button去除按钮边框,添加下划线

<Button Width"45" Height"25" FontSize"20" Background"Transparent" BorderBrush"Transparent" Foreground"#FFC9A322" Click"Btn_Retry_Click" ><TextBlock><Underline>重试</…

Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)

文章目录 1、什么是Jenkins的流水线?2、流水线语法2.1、声明式流水线2.2、脚本化流水线 3、流水线示例3.1、使用声明式流水线的语法编写的 Jenkinsfile 文件3.2、Pipeline 各种语言示例3.2.1 Java&#xff1a;3.2.2 Node.js / JavaScript3.2.3 Python 4、一套完整的Devops Jen…

[云原生] K8s之ingress

1.Ingress的相关知识 1.1 Ingress的简介 service的作用体现在两个方面&#xff0c;对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b;对集群外部&#xff0c;他类似负载均衡器…

09-设计模式 面试题

你之前项目中用过设计模式吗? 工厂方法模式分类 简单工厂模式工厂方法模式抽象工厂模式工厂模式 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore)…

机器学习-04-分类算法-01决策树案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0GIT v2.29.2标签&#xff1a;win10 22h2 vs2022分栏&#xff1a;C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 git clone https://gitee.com/gdnh22/vld254.…