CW32L012/F030灵眸X1智能小车——超声波模块配置

萌宠爱好者 阅读:39518 2026-01-06 11:00:58

超声波模块介绍

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

  • 随机文章
  • 热门文章
  • 热评文章
萌宠训练师
排行榜
今日头条

世行发布报告显示今年初中国经济保持增长势头 外交部回应,世行发布报告显示今年初中国经济保持增长势头 外交部回应

  中新网北京6月20日电 (记者 张蔚然 谢雁冰)中国外交部发言人郭嘉昆20日主持例行记者会。 外交部发言人郭嘉昆 薛伟 摄...

中方谈以伊冲突:当务之急是携手推动停火止战,中方谈以伊冲突:当务之急是携手推动停火止战

  中新网北京6月20日电 (记者 张蔚然)中国外交部发言人郭嘉昆20日主持例行记者会。 外交部发言人郭嘉昆 薛伟 摄  ...

2024年江西警方缴获毒品和制毒原料791千克,2024年江西警方缴获毒品和制毒原料791千克

  中新网南昌6月20日电(记者 李韵涵)20日,记者从2025年江西省禁毒工作新闻发布会上获悉,2024年江西公安禁毒部门缴获毒品和制...

人才缺口超百万!低空经济火了 好多新工作等你来,人才缺口超百万!低空经济火了 好多新工作等你来

  据中国民航局预测,2025年,我国低空经济的市场规模将达到1.5万亿元,到2035年有望达到3.5万亿元。那么低空经济还催生了哪些新...

宇树科技完成C轮融资 注册资本增至3.64亿,宇树科技完成C轮融资 注册资本增至3.64亿

  中新网6月20日电(记者 吴家驹 石睿)有媒体报道,宇树科技前段时间完成始于去年年底C轮融资的交割,由中国移动旗下基金、腾讯、锦秋、...