超声波测距+OLED显示

news/2024/11/23 12:44:57/

文章目录

    • 超声波测距+OLED显示
      • 超声波
      • STM32引脚配置
      • 代码
        • 启动超声波模块
        • 接收超声波数据回传

超声波测距+OLED显示

  • 超声波模块使用的是HC-SR04模块,单片机使用的是STM32F407

超声波

  • 超声波时序图

在这里插入图片描述

  • 以上时序图表明你只需要提供一个 10uS 以上脉冲触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
  • 公式:uS/58=厘米或者 uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。
  • 模块需要和STM32工地

STM32引脚配置

  • Trig引脚使用的是PE0,使用推挽输出即可

在这里插入图片描述

  • Echo引脚,就是回传信号的引脚,使用的是TIM10的输入通道1,就是PF6引脚。因为要测量输入高电平的时长,直接使用定时计数器的输入捕获的功能会比较方便。STM32F407ZEt6的TIM10的输入通道一,只对应一路捕获通道

在这里插入图片描述

  • 不要忘记打开中断

在这里插入图片描述

  • 输入捕获的原理和计数的原理差不多,先规定捕获通道是上升沿触发,还是下降沿触发,还是双边都触发;
  • 触发之后,申请一次捕获中断,同时将CNT的数值锁存到捕获寄存器CCR中,我们可以把此时的CCR的数值记录到value1中,还要清楚捕获中断标志
  • 然后等待第二次触发,又会将CNT的数值锁存到CCR中,再把此时的数值记录到value2中,还要清楚中断标志位,把两个数值相减,再乘计一个数的时间,就是电平持续的时间或者周期等。

代码

启动超声波模块

  • 根据上面超声波的时序,写出启动信号,即向Trig引脚发送一段不低于10微秒的高电平

    void Ultrasonic_start(void)
    {HAL_TIM_Base_Start(&htim10);//启动定时计数器10HAL_TIM_IC_Start_IT(&htim10,TIM_CHANNEL_1);/* 启动定时计数器捕获通道1,并开启中断 */HAL_GPIO_WritePin(Tr1g_1_GPIO_Port,Tr1g_1_Pin,GPIO_PIN_RESET);delay_us(50);HAL_GPIO_WritePin(Tr1g_1_GPIO_Port,Tr1g_1_Pin,GPIO_PIN_SET);delay_us(50);HAL_GPIO_WritePin(Tr1g_1_GPIO_Port,Tr1g_1_Pin,GPIO_PIN_RESET);TIM10->CNT=0;  //可以不对CNT进行清零,此处清零是为了不再后面处理计数溢出的情况
    }
    

