STM32计数器/定时器之PWM脉宽捕获+超声波传感器测距
2019.4.1:
调试超声波传感器时候,最先使用的是中断来判断是方法配置成功,结果一直报错,才发现是忘记添加中断配置库文件了…愚人节快乐…具体内容明天补充
其实,超声波传感器工作原理很简单,但是要想高精度、连续不断的快速实现距离测量还是很有难度的。
当然,STM32也是这样,配置PWM体会最为深刻,实现一个功能很简单,但是效率如何呢?PWM的脉宽、周期准不准确,差了几毫秒或者几微妙是为什么,还能改善么?串口通信很简单,那么串口如何连续不断的接收数据又该如何处理呢?(建立串口缓冲区)
STM32的启动文件是如何的,.S文件中的具体启动流程如何,在一个简单的程序中各个寄存器是如何工作的呢/
技术路漫漫,希望自己能够不断思考,质疑…
此外,在硬件编程中,要定义变量时候要注意使用volatitle,比如在此次超声波代码处理过程中,有些变量就没能更新。
参考文章:
[1] STM32的计数器的使用
[2] STM32定时器----多通道PWM捕获
[3] STM32 同一定时器四路不同占空比PWM输出+舵机精度精准控制
[4] STM32 高级定时器
[5] STM32 高级基本定时器
1、PWM脉冲捕获
STM32 的定时器功能十分强大,有 TIME1 和 TIME8 高级定时器,也有 TIME2~TIME5 通用定时器,还有 TIME6 和TIME7 基本定时器。
1.1 STM32 高级定时器简介
参考[4] STM32 高级定时器
1.2 STM32 通用定时器简介
STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(PWM输入捕获)或者产生输出波形(输出比较和 PWM)等。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
STM32 的通用定时器 TIMx (TIM2、TIM3、TIM4 和 TIM5) 功能包括:
- 16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
- 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
- 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
- 输入捕获
- 输出比较
- PWM 生成(边缘或中间对齐模式)
- 单脉冲模式输出
- 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路
- 如下事件发生时产生中断/DMA:
- 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
- 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
- 输入捕获
- 输出比较
- 支持针对定位的增量(正交)编码器和霍尔传感器电路
- 触发输入作为外部时钟或者按周期的电流管理
1.3 STM32 基本定时器简介
[5] STM32 基本定时器
1.2 何为捕捉PWM脉冲
通过检测输入的PWM脉冲信号,获取该脉冲的占空比,频率等关键信息。
1.3 如何捕捉PWM脉冲
首先通过STMPA7引脚输出PWM脉冲:STM32配置多个外部中断
通过检测引脚状态,控制相应计数器的开启与关闭来实现PWM脉冲高低电平的计数,再通过计数器的周期计算出相应PWM的高低电平时间,进而得到PWM的周期和占空比。
对于周期比较小的PWM脉冲,可以不适用计数器中断就可以实现脉冲时间的测量,但是由于计数器单次计数周期较大而导致最终测量结果误差较大。提高测量精度就需要降低单次计数周期,但是这样无法测量周期较大的PWM脉冲。此时就需要引入计数器中断来实现PWM脉冲时间的精准测量。
PWM脉冲测量代码案例:
(没有使用计数器中断)
/** 检测高低电平时间,返回值单位是ms,* 函数参数flag = 0:低电平时间;flag= 1:高电平时间*/
float getH_L(u8 flag){u8 i;float timecount[5];for(i = 0;i<5;i++){TIM4->CNT=0; //TIM3的计数器清零if(flag){while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);//打开定时器TIM_Cmd(TIM4,ENABLE);while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1);//关闭定时器TIM_Cmd(TIM4,DISABLE);timecount[i] = TIM4->CNT * 0.001*0.125;}else{while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1);//打开定时器TIM_Cmd(TIM4,ENABLE);while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);//关闭定时器TIM_Cmd(TIM4,DISABLE);timecount[i] = TIM4->CNT * 0.001*0.125;//此处0.125是根据TIM4的配置时钟来的}}return (timecount[1]+timecount[2]+timecount[3]+timecount[4]+timecount[0])/5;
}int main()
{SysTick_Init();USART1_Config();SRF05_Config();TIME2_Config();TIME3_Config();TIME4_Config();GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET);while(1){printf("high time = %f ms\r\n",getH_L(1));printf("low time = %f ms\r\n",getH_L(0));printf("PWM period = %f ms\r\n",getH_L(1)+getH_L(0));printf("PWM Dutyfactor = %f \r\n",getH_L(1)/(getH_L(1)+getH_L(0)));}
}
PWM生成仿真:
低电平时间:0.889472ms
高电平时间:0.120806ms
PWM测量结果:精度还是很高的
Q:一旦在主函数while(1)循环中添加延时函数,测量结果就会有较大的偏差,这是为什么?
2、超声波传感器
HY-SRF05超声波传感器测距模块可提供2cm-450cm的非接触距离感测功能,测距精度可达到3mm;模块包括超声波发生器、接收器与控制电路。
引脚定义:
引脚 | 作用 |
---|---|
VCC | 供5V电源 |
GND | 地线 |
TRIG | 触发信号,信号输入 |
Echo | 回响信号输出 |
OUT | 开关量输出(当报警模块使用) |
电气参数:
2.1 超声波传感器工作原理
以上时序图表明你只需要提供一个 10uS
以上脉冲触发信号,该模块内部将
发出8个 40kHz
周期电平并检测回波。一旦检测到有回波信号则输出回响信号。
回响信号的脉冲宽度与所测的距离成正比。
由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
公式: 距离= 高电平时间*声速( 340M/S) /2
注意:
- 建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。
- 此模块不宜带电连接, 若要带电连接, 则先让模块的 GND端先连接, 否则会影响模块的正常工作。
- 测距时,被测物体的面积不少于 0.5平方米且平面尽量要求平整,否则影响测量的结果。
- 最后结果要除以2
- 超声波传感的供电电压要是5V才能正常工作,供电3.3V将不会工作,脾气倔
2.2 超声波传感器配置代码
float getdistance(void){float SendBuff2 = 0,ans[Nnum]={0};int timecount;u8 i;GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET);for(i = 0;i < Nnum;i++){GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_SET);delay_us(30);GPIO_WriteBit(GPIOA,SRF05_Trig,Bit_RESET);TIM2->CNT=0; //TIM3的计数器清零while( GPIO_ReadInputDataBit(SRF05_PORT, SRF05_Echo) == 0);//打开定时器TIM_Cmd(TIM2,ENABLE);while( GPIO_ReadInputDataBit(SRF05_PORT, SRF05_Echo) == 1);// //关闭定时器TIM_Cmd(TIM2,DISABLE);timecount = TIM2->CNT;ans[i] = timecount*0.0001*344/2;delay_ms(100);}Sort_tab(ans,Nnum);//冒泡排序/* 累加 N - Xnum 个 ADC 采样 */for (i = Xnum/2; i < Nnum-Xnum/2; ++i){SendBuff2 += ans[i];}SendBuff2 /= Nnum - Xnum; return SendBuff2;}
STM32计数器/定时器之PWM脉宽捕获+超声波传感器测距相关推荐
- STM32(7):定时器之PWM
通用定时器之PWM 脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的 ...
- STC15W408AS PCA模块实现脉宽捕获
## STC15W408AS PCA计数器实现脉宽捕获 **写在前头:1.主函数只完成PCA模块捕获功能,串口通信功能请复制下面函数块:2.主函数中包含的reg52.h文件较keil51自带有所增加, ...
- 通过数字抖动实现更高精度的PWM脉宽控制
PWM的思想就是平均 在普通PWM中我们就是使用了平均的思想,在高频输出的PWM信号中通过改变占空比,以达到调节输出平均值的作用. 但是在我们使用较高频率的PWM时,PWM脉宽分辨率便会有所降低.此时 ...
- STM32CubeIDE实现PWM脉宽可调
目录 一.简介 1.1.开发环境 1.2.实现功能 二.配置TIM3 2.1.配置Mode 2.2.配置Parameter 三.初始化程序 3.1.开启PWM通道 3.2.开启TIM3 四.调整脉宽 ...
- 【STM32F4教程】第六节:通用定时器之PWM实现呼吸灯
Conceit is the quicksand of success. 自负是成功的流沙. PWM实现呼吸灯 PWM概述 相关概念 PWM设置流程 呼吸灯实现例程 pwm.c main.c PWM概 ...
- vpwm的控制变频_变频器调速控制方式和PWM脉宽调整技术有什么不同
展开全部 PWM是变频器的一种电压调制方式. 调速控制是指调整频率636f70793231313335323631343130323136353331333365646239的同时,其他一些参数也要协 ...
- stm32 输入捕获 测量脉宽
选用通用定时器TIM5的CH1. PA0接一个按键,默认接GND,当按键按下时,IO口被拉高,此时,可利用定时器的输入捕获功能,测量按键按下的这段高电平的时间. 宏定义方便程序升级.移植,举个例子: ...
- stm32 笔记 PWM输入模式测量脉宽和占空比原理
一.PWM 输入模式测量脉宽 1.1 测量脉宽简介 在测量占空比之前,我们先一步一步来,先让 STM32 可以测量脉宽. TIM3_CH1(tim3 定时器通道 1)捕获模式测量脉宽步骤如下: 1.输 ...
- K60的FTM的PWM、输入捕获、正交解码
FTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码.英文全称是FlexTimer Module,你可以理解为高级定时器模块.易用定时器模块等等.不仅仅在Kinetis 32位处 ...
- K60的FTM的PWM、输入捕获、正交解码(未理解完)
FTM模块默认对应引脚有3个FTM模块 FTM是一个神奇的模块,他能输出PWM,能输入捕获,能输出比较还能正交解码.英文全称是FlexTimer Module,你可以理解为高级定时器模块.易用定时器模 ...
最新文章
- 分布式概念-分布式事务,并发处理协议
- mf模型 svd++_算法小板报(六)——初探MF(矩阵分解)和FM模型
- node 流学习笔记 - 可写流
- 哈尔滨学院 计算机等级考试证书,2018年9月黑龙江哈尔滨学院计算机等级考试证书领取通知...
- Go语言在Linux环境下输出彩色字符
- Google AI 教育项目今起免费开放,支持中文
- JavaScript ES6对Proxy的原生支持的一个例子
- keepalived mysql双主架构图_基于keepalived Mysql双主热备配置
- 网络硬盘录像机和数字硬盘录像机区别(nvr dvr ipc区别)
- JavaScript 插入元素到数组的方法汇总
- Qt使用教程之指定运行设置(三)
- HttpClient 通过资源URL下载资源
- Java编译器:Javac
- 用艾宾浩斯曲线记忆周期来背单词是否有理论依据?
- 微信公众号上传图文素材thumb_media_id的获得
- oogle code svn+TortoiseSVN使用方法
- 提高数据分析思维能力的三大方法
- 线性代数的视角理解LSR(least square regression)的参数评估算法本质
- JpGrap引入以及中文乱码问题
- 2022年小额贷款行业研究报告