stm32驱动超声波模块
下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。
#define HCSR04_PORT GPIOB #define HCSR04_CLK RCC_APB2Periph_GPIOB #define HCSR04_TRIG GPIO_Pin_8 #define HCSR04_ECHO GPIO_Pin_9 #define TRIG_Send(n) do{ if(n == 0) GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG); else if(n == 1) GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG); }while(0) #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO) void UltrasonicInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE); //IO初始化 GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG); GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(HCSR04_PORT, &GPIO_InitStructure); GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟 //配置定时器基础结构体 TIM_DeInit(TIM6); TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到1000为1ms TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值 1M的计数频率 1US计数 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断 TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断 NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM6,DISABLE); } //定时器6中断服务程序 u32 msHcCount = 0; void TIM6_IRQHandler(void) //TIM6中断 { if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志 msHcCount++; } } static void OpenTimerForHc() //打开定时器 { TIM_SetCounter(TIM6,0); //清除计数 msHcCount = 0; TIM_Cmd(TIM6, ENABLE); //使能TIMx外设 } static void CloseTimerForHc() //关闭定时器 { TIM_Cmd(TIM6, DISABLE); //使能TIMx外设 } //获取定时器时间 u32 GetEchoTimer(void) { u32 t = 0; t = msHcCount*1000; //将MS转换成US t += TIM_GetCounter(TIM6); //得到总的US TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零 return t; } //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号 //为了消除余震的影响,取五次数据的平均值进行加权滤波。 float Hcsr04GetLength(void ) { u32 t = 0; int i = 0; float lengthTemp = 0; float sum = 0; while(i!=5) { /*发送一个20ms的脉冲*/ TRIG_Send(1); osDelay(20); TRIG_Send(0); while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出) OpenTimerForHc(); //打开定时器 while(ECHO_Reci == 1); //等待超声波返回 CloseTimerForHc(); //关闭定时器 t = GetEchoTimer(); //获取时间,分辨率为1US lengthTemp = ((float)t*17/1000.0);//cm sum = lengthTemp + sum ; i = i + 1; } lengthTemp = sum/5.0; return lengthTemp; }
最后在个大家提供一些stm32方面的参考资料
(stm32直流电机驱动)
http://www.makeru.com.cn/live/1392_1218.html?s=45051
(stm32 温湿度采集)
http://www.makeru.com.cn/live/detail/1476.html?s=45051
( ADC读取光照传感器)
http://www.makeru.com.cn/live/1392_1004.html?s=45051
(stm32串口应用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051
stm32驱动超声波模块的更多相关文章
- STM32—驱动GY85-IMU模块
GY85是一个惯性测量模块,内部集成了三轴加速度计.三轴陀螺仪.电子罗盘.气压传感器等芯片,用于测量和报告设备速度.方向.重力,模块可以将加速度计.陀螺仪.电子罗盘等传感器的数据进行综合,在上位机可以 ...
- STM32—驱动RFID-RC522模块
文章目录 一.S50(M1)卡介绍 1.S50(M1)卡基础知识 2.内部信息 3.存取控制 4.数据块的存取控制 5.控制块的存取控 6.工作原理 7.M1与读卡器的通信 二.RC522工程代码详解 ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- 关于HC04超声波模块测距的思考(51版)
之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...
- 超声波手势识别(STM32四路超声波获取)
超声波手势识别在市场上已经有见实现,但研究其传感器发现并不是市场上随意可见的,如果暂且考虑成本,该如何入门实现简单的手势识别呢.聊天中老师给出一个很好的提议,就是固定四个超声波,分别为上下左右,然后进 ...
- [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板 一块 2.电机驱动模块L2 ...
- STM32驱动ILI9341控制器控制TFTLCD显示
STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...
- AMS5601的ardunio和STM32驱动开发
AMS5601的ardunio和STM32驱动开发 本文有麦粒电子撰写,并提供相应产品服务. 前言 目前ams关于磁编码芯片用的比较多的可能是ams5600,能够输出pwm信号,电压信号以及I2C通信 ...
- esp8266的STM32驱动
esp8266的STM32驱动,数据发送接收由DMA完成,释放CPU. 目前只能发送返回消息为成功或失败的AT命令,并判断是否成功,详见esp8266_cmd():其它返回消息不可预知的命令(如查看A ...
随机推荐
- Request 根据用户输入的信息获取输入到控制台
html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 利用GetInvalidFileNameChars()得到有效的文件名
public static string GetValidName(string fileName) { foreach (char c in System.IO.Path.GetInvali ...
- 关于当前PHP脚本运行时系统信息相关函数
我们的 PHP 在执行的时候,其实可以获取到非常多的当前系统相关的信息.就像很多开源的 CMS 一般会在安装的时候来检测一些环境信息一样,这些信息都是可以方便地动态获取的. 脚本文件运行时的系统用户相 ...
- php后台解决跨域
protected function _initalize() { header("content-type:text/html;charset=utf-8"); header(& ...
- DS博客作业03--树
这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...
- Jmeter系类(32) - JSR223(2) | Groovy常见内置函数及调用
常见内置函数及调用 获取相关函数 获取返回数据并转换为String字符串 prev.getResponseDataAsString() 例子 String Responsedata = prev.ge ...
- Ubuntu18.04安装jenkins
官网参考指引:https://pkg.jenkins.io/debian-stable/ wget -q -O - https://pkg.jenkins.io/debian-stable/jenki ...
- 对OOP的理解
OOP是面向对象编程Object Oriented Programming,特征分别是封装.继承.多态.抽象. 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如 ...
- IDEA连接Mysql数据库之后,在Mapper.xml编写SQL时不会自动提示表信息问题(非常详细!)
1.首先得连接上数据库 (一)点击IDEA右侧数据库模块 (二)选择MySql进行连接 (三)填写数据库相关配置 (四)重点!!! 这个时候点击测试连接是连接不上的,需要设置时区 (按照如下设置) ( ...
- Redis新旧复制
在Redis中,用户可以通过执行SALVEOF命令,让一个服务器去复制另一个服务器. 127.0.0.1:12345> SLAVEOF 127.0.0.1 6379 OK 6379的奴隶是123 ...