IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 小白入门STM32(2)---控制SG90舵机 -> 正文阅读

[嵌入式]小白入门STM32(2)---控制SG90舵机

序言

本人一枚软件编程人员,有一定C语言基础,目前自学STM32单片机,写下此篇一巩固所学二交流分享。

按照惯例,先介绍理论再实战上手,穿插习题,最后给出我的愚见。

SG90属于一种舵机,最适合小白入门,可直接由单片机驱动。另外,单片机中给我们封装了很多东西,所以有些地方,读者只要记住就好,不理解的地方,不要寻根究底,你就默认单片机底层给你实现了某项功能就好,不用在意其实现基础细节原理。

这篇理论讲的很浅显,是为了让大家容易看懂。

一、基础理论

1.1 舵机控制原理–PWM

舵机一般可以再0-180度或0-360度转动任意角度,经常用于小车小船转向控制和机械臂的关节等。舵机的转动角度范围不是固定的,请购买时问问商家,到底是哪个范围的。实际使用中,我们对舵机有两个基本需求:

  1. 舵机转动一定角度。
  2. 舵机转动时,控制者要求舵机转到一个新的角度。

机器如何给舵机发送其转动角度呢?首先,要低成本,信号线要少。其次,要满足任意角度和中途打断。设计者推出了一个简单的方法:用一个时长为20ms的信号去控制舵机,信号的前一段为高电平,持续时间0.5ms到2.5ms,代表转动角度0-180或者360度,后半段为低电平,这就是PWM信号,具体如下图:
在这里插入图片描述
容易看出来,PWM信号利用前段为高电平持续时间控制旋转角度,本质用占空比控制了旋转角度。
运转时,舵机转到你指定的角度需要一定的时间,转动的角度越大,需要的时间越久,所以你可能需要等待一定的时间。如果你刚刚给舵机发送指令转到180度,紧接着又发送指令转到90度,舵机会不转到180度再转到90度,而是在接受到信号时直接在当前的角度直接转到90度去。

习题

习题110. 如果2.5ms为90度,那么36度的PWM信号是高电平时间长度是?
习题111. 为什么是PWM控制舵机,有没有其他的方法?
习题112. PWM信号属于串行还是并行通信?全工还是单工?为什么要这么设计?
习题113. PWM信号长度为20ms,为什么一般只用前2.5ms?

1.2 定时器

为什么要讲解定时器,很简单,要用它去产生PWM信号。

1.2.1 基础定时器

定时器,顾名思义,按照定下闹钟到了某个时刻做某件事情。比如,你定下闹钟早上6点起床跑步,或者每隔半个小时喝一次水。你也可以给机器制作一个闹钟,每隔半秒二极管发光或者熄灭,或者每隔4秒灯亮起来再过4秒灯熄灭。
为了达成“每隔4秒二极管亮起来再过4秒二极管熄灭”,咱们构造一套定时器系统,它也许很奇怪,设计的有些复杂,但是还请你压制疑问,跟我一起把它造出来。

  1. 咱们构造一个时钟装置,每过20ms,它响一次,也就是它将1秒切成50份,每份长20ms。(为什么要造这么一个时钟呢,这是因为单片机的时钟就是这种时钟,将1秒切成n份)
  2. 为了能够实现间隔4秒,咱们再做一个循环计数装置:每当时钟响1次,它的数值加一,但是智商有限,只知道0-1999,到了1999后再加一,数值归为0。
  3. 最后做一个开关装置,当计数装置数字为1999时开关就反转一次,灯亮或者熄灭。
    动画效果如下:
    请添加图片描述

在上述的过程中,我们就利用制作了一个套装置,其中时钟是现实世界的时间源,循环计数装置提供实际需要的循环固定间隔,它们两个组成一个完整的简陋定时器,与单片机的基础定时器基本功能一致,下面正式介绍他们。

时钟装置

时钟装置:一般是STM32单片机的系统时钟,用变量sys_tck表示,频率72MHz,即将1秒分为720万份,显然太细,频率太高了,需要降低频率,将原来的频率切分为原来的n分之一,即 7200000 n \frac{7200000}{n} n7200000?,术语叫做分频。如果采用720分频,即将原来72M频率除以720,即0.1MHz,每份0.01ms。STM32单片机允许的最大分频数为65536,其为uint16类型数字,这个分频数其实是一个寄存器。

循环计数器

循环计数器:由一些寄存器构成。最重要的两个:

  1. 计数寄存器CK_CNT,可以存储一个uint16数字,时钟前进一下,其数值自动加一或减一
  2. 自动重装载寄存器ARR,当CK_CNT大于ARR时,CK_CNT会自动变化,重新循环计数。如果你会设置中断的话,当CK_CNT>ARR时,会触发一个中断。

循环计数器有三种模式:

模式名解释图像表示
向上计数计数是自动加一,CK_CNT从0增长到ARR请添加图片描述
向下计数计数是自动减一,CK_CNT从ARR减小到0请添加图片描述
中心对齐计数是先自动加一,再自动减一,CK_CNT先从0加到ARR然后再减到0请添加图片描述

1.2.2 比较定时器

只有基础时钟是无法产生PWM信号的,因为它只能提供循环固定间隔,不能将间隔分为前半段和后半段,进而产生PWM。为了做到这点,需要给循环计数器加一个比较数字CCR,当计数器的值更新时,与CCR比较,并对外输出比较的结果,以方便做其他动作。

接上面灯泡明亮的例子,我们改成灯泡在一秒亮三秒灭的模式。我们只需要在上述提到的理想装置中再加一个比较数字就好:
请添加图片描述
CCR在STM32中是叫做比较寄存器,是循环计数器的第三个重要的寄存器。是STM32高级定时器才有的功能。

习题

习题121. 定时器的时钟装置,循环计数器各发挥了什么作用,请谈谈您的理解?
习题122. 循环计数器有哪些重要参数要设置?
习题123. STM32时钟频率为72MHz,分频数为uint16,CK_CNT为uint16,则最大循环时间间隔为多久时间?最小呢?
习题124. 如果要产生一个旋转360度的PWM信号,请设置时钟装置和循环计数器的寄存器值?

二、实战上手

STM32已经为我们在硬件上封装好了上述的提到的:时钟装置、循环计数器和对外输出装置,以及计数器的自动比较等功能,你我现阶段无需关心其细节。我们只需要对这些东西进行相关设置和接线就好。

2.1 设置定时器和单片机接线

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述

习题

习题211: 为什么Counter Period是这里为1999,而不是2000?

2.2 代码

请添加图片描述

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	TIM1->CCR1=50;
	HAL_Delay(1000);

	TIM1->CCR1=150;
	HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

三、习题答案

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-11-05 00:42:58  更:2022-11-05 00:44:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 19:04:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码