ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

五、定时器+(超声波传感器+sg90舵机)+感应开关盖垃圾桶项目

五、定时器+(超声波传感器+sg90舵机)+感应开关盖垃圾桶项目 1.定时器介绍STM32F103C8T6微控制器内部集成了多种类型的定时器这些定时器在嵌入式系统中扮演着重要角色用于计时、延时、事件触发以及PWM波形生成、脉冲捕获等应用。下面是对STM32F103C8T6中几个定时器的简单介绍1. TIM1这是一个高级定时器不仅具备基本的定时中断功能还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景为开发者提供强大的时间控制和信号处理能力。2. TIM2、TIM3和TIM4这些是通用定时器同样具有定时功能但在功能上与高级定时器有所区别。通用定时器通常用于实现一些基本的定时任务如LED闪烁、脉冲宽度测量等。每个定时器都由一个16位计数器、预分频器和自动重装寄存器的时基单元组成。预分频器可以对时钟进行分频计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时会触发中断从而执行相应的定时任务。下图为产品手册中的介绍。2.定时器工作原理定时器的核心就是计数器。定时器是一块独立于 CPU 的硬件计数器时钟来一个脉冲计数加 1 或减 1数到设定值就产生“到点”事件。CPU 不用自己数也不用一直盯着看。时钟源 → 预分频 → 计数器 → 和设定值比较脉冲 变慢 累加/递减 到点则溢出/匹配psc分频器实际上写0的话就是1分频写1就是二分频 72M的话就是36M了。就是说实际上是分频器数1。在CNT计数器中接收到一个脉冲就记一个数等到记够数目标值后溢出之后重装载归0。定时时间 (PSC 1) × (ARR 1) / 定时器时钟频率。3.三种定时器介绍在我们这款芯片中呢是没有基本定时器的我们要注意。APB2的频率是72MAPB1的频率是36M那在后续计算的过程中是用36还是72呢其实无论是APB1还是2都是使用72M通过手册中的时钟树可以看出。4.定时器框图基本定时器●16位自动重装载累加计数器仅支持向上计数●16位可编程(可实时修改)预分频器用于对输入的时钟按系数为165536之间的任意数值分频●触发DAC的同步电路●在更新事件(计数器溢出)时产生中断/DMA请求基本定时器的时钟来源只有我们的内部时钟72M时钟经过控制器到达PSC预分频1后变成了工作时钟然后计数器根据时钟产生的脉冲进行计数。计数到了ARR重装载时就产生更新中断或者更新事件。如图上所示带阴影的框叫做影子寄存器。影子寄存器的话我们是没有办法去直接进行操作的。影子寄存器缓冲寄存器让 ARR/CCR 的修改延迟到周期边界产生更新中断/事件再生效保证 PWM 一圈内参数不变。影子寄存器就是为了改寄存器随时可以写真正生效等到这一圈结束。让值的变化和更新事件同步发生。影子寄存器是定时器里的“工作副本”你写的值先放在预装载寄存器里真正参与计数、比较的是影子寄存器。两边在更新事件时才对齐一次避免 PWM 中途改参数把波形改乱。在ARPE位进行置1就是有影子寄存器。反之0就是没有。预装载关闭你写 CCR/ARR立刻参与比较/重装只进预装载当前这一圈不变何时生效当下下一个更新事件波形可能出现毛刺、长短不一整周期完整下一拍才换新占空比通用定时器●16位向上、向下、向上/向下自动装载计数器●16位可编程(可以实时修改)预分频器计数器时钟频率的分频系数为165536之间的任意数值●4个独立通道─输入捕获─输出比较─PWM生成(边缘或中间对齐模式)─单脉冲模式输出●使用外部信号控制定时器和定时器互连的同步电路●如下事件发生时产生中断/DMA─更新计数器向上溢出/向下溢出计数器初始化(通过软件或者内部/外部触发)─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)─输入捕获─输出比较●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理我们可以发现中间的部分的内容和基本定时器是相同的在这部分的上面是时钟来源和控制器下面的部分是输出比较和输入捕获不能共用的一些功能。在通用定时器中不仅仅有内部时钟还可以有外部时钟。红框部分的内容为输入捕获绿框呢为输出比较。图中左右对称的引脚实际上为同一引脚。所以说我们的定时器是有四个通道的。从产品手册中的引脚定义也可以看出高级定时器TIM1和TIM8定时器的功能包括·●16位向上、向下、向上/下自动装载计数器●16位可编程(可以实时修改)预分频器计数器时钟频率的分频系数为165535之间的任意数值●多达4个独立通道─输入捕获─输出比较─PWM生成(边缘或中间对齐模式)─单脉冲模式输出●死区时间可编程的互补输出●使用外部信号控制定时器和定时器互联的同步电路●允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器●刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态●如下事件发生时产生中断/DMA─更新计数器向上溢出/向下溢出计数器初始化(通过软件或者内部/外部触发)─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)─输入捕获─输出比较─刹车信号输入●支持针对定位的增量(正交)编码器和霍尔传感器电路●触发输入作为外部时钟或者按周期的电流管理只有圈起来的部分和基本定时器是不同的是给三相无刷电机进行使用的 foc.右上角在申请中断的位置增加了一个重复次数计数器可以实现每隔几个计数周期才发生一次更新事件和更新中断。原来的结构是每个计数周期完成后都会发生更新。相当于对输出的更新信号又做了一次分频又提升了很多的定时时间。其余部分就是高级定时器对输出比较模块的升级了DTG是死区生成电路右边这里的输出引脚由原来的一个变为了两个互补的输出可以输出一对互补的PWM波这些电路是为了驱动三相无刷电机的。因为三相无刷电机的驱动电路一般需要3个桥臂每个桥臂两个大功率开关管来控制共6个所以这里的输出PWM的引脚的前三路就变为了互补的输出而第四路没有变化。为了防止互补输出的PWM驱动桥臂时在开关切换的瞬间由于器件的不理想造成的短暂的直通现象所以前面加上了死区生成电路在开关切换的瞬间产生一定时长的死区让桥臂的上下管全部关断防止直通现象。最下面的部分是刹车输入是为了给电机驱动提供安全保障的如果外部引脚BKIN产生了刹车信号或者内时钟失效产生了故障那么控制电路就会自动切断电机的输出防止意外发生。定时器的时钟来源内部时钟模式(系统自带的72M)外部时钟模式2是从ETR引脚过来的ETR引脚的位置可以参考一下引脚定义表。例如TIM2_CH1_ETR就是说TIM2的CH1和ETR都复用在了这个引脚上。就以这个为例如果我们要使用ETR外部时钟模式。就应该在TIM2的ETR引脚也就是PA0上接一个外部的方波时钟。然后配置一下内部的极性选择。边沿检测和预分频器电路再配置一下输入滤波电路这个电路可以对外部时钟进行一定的整形啊因为是外部硬件的时钟所以难免会有些毛刺那这些电路就可以对输入的波形进行滤波啊最后滤波后的信号一分两路。上面一路ETRF进入触发控制器紧跟着就可以选择作为时机单元的时钟了这一路也叫做外部时钟模式二。外部时钟模式1这下面还有一路可以提供时钟就是TRGI主要是用作触发输入来使用的可以触发定时器的从模式。当TRGI当做外部时钟来使用的话这一路就叫作外部时钟模式1。通过TRGI的外部时钟都有哪些呢1.ETR引脚两种通道对是时钟输入而言是等价的只不过下面这一路会占用触发输入的通道2.ITR信号这一部分的时钟信号是来自其他定时器的右边可以看到这个主模式的输出TRGO可以通向其他定时器O可以通向其他定时器那通向其他定时器的时候就接到了其他定时器的ITR引脚上来了这个ITR0到ITR3分别来自其他四个定时器的PRGO输出至于具体的连接方式是怎么样的手册的这个位置有一张表啊。通过这个我们就可以实现级联的功能比如呢可以先初始化TIM3然后使用主模式把它的更新事件映射到TRGO上接着再初始化TIM2这里选择ITR2对应的就是TIM3的TRGO然后后面再选择时钟为外部时钟模式一。这样TIM3的更新事件就可以驱动TIM2的时基单元也就实现了定时器的级联。下面还可以选择TI1F_ED,连接的是输出捕获单元的CH1引脚也就是从CH1引脚中获得时钟ED就是边沿的意思也就是通过这一路输入的时钟上升沿和下降沿均有效。最后还可以通过TI1FP1和2获得分别连接到了CH1和CH2引脚的时钟。都可以称之为外部时钟模式1。5.定时器的计数模式向上计数0 → ARR溢出后回 0向下计数ARR → 0到 0 后重装 ARR中央对齐0 → ARR → 0多用于电机 PWM其中基本定时器只能进行向上计数。本质都是“数满一圈产生一次事件”只是方向不同。6.定时器溢出时间计算定时时间 (PSC 1) × (ARR 1) / 定时器时钟频率。Tout定时器溢出时间Ft定时器的时钟源频率ARR自动重装载寄存器的值PSC预分频器寄存器的值例如要定时500ms则PSC7199ARR4999Ft72MARR1是因为要多一个数去产生一个溢出中断。达到我们预定的数之后就产生一个中断。PSC预分频→ 每一拍有多长计数分辨率 精度PSC0每 1 个时钟数 1 次除以 1PSC71每 72 个时钟数 1 次PSC 越大计数越慢一拍时间越长时间分辨率变粗。PSC 越小一拍越细同样溢出时间就要数更多下。ARR自动重装载→ 一圈数多少拍周期计数器从 0 数到 ARR一共ARR1拍然后溢出、重装。ARR 越大一圈越长溢出越慢。ARR 越小溢出越快。同一 ToutTout​ 可以有很多组(PSC, ARR)原则是先定目标周期再尽量让 ARR 大、PSC 小好留分辨率。溢出时间可变PSC 调“走多快”ARR 调“走几步算一圈”配置时先定周期PWM 就小 PSC、大 ARR 保分辨率并卡住 16 位上限。7.定时器中断实验配置步骤这里定时器呢没有用到GPIO口所以在配置msp的时候不需要配置。小实验1定时器中断点灯实验目的使用定时器2进行中断点灯500ms LED灯翻转一次。硬件清单上官二号ST-Link之前我们的点灯小实验都是通过delay延时函数来进行的这次我们不用任何的delay只用定时器在我们03流水灯实验的基础上进行修改。依旧老规矩Drivers-BSP新建timer文件夹.c.h之后在“品”中添加进去C/C添加头文件。除此之外我们还需要要定时器的驱动加入进去点击Add Files。所对应的文件在Drivers--STM32_HAL_Driver--Src当中先把自己的头文件添加进来。在timer.c中输入#include timer.h之后编译出现timer.h。之后根据中断实验配置步骤来进行编写timer.c。先看一下第一步HAL_TIM_Base_Init在这个函数呢去配置时基点击F12进去我们对参数这个结构体进行一个定义。这个结构体参数timer_handle称之为句柄。把“用哪块硬件、怎么配的、现在什么状态”塞进一个结构体以后函数就只看句柄。函数通过句柄读取配置、更新状态并去操作对应的硬件。我们具体来看看这个结构体中都有什么成员变量对前半部分的typedefF12。目前我们只用到前两个再具体看看初始化在配置些什么分别是PSC计数的模式ARR滤波/死区时钟高级重复计数器高级ARR 要不要走影子寄存器需要在上图的页面注释中的TIM项进行ctrlc/f/v进行搜索都有哪些模式。msp函数是在HAL_TIM_Base_Init这个函数中自动被调用的。下一步就是中断服务函数的编写这样就完成了。8.输出比较原理输出比较可以通过比较定时计数器的值CNT与设定的比较值CCR可以控制输出引脚的电平状态置高或置低从而实现生成一定频率和占空比的 PWM波形。9. PWM介绍PWM波形Pulse Width Modulation脉冲宽度调制波形是一种占空比可变的脉冲波形。这种调制方式通过改变脉冲的宽度来控制电路中的信号强度和频率。具体来说PWM波形中的高电平持续时间和低电平持续时间可以根据需要进行调整从而实现对模拟信号电平的数字编码。PWM波形在各种领域都有广泛的应用包括电源管理、电机控制、LED亮度调节等。此外生成PWM波形的方法有多种例如使用波形发生器、单片机或可编程逻辑器件等。频率 1/Ts占空比 Ton / Ts(通过修改CCR捕获比较器来修改占空比)如果说占空比是50%那实际有效的高电平时间是Ton的50%是Ts的25%。分辨率占空比变化步距%通过改变占空比CCR寄存器的值才能达到这样的一个效果。10.定时器输出PWM波配置步骤输出比较要生成PWM波就需要用到GPIO口所以本次实验在msp时要配置GPIO。a小实验2呼吸灯实验实验目的使用定时器4通道3生成PWM波控制LED1实现呼吸灯效果。频率2kHzPSC71ARR499通过公式算出硬件清单上官二号ST-Link首先在原理图中我们可以看出LED1对应的引脚是PB8。那么PB8是哪个定时器哪个通道的呢我们从产品手册中去找到PB8对应的就是定时器4通道3依旧是在03流水灯的基础上进行实验。首先还是创建对应的文件夹和.c.h文件。之后在“品”中添加进去C/C添加对应头文件。除此之外我们还需要要定时器的驱动加入进去点击Add Files。所对应的文件在Drivers--STM32_HAL_Driver--Src当中跟上次实验的步骤是一样的。之后在pwm.c中include“pwm.h”进行编译后在h文件编写后面两个函数是完成之后进行声明的一开始是不用写的哈“sys.h”是因为有uint16_t上一个实验也说过。之后根据步骤来编写代码。首先是初始化的pwm_init函数大致的流程与形式都和实验一的Base_init是一样的首先将HAL_TIM_PWM_init()写上之后F12发现需要输入的参数还是一个句柄结构体所以我们像实验1一样定义一个全局变量。之后对这个句柄结构体内的每个成员变量进行赋值。成员变量都有什么时基初始化都配置什么跟实验1的内容是一样的图片可以划上去查看。这是第一步的效果我们可以发现在这次配置时基时没有写影子寄存器这是因为不使用影子寄存器对应的地址也是0所以说不使用的话可以直接不设置。接下来进行msp的初始化。由于本次实验没有中断所以 NVIC的函数都不用下一步就进行PWM和CCR寄存器设置的步骤了。这个函数HAL_TIM_PWM_ConfigChannel一般是在init函数中去写。F12进去就可以看到结构对应的第二个结构体的成员变量。要找对应的成员变量的话ctrlc/f/v即可。最后一步修改CRR寄存器的值。msp函数会被PWM_init自动调用所以不用在.h中声明。main11.输入捕获原理将定时器框图中的输入捕获内容抽象成下图可以更好的理解。这个输入是从GPIO进来然后到达滤波器因为外部输入的信号可能会有毛刺抖动之后进行边沿检测的极性选择通过ED这条线做时钟可以配置同时为上升沿捕获下降沿捕获之后生成TL1FP1在下一个选择器当中会有另一个通道产生的信号TL2FP2之后进行一个选择。产生一个ICx信号后进入分频器随后到达捕获器。捕获到一个有效信号后就会把CNT里的值转运到CCR当中。12.定时器输入捕获实验配置步骤13.测量按键按下时长思路按按键会产生低电平目的就是去测量按下的时长。我们就需要知道什么时候按下什么时候松开对应的就是一个下降沿和上升沿。思路就是首先设置为下降沿捕获按下时首先捕获到第一个CNT的值转运到CCR寄存器中之后立马将CNT清零将定时器重启改为上升沿捕获捕获到松开按键的CNT再转运一次。在计时的过程中可能会产生N次的溢出计算时间时我们要知道溢出了多少次。所以就是在我们的回调函数中要确定一下有没有捕获到一个完整的按键动作过程如果有后续就不需要去操作了。如果说没有捕获到进行下一步判断是否检测到下降沿没有检测到走左边支路。在测量低电平时间的场景下如果低电平持续时间很长比如超过定时器的一个计数周期就需要考虑定时器溢出的情况。这里的流程图没有表明溢出的情况。小实验3测量按键按下时间先说一下如何将数据通过串口打印到我们的屏幕当中。找到我们的03流水灯实验。还需要在魔法棒中将下图中的√上。在Keil中勾选Use MicroLIB才能正常使用printf。之后要用的USB转TTLRX--TX,TX--RXGND--GND要注意交叉接线接完之后要用到我们的工具串口调试助手。打开后选好对应的串口号不确定是哪个可以 拔掉USBTTL看缺少了哪个串口 就是哪个。我这里是9和波特率之后编译烧录就可以看到现象。实验目的使用定时器2通道2来捕获按键2按下时间并通过串口打印。那么我们为什么选择按键2还有定时器2等等呢我们来看一下原因。从原理图中可以看出两个按键对应的引脚是PA0PA1。之后我们通过产品手册看一下这两个引脚分别接的哪个定时器。由于ETR为一个输入的引脚所以PA0也就是按键1是不能用于我们本次实验。选择PA1对应的按键2定时器2的通道2。计一个数的时间1usPSC71ARR6553516位的寄存器2的16次方根据之前计算公式下降沿捕获、输入通道2映射在TI2上、不分频、不滤波。硬件清单上官二号ST-LinkUSB转TTL输入捕获实现首先实现输入捕获的功能依旧老规矩.c.hic代表的是input capture oc就是output compare。之后在“品”中添加进去C/C添加对应头文件。除此之外我们还需要要定时器的驱动加入进去点击Add Files。所对应的文件在Drivers--STM32_HAL_Driver--Src当中跟上次实验的步骤是一样的。之后在.c中输入#include“ic.h”编译后出现.h。之后开始.c文件的编写 根据上文说过的步骤。首先要写ic的初始化函数 ic_init.首先打好框架。第一步是配置时基。具体的细节比如说看某些函数输入的是句柄结构体需要设置的全局变量都有哪些跟按两个实验的操作是一致的这里就不做过多阐述。之后开始msp的初始化。步骤的下一步为输入通道的配置HAL_TIM_IC_ConfigChannel这个函数一般写在init函数中。F12进去之后可以发现所需的参数类型分别为一开始设置的句柄另一个结构体和通道。看一下新结构体的变量成员接下来开始中断服务函数用到了printf 要包含头文件stdio.h。main之后编译烧录在串口调试软件中 按下KEY2就会显示捕获下降沿。之后我们要实现捕获到下降沿之后里面改成捕获上升沿同时计数器CNT要清0重启。捕获一次完整的按键动作在这一部分我们要实现捕获到下降沿后捕获上升沿。通过上面的流程图可以看出有许多的flag可以一个个的去定义但是在企业当中一般都是使用结构体以便后续的管理。测量按键按下时间这个要在.h中声明一下。main编译烧录 在串口调试应用中按key2 能观察到按下时间。14.脉冲计数原理通用定时器的时钟来源一直是内部时钟72M本次说的脉冲计数是通过GPIO输入通过捕获通道也就是外部时钟模式1。GPIO口的话可以通过按键来模拟输入的时钟。脉冲计数测的是来了多少个脉冲。原理把引脚上的脉冲当成定时器的时钟。来一个边沿CNT 就加 1。读 CNT就是脉冲个数。15.脉冲计数配置步骤小实验4脉冲计数实验实验目的将定时器2通道2输入的低电平脉冲作为定时器2的时钟并通过串口打印脉冲数。PSC0ARR65535外部时钟模式1、触发选择、上升沿触发、不分频、不滤波硬件清单上官二号ST-LinkUSB转TTL在这里我们不用去关注溢出时间。因为这时 CNT 加 1 代表的是一个脉冲不是一段时间。溢出也是“满了 65536 个脉冲”不是“过了 65536 微秒”。更新中断照样会发生只是它表示“又满了一圈脉冲”不表示“又过了多少时间”。脉冲计数时时钟就是引脚上的脉冲。psc 0表示 ÷1来 1 个脉冲 CNT 就加 1。若设成 psc1÷2就要 2 个脉冲才加 1个数会少一半。要一个一个数PSC 必须为 0。16 位定时器 CNT 最大就是 65535。ARR 设到顶是为了一次能连着数最多的脉冲065535共 65536 个再回零。脉冲快慢不定有时 1 秒来 100 个有时 1 分钟才来几个。从 0 数到 65535 可能只要几毫秒也可能要很久。溢出时刻没有固定时长没法拿来算时间。总脉冲数 溢出次数 × 65536 CNT计数counter依旧老规矩 .c.h。“品”魔法棒和定时器的驱动加入进去点击Add Files。所对应的文件在Drivers--STM32_HAL_Driver--Src当中##include“counter.h”编译出现.h。接下来编写counter.c 根据配置流程首先是void counter_init(uint16_t arr uint16_t psc)。从模式配置函数结构体的成员变量。接下来msp初始化。if是为了判断按键是否按下了只有按下了产生脉冲计数发生了变化才打印。main编译后烧录。一直按到arr65535才会溢出模块超声波传感器怎么让它发送波Trig给Trig端口至少10us的高电平怎么知道它开始发了波Echo引脚由低电平跳转到高电平表示开始发送波怎么知道接收了返回波Echo由高电平跳转回低电平表示波回来了怎么算时间Echo引脚维持高电平的时间波发出去的那一下开始启动定时器波回来的那一下我们开始停止定时器计算出中间经过多少时间怎么算距离距离速度343m/s*时间/ 2模块sg90舵机舵机SG90详解 | 良许嵌入式舵机也叫伺服电机在嵌入式开发中舵机作为一种常见的运动控制组件具有广泛的应用.一般分为180度和360度180度可以控制旋转角度、有角度定位。上电后舵机自动复位到0度通过一定参数的脉冲信号控制它的角度。360°舵机版本不可控制角度只能控制顺时针旋转、逆时针旋转、停止和调节转速。我们今天的主角是 SG90180度版。引脚接线参考如下像我们之前的一些传感器或者是模块都是输入的是高低电平 。而我们的这个舵机这根橙色的线输入的是pwm波。那么pwm波如何产生呢我们之前使用了定时器去产生pwm。当给舵机提供特定宽度的脉冲信号时输出轴会保持在相应的角度上不受外界转矩的影响直到接收到不同宽度的脉冲信号才会改变输出角度使舵盘移动到新的位置。为了控制舵机需要使用单片机来生成周期为 20ms的脉冲信号并通过控制脉冲的高电平时间在 0.5ms 至 2.5ms 之间来控制舵机的角度。这样我们可以通过调整 PWM 信号的脉冲宽度来精确控制舵机的位置和运动。sg90舵机实验我们的芯片能有四个定时器每个都可以产生pwm波可以任选其一确定之后将引脚确定我们本次选择的是定时器3通道一。对应的是PA6。下一步要开始根据公式去计算ARR和PSC的值。首先我们要的Tout为20mspsc先选定为7199内部时钟72M(71991)/72M100us,M兆的倒数就是微秒us就是说我们计一个数就是100us。啊所以ARR1)要凑成200两万us20ms。一般psc比较常用的就是7199和71。在我们pwm控制呼吸灯实验的基础上进行修改将其中的pwm改成sg90。在“品”和魔法棒中进行原本的删除和把sg90加入进去。包括将各种文件中的pwm去替换sg90.对应。h中的声明。main函数模块超声波传感器手把手教你玩转超声波传感器原理驱动 | 良许嵌入式我们都知道声音是由物体振动产生的人能听到的频率在20Hz~20kHz。频率小于20Hz的叫次声波频率大于20kHz的叫超声波。超声波可以在空气、液体和固体中传播可以被物体反射、折射、散射等并且有频率高、波长短、绕射现象小、方向性好等特点。从而提供了丰富的用途医学影像、清洁物品、材料检测、非接触测距等等。超声波传感器就是非接触测距用于测量物体与传感器之间的距离可用于车辆安全倒车雷达安防系统检测到移动物体并触发警报工业自动化物体定位、检测和避障等等。超声波测距的工作原理其实很简单传感器发送超声波超声波碰到障碍物反弹回来被传感器接收到。芯片算出发送和接收的时间间隔再利用公式s v × t看下面示意图所以实际距离 测量距离 / 2 速度 × 时间 / 2。顺便一提超声波在空气中的传播速度大概是343m/s传播速度受到环境条件的影响如温度、湿度和气压等。1.怎么让它发送波Trig给Trig端口至少10us的高电平2.怎么知道它开始发了波Echo引脚由低电平跳转到高电平表示开始发送波3.怎么知道接收了返回波Echo由高电平跳转回低电平表示波回来了4.怎么算时间Echo引脚维持高电平的时间波发出去的那一下开始启动定时器波回来的那一下我们开始停止定时器计算出中间经过多少时间5.怎么算距离距离速度343m/s*时间/ 2超声波传感器实验在这里呢定时器仅仅起到一个计时的作用。所以说选择哪个定时器都可以这里选择的是定时器2.因为我们在后续要把距离给打印出来所以在实验21的基础上进行编写。首先老规矩建立文件夹之后“品” 魔法棒头文件、还有之前提到过很多次的定时器的驱动文件。对应的文件在Drivers--STM32_HAL_Driver--Src当中#include hcsr04.h后出现。h文件首先是.c文件的初始化命名都改为tim2方便后续修改。这里是如何确定psc和arr的值呢我们没有必要用到之前那个公式的因为我们仅仅是一个计时的作用所以只关注计时器中CNT的值是多少就可以。那么不关注溢出时间的话如何去确定呢这个型号的超声波传感器呢最长的距离是六米那么六米对应的时间是多少呢6*2/34334.9ms34985us是小于65536的证明测量的是最远的距离的话也不用处理溢出。选定psc为71使psc1/72M记一个数要多长时间1usarr设65536-116位计满确保能连续计的时间最长覆盖超声波的量程测一次不用处理溢出。由于本次实验中断和GPIO口都没有用到所以对应的函数不用去写。为了方便后续的调用再封装一些其他的函数。目前的原理就是超声波发出去的一瞬间echo变成了高电平同时就启动定时器超声波回来后变成低电平同时关闭定时器停止计数。定时器的代码结束了接下来就开始封装超声波传感器模块相关的函数首先初始化因为我们的模块的Trig和Echo引脚是要用GPIO口进行驱动的所以说还有要进行对应的GPIO的初始化。由于在实际的过程中Trig和Echo引脚是要不断的进行拉高拉低还有为了后续引脚的修改可以在.h文件中进行宏定义的封装。我们这里是PB6和PB7。项目感应开关盖垃圾桶项目需求以下几个事件触发时自动开盖并伴随蜂鸣器短响一声同时LED灯闪烁一下2秒后自动关盖检测到有人靠近检测到有震动按下按键KEY1硬件清单超声波传感器震动传感器蜂鸣器舵机杜邦线上官二号ST-LinkUSB转TTLexti对应的是震动传感器。根据所需的模块把之前封装好的复制过来。之后在“品”魔法棒中添加和定时器的驱动文件。随后在main函数中将头文件都进行声明。之后确保每个模块都是没有问题的。首先是beep.c将其中的引脚改成PB5。之后在main函数中初始化后。检验一下是否能正常运行。然后到振动传感器初始化后PA4对应的引脚。超声波传感器初始化。PB6-7。按键初始化。最后一个sg90舵机。对应引脚PA6.检测每个模块的功能呢都是没问题的接下来去真正的实现项目需要的过程。首先在main函数中进行一个开盖关盖的函数封装。
返回列表