CW32L012/F030灵眸X1智能小车——超声波模块配置 超声波模块介绍
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。如图所示:

测量周期:当接收到 HC-SR04 通过 Echo 管脚输出的高电平脉冲后,便可进行下一次测量,所以测量周期取决于测量距离,当距离被测物体很近时,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_Initstructure;
BTIM_Initstructure.BTIM_Mode=BTIM_Mode_TIMER;
BTIM_Initstructure.BTIM_OPMode=BTIM_OPMode_Repetitive;
BTIM_Initstructure.BTIM_Period=1000-1;
BTIM_Initstructure.BTIM_Prescaler=BTIM_PRS_DIV64;//64分频
BTIM_TimeBaseInit(CW_BTIM1,&BTIM_Initstructure);
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);
Get_Time=0;
BTIM_Cmd(CW_BTIM1,ENABLE);
}
void BTIM1_Stop(void)//关闭定时器
{
BTIM_Cmd(CW_BTIM1,DISABLE);
}
uint32_t Get_Tim_Timer(void)//得到信号反射时间
{
uint32_t time;
time=Get_Time*1000;
time+=BTIM_GetCounter(CW_BTIM1);
BTIM_SetCounter(CW_BTIM1,0);
return time;
}
float Get_Disance(void)//距离计算
{
uint8_t i;
uint16_t time=0;
float Distance=0;
float Temp=0;
float num=0;
for(i=0;i< 10;i++)
{
Trig_Send(1);//trig拉高信号,发出高电平
delay10us(2);
Trig_Send(0);//trig拉低信号,发出低电平
while(Echo_Input==0);
BTIM1_Start();
while(Echo_Input==1);
BTIM1_Stop();
/*Echo发出信号 等待回响信号*/
/*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;
(此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;
(此时应该停止定时器计数),定时器记下的这个时间即为
超声波由发射到返回的总时长;*/
time=Get_Tim_Timer();
Temp=(float)time/58.2; // 获取时间,分辨率为1us
num+=Temp;
Delay_ms(4);
}
Distance=num/10.0;
return Distance;
}
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
全部0条评论
快来发表一下你的评论吧 !