超声波模块介绍SR04超声波模块是一种广泛使用的测距传感器,主要用于利用超声波测量物体与传感器之间的距离。它是一种低成本、高精度且易于使用的传感器,常用于机器人、智能家居、无人机、汽车防撞系统等项目。以下是SR04超声波模块的主要特点及应用:
测距范围: SR04 模块的测距范围通常在2 厘米至400 厘米之间,使其适合各种应用。
高精度: 具有良好的测量精度,通常可达3毫米,这使得它适合需要精确测量的场合。
工作原理: SR04 模块通过发射超声波脉冲并测量声波反射回来所需的时间来计算距离。传感器的超声波发射和接收分别由两个探头(发射器和接收器)完成。
简单的接口:通常使用四个简单的引脚:GND、VCC、Trig(触发信号)和Echo(回声信号),以方便连接到微控制器(例如Arduino)。
低功耗: 在待机模式下,SR04功耗低,适合电池供电的项目。
超声波模块工作原理
只需向Trig引脚输入10US以上的高电平(触发信号),系统即可发出8个40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号时,通过Echo 引脚输出。根据Echo引脚输出高电平的持续时间可以计算出距离值。即距离值为:(高电平时间*340m/s)/2。
当测量距离超出HC-SR04的测量范围时,Echo引脚仍会输出高电平信号,高电平宽度约为66ms。如图所示:
测量周期:通过Echo引脚接收到HC-SR04输出的高电平脉冲后,即可进行下一次测量,因此测量周期取决于测量距离。当与被测物体距离很近时,Echo返回的脉冲宽度较窄,测量周期较短;当与被测物体距离较远时,Echo返回的脉冲宽度较宽,测量周期相应变长。最坏的情况是被测物体超出超声波模块的测量范围。此时返回的脉冲宽度最长,约为66ms,因此最坏情况下的测量周期略大于66ms(70ms就足够了)。
电路连接该模块与主控板上的CW32L012/F030连接如下:
两个引脚分别连接到PA8和PA15端口。
工程代码在文件HC_SR04.C中写入以下代码
#define Trig_Send(x) GPIO_WritePin(CW_GPIOA, GPIO_PIN_8, (GPIO_PinState)(x))#define Echo_Input GPIO_ReadPin(CW_GPIOA, GPIO_PIN_15)uint16_t Get_Time;/****************************定时器配置中断周期为1ms********************************/void TIM_Init(void){ RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM,ENABLE); BTIM_TimeBaseInitTypeDef BTIM_Init结构; BTIM_Initstruct.BTIM_Mode=BTIM_Mode_TIMER; BTIM_Initstruct.BTIM_OPMode=BTIM_OPMode_Repetitive; BTIM_Initstruct.BTIM_Period=1000-1; BTIM_Initstruct.BTIM_Prescaler=BTIM_PRS_DIV64;//64分频BTIM_TimeBaseInit(CW_BTIM1,BTIM_Initstruct); BTIM_ITConfig(CW_BTIM1,BTIM_IT_OV,ENABLE);//BTIM_Cmd(CW_BTIM1,ENABLE); NVIC_SetPriority(BTIM1_IRQn,8);//中断优先级NVIC_EnableIRQ(BTIM1_IRQn);//使能中断}void HC_SR04_Init(void){ __RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pins=GPIO_PIN_8; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, GPIO_InitStruct); GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN; GPIO_InitStruct.Pins=GPIO_PIN_15; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, GPIO_InitStruct); Trig_Send(0); TIM_Init();}void BTIM1_Start(void)//开启定时器{ BTIM_SetCounter(CW_BTIM1,0);获取时间=0; BTIM_Cmd(CW_BTIM1,ENABLE);}void BTIM1_Stop(void)//关闭定时器{ BTIM_Cmd(CW_BTIM1,DISABLE);}uint32_t Get_Tim_Timer(void)//获取信号反射时间{ uint32_t time;时间=Get_Time*1000;时间+=BTIM_GetCounter(CW_BTIM1); BTIM_SetCounter(CW_BTIM1,0); return time;}float Get_Disance(void)//距离计算{ uint8_t i; uint16_t时间=0;浮动距离=0;浮点温度=0;浮点数=0; for(i=0;i10;i++) { Trig_Send(1);//trig将信号拉高并发出高电平延时10us(2); Trig_Send(0);//trig将信号拉低并发出低电平while(Echo_Input==0); BTIM1_Start(); while(Echo_Input==1); BTIM1_Stop(); /*Echo发送信号,等待回声信号*//*输入方波后,模块会自动发射8个40KHz声波。同时,echo引脚(echo)的电平会由0变为1; (此时应启动定时器);当模块接收到超声波返回时,echo引脚的电平会由1变为0; (此时应停止定时器计数),定时器记录的时间即为超声波从发射到返回的总持续时间; */时间=Get_Tim_Timer();温度=(浮动)时间/58.2; //获取时间,分辨率为1us num+=Temp;延迟_ms(4);距离=num/10.0;返回距离;}void BTIM1_IRQHandler(void){ if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV)==1) { Get_Time++; } BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV);}
在main.c中写入以下代码
int main(void){ OLED_Init();//初始化HC_SR04_Init(); OLED_ShowString(1,1,'hello');//OLED显示字符串while(1) { OLED_ShowString(2,1,'Dis:'); OLED_ShowNum(2,5,Get_Disance(),3);//距离显示OLED_ShowString(2,9,'cm'); }}
工作现象将代码烧入主控板后,可以观察到以下现象
OLED显示屏第一行第一列显示字符串hello
第二行显示距离单位cm
标题:CW32L012/F030灵眸X1智能小车——超声波模块配置
链接:https://yqqlyw.com/news/sypc/67729.html
版权:文章转载自网络,如有侵权,请联系删除!