模块学习(四)——超声波测距

今天想着把测距模块全部一网打尽了,把点对点和点对面两种测距全部搞定,于是有了这篇关于超声波模块的博客分享,主要还是分享代码,原理啥的网上都有,这次是基于MSP430F5529的driverlib库,没有找到开源的代码就自己分享一下了!

1.基本原理

还是稍稍讲一下原理,不然等下可能代码看不懂。两个引脚,一个TRIG,一个ECHO,就是触发和回响,顾名思义,trig是用来触发启动超声波模块的,echo模块是用来回收超声波的。此次使用的是US-100超声波模块,其实和常见的HC-SR04/5系列是一样的,代码均可用。

基本原理
trig引脚给一个大于10us的高电平脉冲,即会启动超声波模块。

启动之后,模块内部会发送一段8个40KHZ的脉冲,随后,在echo引脚会接受到一段时长的高电平,这个高电平时长就是模块发出的脉冲出去之后,碰到障碍物返回的时间。

2.代码

废话不多说,直接上大家最喜欢的代码。

1.初始化配置

/*
 * ultrasonic.c
 *
 *  Created on: 2022年7月19日
 *      Author: S10
 */
#include "ultrasonic.h"



void wave_Init(void)
{
    GPIO_setAsOutputPin(Trig_Port,Trig_Pin);//设置触发引脚为输出模式


    GPIO_setAsPeripheralModuleFunctionInputPin(Echo_Port,Echo_Pin);//设置接收引脚为输入模式

    //Start timer in continuous mode sourced by SMCLK
    Timer_A_initContinuousModeParam initContParam = {0};//定义连续模式初始化结构体
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;//确定时钟源SMCLK
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_16;//16分频
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//禁用Tim A中断
    initContParam.timerClear = TIMER_A_DO_CLEAR;//重置计数方向等.....
    initContParam.startTimer = false;//先不开启计数器
    Timer_A_initContinuousMode(TIMER_A2_BASE, &initContParam);

    //清除比较模式中断(初始化比较模式)
    Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,
        TIMER_A_CAPTURECOMPARE_REGISTER_2
        );

    Timer_A_initCaptureModeParam initCapParam = {0};//定义比较模式初始化结构体
    initCapParam.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;//选择TIM_A2的捕获比较通道2
    initCapParam.captureMode = TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE;//捕获上升沿
    initCapParam.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;//确定输入选择为CCIxA(这个不知道怎么看怎么确定)
    initCapParam.synchronizeCaptureSource = TIMER_A_CAPTURE_SYNCHRONOUS;//与时钟同步
    initCapParam.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;//使能捕获中断
    Timer_A_initCaptureMode(TIMER_A2_BASE, &initCapParam);

    Timer_A_startCounter( TIMER_A2_BASE,//开启计时
            TIMER_A_CONTINUOUS_MODE
                );

    //Enter LPM0, enable interrupts开启全局中断
    __bis_SR_register(GIE);

    //For debugger
    __no_operation();
}

void wave_star(void)
{
    GPIO_setOutputHighOnPin(Trig_Port,Trig_Pin);
    delay_us(20);//10us高电平即可触发
    GPIO_setOutputLowOnPin(Trig_Port,Trig_Pin);
}


/*
 * ultrasonic.h
 *
 *  Created on: 2022年7月19日
 *      Author: S10
 */

#ifndef ULTRASONIC_H_
#define ULTRASONIC_H_
#include "driverlib.h"

#define Trig_Port GPIO_PORT_P2
#define Trig_Pin  GPIO_PIN4
#define Echo_Port GPIO_PORT_P2
#define Echo_Pin  GPIO_PIN5

#define CPU_CLOCK       16000000
#define delay_us(us)    __delay_cycles(CPU_CLOCK/1000000*(us))

void wave_Init(void);
void wave_star(void);

#endif /* ULTRASONIC_H_ */

初始化代码大家根据自己所选引脚进行修改即可。

2.中断服务函数

switch(__even_in_range(TA2IV,14))//中断标志位——对应捕获通道
  {
    case 2 :break;//如果是CCR1产生的中断
    case 4 : //如果是CCR2产生的中断
        if(GPIO_getInputPinValue(Echo_Port,Echo_Pin) == 1)//读取此时电平状态,高电平则为上升沿捕获
        {
            Data_first = Timer_A_getCaptureCompareCount(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
        }
        else//读取此时电平状态,低电平为下降沿捕获
        {
            Data_second = Timer_A_getCaptureCompareCount(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
            if(overflow_times == 0)
                HIGH_Time = (Data_second - Data_first);
            else
                HIGH_Time = ((Data_second - Data_first) + overflow_times * 65535);

            Distance = (((float)HIGH_Time/1000000)* 340)/2 ;//m
        }
//        Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
        break;
    case 10: break;
    case 14:
        if(GPIO_getInputPinValue(Echo_Port,Echo_Pin))
        {
            overflow_times++;
        }
        else
            overflow_times = 0;
//        Timer_A_clearTimerInterrupt(TIMER_A2_BASE);
        break;//此时发生计数器溢出
    default: break;
  }

    // Enable global interrupt
    _BIC_SR_IRQ(LPM0_bits);

大概就是这些了,还需要注意的一点是在主函数中要记得调用超声波启动函数。

在使用过程中,超声波模块和平面的法向量之间的角度需要注意,否则会造成测量不准确。

该模块测量精度在2cm-450cm,可谓是非常强大了.有任何疑问可以私信我或者评论区留言,看到一定回。有表述不好的地方或者可以优化的地方,也请各位点出来一下,共同进步!

HC-SR04超声波测距模块是一种常用的测距传感器,可以通过发送超声波脉冲并接收回波信号来测量距离。在STM32库函数版中,可以通过以下步骤来使用HC-SR04超声波测距模块: 1. 首先,需要包含"sys.h"头文件,并初始化HC_SR04超声波模块,可以使用HC_SR04_Init()函数进行初始化。\[1\] 2. 在测距之前,需要向Trig控制端输入至少10us的高电平触发信号,可以使用HC_SR04_start()函数发送20us的脉冲触发信号。\[1\] 3. HC-SR04模块内部会发送8个40KHz的方波并检测回波信号,一旦检测到回波信号,Echo接收端会输出高电平回响信号,高电平的持续时间就是超声波从发射到返回的时间。根据公式:距离=高电平时间*声速(340M/S)/2,可以计算出测得的距离。\[2\] 总结来说,使用STM32库函数版的HC-SR04超声波测距模块,需要初始化模块并发送触发信号,然后根据回响信号的高电平时间计算出距离。 #### 引用[.reference_title] - *1* *2* [STM32——库函数版——超声波测距模块](https://blog.csdn.net/qq_45844792/article/details/111215858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32连接HC-SR04超声波测距(结合STM32CubeMX和HAL库函数)](https://blog.csdn.net/wuwenbin12/article/details/118575989)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值