历史上的今天
返回首页

历史上的今天

今天是:2024年09月13日(星期五)

正在发生

2021年09月13日 | 基于stm32的HC-SR04超声波测距模块使用

2021-09-13 来源:eefocus

1 工作原理

使用超声波模块之前,先了解其IO口和工作原理:


1.1 IO说明

VCC: 供5V电源

GND: 为地线

TRIG: 触发控制信号输入

ECHO: 回响信号输出

在这里在这里插入图片描述插入图片描述

1.2 基本工作原理:

认真看好以下工作原理,后面的代码就是基于工作原理来实现的。

(1)采用IO口TRIG触发测距,给最少10us的高电平信号。

(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

(3)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2

时序图:

在这里插入图片描述

2 程序编写

2.1 外设配置

根据两个信号引脚来配置两个单片机的IO口

trig: 需要产生一个10us高电平, 配置为推挽输出;

echo: 等待高电平脉冲并测量其脉冲宽度, 配置为下拉输入

测量echo的高电平持续的时间,需要用到定时器, 因此配置一个定时器,用来计时


void UltrasonicWave_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 对应trig引脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_ResetBits(GPIOB,GPIO_Pin_1);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // 对应echo引脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入

  GPIO_Init(GPIOB, &GPIO_InitStructure);   

 

   //定时器初始化,分频系数为71,则频率为1MHZ,每个计数为1us,(频率越高越精确)

   //重装载值为65535,溢出时间为1us*65536= 65.536ms=0.065536s

   //一个计数周期可以测距 0.065536s * 340m/s / 2  = 11.14112m

TIM_TimeBaseStructure.TIM_Period = 65535; 

TIM_TimeBaseStructure.TIM_Prescaler = 71; 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; 

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //

}


2.2 测距函数

根据工作原理 :

(1)采用IO口TRIG触发测距,给最少10us的高电平信号。


/***** 启动超声波 *****/

void UltrasonicWave_StartMeasure(void)

{

GPIO_SetBits(GPIOB, GPIO_Pin_1);   //拉高PB1电平

delay_us(20);            //持续20us

GPIO_ResetBits(GPIOB, GPIO_Pin_1); //拉低PB1电平

}


(2)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2


/***** 测距 *****/

float UltrasonicWave_Measure(void)   //

{

    while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1);//echo为高电平时,则等待至低电平,才启动超声波

UltrasonicWave_StartMeasure(); //启动超声波

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0);//等待echo的高电平到来

TIM_SetCounter(TIM2,0); //清零计数器

TIM_Cmd(TIM2, ENABLE);  //使能定时器2,开始计数

while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);//等待echo的高电平结束

    TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数

return (TIM_GetCounter(TIM2))/1000000*340/2 *100; //此处单位转换为cm

}


2.3 测距

int main()

{

float distance;

UltrasonicWave_Init(void);//初始化

delay_init();

while(1)

{

    distance = UltrasonicWave_Measure(void); //完成测距

    delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。

    printf("distance:%5.2f ",distance);//打印到串口

        }

}