接收超声波数据回传

  • 在硬件上Echo引脚连接的是TIM10的通道1,并在捕获通道1进行输入捕获,初始化时极性设置的是上升沿有效;

  • 所以在第一次捕获时,捕获的是上升沿,说明回传信号的高电平开始;

  • 在第一次捕获中断的中断函数中应该读取CCR中的数值并把捕获通道的极性进行修改为下降沿有效,用来检测高电平的结束

  • 在第二次捕获中断到来时也要读取CCR中的数值,并将捕获通道的极性设置为上升沿有效,准备检测下一阶段的高电平信号

  • 在第二次捕获完成后,可以先关闭计数器,等待计算完成再打开,避免这次还没有计算完,下一次的就已经到了

  • 最重要的是不要忘记清除中断标志位,如果使用的是HAL库的回调函数,那么就不需要手动清除了,HAL库会帮你完成

  • 计算的函数如下,会使用OLED显示:

    uint16_t flag=0;  //第二次捕获结束,即高电平已经结束了
    /*capture[0]用来存放第一次捕获的数值;capture[1]用来存放第二次捕获的数值,capture[2]存放差值*/
    uint16_t capture[3]={0}; 
    /*使用OLED来进行输出的数组*/
    char shuchu0[12]={0};
    unsigned char shuchu[12]={0};
    void Ultrasonic_Receive_Display(void)
    {float data=0;if(flag==1){flag=0;capture[2]=capture[1]-capture[0];/*计算数值*/data=((capture[2])*1.0)/58.0;for(int k1=0;k1<3;k1++){capture[k1]=0;}/*进行显示*/int m=0;sprintf(shuchu0,"%0.2f cm",data);  //保留小数点后两位for(m=0;shuchu0[m]!='\0';m++){shuchu[m]=(unsigned char)shuchu0[m];}shuchu[m]='\0';OLED_CLS();OLED_ShowStr(0,3,"distance:",1);OLED_ShowStr(0,4,shuchu,1);HAL_Delay(100);}else{OLED_CLS();OLED_ShowStr(0,4,"please wait",2);HAL_Delay(100);}}
    
  • 捕获中断的回调函数如下:

    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {uint16_t cnt=1; //用来区分是第一次还是第二次的数值if(TIM10==htim->Instance){switch (cnt){case 1:/*第一次通道捕获触发,高电平信号开始*/capture[0]= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);/*用HAL库时要先清除通道的极性,再更改通道的极性*/TIM_RESET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1);   TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING);   cnt++;Start_Flag=0; //外部定义,发送超声波启动信号的标志,此时还不能启动break;case 2:/*第二次表示高电平的结束*/capture[1]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);cnt=1;flag=1;  //外部定义,开始进行就算并发送给LED显示的标志Start_Flag=1; /*关闭定时计数器,防止下次的干扰*/HAL_TIM_IC_Stop_IT(htim, TIM_CHANNEL_1);HAL_TIM_Base_Stop(htim);/*清除通道极性,并设置为上升沿触发,为下次做准备*/TIM_RESET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1);               TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);	break;}}
    }
    
  • 主体部分写入一个循环里面就可以了

    for(;;){while(Start_Flag==1){Ultrasonic_start();osDelay(100);Ultrasonic_Receive_Display();}}
    

http://www.ppmy.cn/news/441851.html

相关文章

LTDZ_35-4400M 频谱仪使用

硬件模块如下图&#xff1a; 这块板子&#xff0c;能进行简单的扫频监测使用&#xff0c;我是用来对设计的射频模块的输出频率测试的&#xff0c;由于频谱仪价格都比较昂贵&#xff0c;对于做DIY实验来说&#xff0c;是不现实的。我就入手了这个模块&#xff0c;用来简单的扫频…

基于战舰V3的4.3寸电容触摸屏

基于战舰V3的4.3寸电容触摸屏 原理简介 4.3寸电容屏可以等效为800*480个点&#xff0c;当我们触碰到LCD屏幕时&#xff0c;触摸点的电容值会发生变化&#xff0c;此时内置MPU可以读取到这一点的准确坐标我们访问其中的寄存器就可以获取该信息&#xff0c;而且电容屏不像电阻屏…

超声波测距OLED显示

文章目录 一、前言二、超声波模块介绍1、超声波模块2、HC-SR04模块 三、硬件连接四、软件代码五、效果展示六、代码链接 一、前言 超声波模块是通过声音的传播进行测距&#xff0c;声音传播的速度与所用时间通过运算得出距离&#xff0c;精度相对较高&#xff0c;可用于近距离…

11.6寸eDP显示屏添加以及所遇问题总结

Platform: ROCKCHIP Chip: RK3399 OS: Android7.1.2 Kernel: 4.4.126 edp屏添加 edp驱动被分成两个文件&#xff0c;一个是rk驱动文件&#xff1a; analogix_dp-rockchip.c, 另一个是drm驱动文件analogix_dp_core.c 1.硬件原理图&#xff1a; 电源IO对应gpio1_b5&#xff0c;…

MINSTER触摸屏维修贝加莱显示屏维修5RP920.1505-KC3

触摸屏触摸无反应处理方法&#xff1a;要查看各接线接口是否呈现松动&#xff0c;然后查看串口及中止号是否有抵触&#xff0c;若有抵触&#xff0c;应调整资源&#xff0c;避开抵触。再查看接触屏表面有没有呈现裂缝&#xff0c;如有裂缝应及时替换。还需要查看接触屏表面是否…

0.96寸oled屏幕在任意区域画点

首先&#xff0c;我使用的是SPI协议的0.96寸oled屏幕&#xff0c;如图 相信大家在淘宝下单的时候&#xff0c;能以各种渠道获得“中景园科技”的关于驱动该屏幕的源码&#xff0c;但令人遗憾的是&#xff0c;源码中仅仅包含了写数字&#xff0c;写指数&#xff0c;写符号&…

128g固态硬盘服务器,买美光就后悔 浦科特M5S 128G/SSD评测

浦科特SSD在M3系列占据性能巅峰&#xff0c;M3P无人出其左右&#xff0c;不过高昂的成本也摆在那里。面对美光M4的价格冲击&#xff0c;即使普通M3S系列也难于打开市场缺口。浦科特如何能把固态硬盘性能和价格有效衔接起来&#xff0c;让它具有超高的性价比&#xff1f;今天我们…

电子邮件服务器的工作原理,电子邮件工作原理 电子邮件有什么特点呢

电子邮件是交流信息的一种通信方式&#xff0c;可以用来传输文件和图片&#xff0c;还是非常方便的。很多人对电子邮件的工作原理感到好奇&#xff0c;电子邮件工作原理是怎样的?电子邮件有什么特点呢? 电子邮件工作原理 电子邮件工作原理 电子邮件的工作过程遵循客户-服务器…