完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
HC-SR04 超声波测距模块
超声波测距原理及方法一 方法二 方法三: 在向Trig控制端发送触发信号后,一直等待到Echo引脚的响应后(变为高电平)并打开定时器计数直到Echo引脚变为低电平,关闭定时器,记录下计时时间,通过公式进行计算具体的距离。 程序: 定时器初始化 tim.c #include "tim.h" #include "delay.h" #include "Printf.h" /*2020.11.16*/ //通用定时器 3 初始化 void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟 TIM3 使能 //中断优先级 NVIC 设置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 0 级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化 NVIC 寄存器 //定时器 TIM3 初始化 TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化 TIM3 //TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //允许更新中断 TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); //不允许更新中断 TIM_Cmd(TIM3, DISABLE); //关闭 TIM3 } tim.h #include "sys.h" //通用定时器 3 初始化 void TIM3_Int_Init(u16 arr,u16 psc); //通用定时器 5 初始化 void TIM5_Int_Init(u16 arr,u16 psc); 超声波引脚配置 hc-sr04.c #include "hc-sr04.h" #include "tim.h" #include "delay.h" #include "Printf.h" /*2020.11.16 * HC-SR04超声波测距模块 * 基本工作原理:* 给TRIG引脚至少10us的高电平信号触发测距 * 模块自动发送8个40KHz的方波,自动检测是否有信号返回 * 有信号返回,通过Echo引脚输出一个高电平,高电平的持续时间就是超声波从发射到返回的时间 * 测量距离 = (高电平的持续时间 * 声速(340m/s))/ 2 */ #define HC_SR04_TRIG_CLK RCC_APB2Periph_GPIOA //脉冲触发TRIG端口 #define HC_SR04_TRIG_PORT GPIOA #define HC_SR04_TRIG_PIN GPIO_Pin_11 //11 #define HC_SR04_ECHO_CLK RCC_APB2Periph_GPIOA //回波接收ECHO端口 #define HC_SR04_ECHO_PORT GPIOA #define HC_SR04_ECHO_PIN GPIO_Pin_12 //12 //HC_SR04超声波初始化 void HC_SR04_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(HC_SR04_TRIG_CLK, ENABLE); //使能PA端口时钟 GPIO_InitStructure.GPIO_Pin = HC_SR04_TRIG_PIN; // 脉冲触发端口(Trig)配置PA4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(HC_SR04_TRIG_PORT, &GPIO_InitStructure); //根据设定参数初始化端口 GPIO_InitStructure.GPIO_Pin = HC_SR04_ECHO_PIN; // 回波接收端口(Echo)配置PA5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(HC_SR04_ECHO_PORT, &GPIO_InitStructure); //根据设定参数初始化端口 } //发送20us的脉冲触发信号 void HC_SR04_start(void) { GPIO_SetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN); //TRIG置高 delay_us(20); GPIO_ResetBits(HC_SR04_TRIG_PORT,HC_SR04_TRIG_PIN); //TRIG置低 delay_ms(10); } hc-sr04.h #include "sys.h" //HC_SR04超声波初始化 void HC_SR04_Init(void); //发送20us的脉冲触发信号 void HC_SR04_start(void); float Senor_Using(void); main.c #include "sys.h" #include "delay.h" #include "hc-sr04.h" #include "usart.h" #include "Printf.h" #include "tim.h" int main(void) { float Distance; RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //系统时钟设置PLL作为系统时钟 delay_init(); //初始化延时函数 uart_init(115200); printf("开始测量距离rn"); /*在发送触发信号后一直等待Echo引脚的响应(变为高电平)并 打开定时器计时直到Echo变为低电平,关闭定时器记录下计时时间*/ HC_SR04_Init(); //HC_SR04超声波初始化配置 TIM3_Int_Init(49999,7199); GPIO_SetBits(GPIOA,GPIO_Pin_11); //TRIG置高 delay_us(20); GPIO_ResetBits(GPIOA,GPIO_Pin_11); //TRIG置低 //等待回响信号 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12) == RESET); TIM_Cmd(TIM3,ENABLE); //使能TIM3定时器 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12) == SET); //回响信号消失 TIM_Cmd(TIM3,DISABLE); //关闭定时器 //获取TIM3计数器的值 Distance = TIM_GetCounter(TIM3)* 340/200.0; //计算距离:cnt * 1/10000 * 340 / 2(单位:m) TIM_SetCounter(TIM3,0); //计数清零 delay_ms(100); printf("测的距离 = %.2f cm rn",Distance); //while(1); } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1376 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1368 浏览 1 评论
791 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
568 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1410 浏览 2 评论
1762浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
489浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
422浏览 3评论
415浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
391浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-30 14:41 , Processed in 0.623009 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号