还可以使用中断方式进行测距, 大致框架如下, 有兴趣自行研究


  //先开启对应引脚双边沿触发中断, 中断服务函数大致如下

  float Distance;

  void EXTI15_10_IRQHandler(void)

  {

if(//发生中断)

{   

if(//上升沿)   

{

TIM_SetCounter(TIM2,0); //清零计数器

TIM_Cmd(TIM2, ENABLE);  //使能定时器2,开始计数

  }

    if(//下降沿)

    {

    TIM_Cmd(TIM52, DISABLE); //失能定时器2,截止计数

Distance=(TIM_GetCounter(TIM2))/1000000*340/2 *100;//此处单位转换为cm

}

}

EXTI_ClearITPendingBit(EXTI_Line10);  //清除中断标志   

 } 

  //主函数

  

```c

extern float Distance;

int main()

{

UltrasonicWave_Init(void);//初始化

while(1)

{

UltrasonicWave_StartMeasure();//启动超声波

    delay_ms(60);//建议测量周期为 60ms以上, 以防止发射信号对回响信号的影响。

    //Distance 在中断服务函数中被重新赋值

    printf("Distance:%5.2f ",Distance);//打印到串口

        }

}


以上超声波模块的使用一次记录

推荐阅读

史海拾趣

Euvis Inc公司的发展小趣事

为了进一步提升竞争力,Euvis Inc公司积极开展跨界合作,与互联网、通信、汽车等领域的企业建立战略合作关系。通过资源整合和优势互补,公司实现了在多个领域的快速发展,进一步巩固了其在电子行业中的领先地位。

Gentron Corp公司的发展小趣事
如果某个LED不亮或闪烁异常,可能是LED本身损坏,需要更换新的LED。
AZ Displays公司的发展小趣事

随着公司规模的扩大和市场份额的提升,AZ Displays开始实施全球化战略。公司在全球范围内建立销售网络和分支机构,积极开拓国际市场。通过与国际知名企业的合作,AZ Displays成功将产品打入国际市场,进一步提升了公司的品牌影响力和市场竞争力。

Cooper Industries公司的发展小趣事

早在2007年,Cooper Industries就展现出其全球扩张的雄心。同年10月8日,该公司与宁波知名企业耐吉科技股份有限公司共同注资3000万美元,成立了库柏耐吉(宁波)电气有限公司。这一合资公司的成立,不仅加强了Cooper在中国市场的地位,也为其全球业务布局增添了重要一环。库柏耐吉(宁波)电气有限公司地处浙江省慈溪市,工业园占地400余亩,位于世界最长跨海大桥——杭州湾跨海大桥的南岸桥头堡区域,其优越的地理位置为公司的发展提供了有力支持。

德崧电子(D-SWITCH)公司的发展小趣事

随着公司业务的不断发展,德崧电子开始积极拓展市场。公司深入分析市场需求和行业趋势,针对不同领域推出了具有针对性的产品和服务。例如,在汽车行业,德崧电子推出了耐高温、耐磨损的汽车专用开关;在家电行业,公司则推出了外观精美、功能丰富的智能开关。这些产品的推出不仅满足了市场的多样化需求,也为公司带来了丰厚的回报。

富之光(Fujicon)公司的发展小趣事

面对制造业的数字化转型趋势,富致科技也积极拥抱变革。公司投入大量资源建设数字化工厂,引入先进的自动化设备和信息化管理系统,实现生产流程的智能化和精细化。通过数字化转型,富致科技不仅提高了生产效率和产品质量,还降低了运营成本,为企业的可持续发展注入了新的动力。同时,公司还注重培养数字化人才,为企业的未来发展储备了宝贵的人力资源。

问答坊 | AI 解惑

C循环

为什么我明明定义了,还是要提示出错? 代码: void readsensor(void)//读传感器 { SEN_EN=1; XC_EN=0; ADDR_EN=1; unsigned int h; for(h=0;h2) { sen_count=0; sen_flag=1; } } 提示: DIJIQUDONG.C(58): error C141: syntax ...…

查看全部问答>

怎样使wince桌面图标文字背景透明???

改壁纸后图标文字背景还是蓝色,怎么改成透明??…

查看全部问答>

Falcom A2D-1 能否GPRS上网?

现在用的是Falcom A2D-1型号的GSM模块,用模块自带的上位机软件直接接PC的串口: 能打电话,能接电话 能发短信,能收短信 但是我实际要做的是用这个模块实现GPRS上网。 请问: 1.这个模块能实现GPRS上网么? 2.GPRS上网和GSM模块有没有关系? ...…

查看全部问答>

此处的int.是什么意思?

此处的int.是什么意思?----1.8V int., 3.3V memory, 3.3V external I/O microprocessor with 16KB I-Cache/16KB D-Cache/MMU…

查看全部问答>

求WINCE API大全

求WINCE5.0 API大全,或者有相关的详细资料也更好. 现在做MODEM通信方面的,如果有相关的API使用方法说明,也请给献出.…

查看全部问答>

请教:STM32USBHID的例程里能增加批量传输的端点吗?

                                 现在例程用中断传输的,想增加批量传输的端点,不知道是否可以?能可以,是否可以描述一下,怎么做?谢谢!…

查看全部问答>

msp430捕获法侧脉宽,最小脉宽能测到多少?

RT,我用的是16M晶振的MCLK,定时器捕获测脉宽,发现最小脉宽只能测到2us左右。 不知是不是我的程序有问题,或者是单片机选型不妥~ 请教各位高手~~…

查看全部问答>

TL494中文资料(doc版)及其典型应用电路

TL494是一种固定频率脉宽调制电路,它包含了开关电源控制所需的全部功能,广泛应用于单端正激双管式、半桥式、全桥式开关电源。TL494有SO-16和PDIP-16两种封装形式,以适应不同场合的要求。…

查看全部问答>

实用衰减反向电路仿真

不知道有没有人碰到类似的问题,我在proteus上仿真了好久,终于有一点眉目了,拿出来与大家分享,好像可以算出来的,不过我太懒了,呵呵!!上图注意事项:T型衰减网络衰减大电压,后面跟一级运放构成的反相器!图中的R1/R2/R3/R4/R5的阻值大小是匹 ...…

查看全部问答>

TMS320F240的框架程序是怎样的?

用C语言表示,谢谢各位了!…

查看全部问答>