传感器驱动系列之超声波传感器

目录

一、传感器原理

二、传感器驱动代码

END


一、传感器原理

        超声波传感器发出的啁啾声通常在23 kHz到40 kHz之间,远高于人类听觉在20 kHz时的典型可听范围,因此称为超声波。使用这种啁啾可以测量声音从发出到物体反弹所需的时间,与蝙蝠寻找猎物的回声定位基本原理相同。由于室温下空气中的声速为每秒343米,所以可以利用发射到返回的时间转换为距离值。其中超声波传感器模块实物图如下图所示。

        超声波传感器模块的基本工作原理说明如下:

  1. 采用IO口TRIG触发测距,给至少10us的高电平信号;
  2. 模块自动发送8个40khz的方波,自动检测是否有信号返回;
  3. 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

        超声波模块工作示意图如下图所示。

        而测试距离可以通过以下公式进行计算:

测试距离 = (高电平时间 * 声速(343m/s)) / 2

二、传感器驱动代码

        我们想要实现超声波测距需要按照其时序图进行代码编写,所以需要引入延时函数,如果在裸机上进行开发的话普通的延时没什么大问题;但是如果想要在操作系统上实现的话则需注意延时函数会阻塞系统的正常运行,因此使用定时器可能效果会好一些。这里提供的是基于裸机的代码。

驱动C源代码:

#include "hcsr04.h"
#include "delay.h"

/* ----------------------- 传感器引脚定义 -------------------- */
#define     HCSR_Trig_GPIO_CLK      RCC_APB2Periph_GPIOC
#define     HCSR_Trig_GPIO_PORT     GPIOC
#define     HCSR_Trig_GPIO_PIN      GPIO_Pin_1
        
#define     HCSR_Echo_GPIO_CLK      RCC_APB2Periph_GPIOC
#define     HCSR_Echo_GPIO_PORT     GPIOC
#define     HCSR_Echo_GPIO_PIN      GPIO_Pin_2


#define     HCSR_Trig(x)            x ? (HCSR_Trig_GPIO_PORT->BSRR = HCSR_Trig_GPIO_PIN) : (HCSR_Trig_GPIO_PORT->BSRR = HCSR_Trig_GPIO_PIN << 16)
#define     HCSR_Echo               GPIO_ReadInputDataBit(HCSR_Echo_GPIO_PORT, HCSR_Echo_GPIO_PIN)


/* 超声波模块 引脚初始化 */
void ultrasonic_init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(HCSR_Trig_GPIO_CLK | HCSR_Echo_GPIO_CLK, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin   = HCSR_Trig_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       /* 时钟频率 */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;       /* 推挽输出 */
    GPIO_Init(HCSR_Trig_GPIO_PORT, &GPIO_InitStructure);    /* 根据设定参数初始化 */
    
    GPIO_InitStructure.GPIO_Pin   = HCSR_Echo_GPIO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       /* 时钟频率 */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;  /* 浮空输入 */
    GPIO_Init(HCSR_Echo_GPIO_PORT, &GPIO_InitStructure);    /* 根据设定参数初始化 */
}

/* 超声波测距 若为负数代表测距失败 */
short ultrasonic_GetDistance(void)
{
    u16 distance = 0;      //距离设置
    u16 t = 0;             //计数器
    
    HCSR_Trig(1);   //触发端(Trig)置1
    delay_us(13);   //延时10us以上
    HCSR_Trig(0);   //触发端(Trig)置0
    
    //等待回响信号(Echo)信号拉低
    while(HCSR_Echo == 0) {
        t++;
        delay_us(1);
        if (t >= 100000) //大于100ms认为通讯失败
            return -1;
    }
    t = 0;
    //等待回响信号(Echo)出现高电平
    while(HCSR_Echo == 1) {
        t++;
        /* 
            超声波模块的测量精度:3mm
            声速:(340m)/s = 340000mm/1000ms = 340mm/ms = 0.34mm/us
            单位延时时间t0 = 3/0.34 = 8.823us ≈ 9us
         */
        delay_us(9);
        if (t >= 100000) //大于100ms认为通讯失败
            return -2;
    }
    t = t / 2; //时间t为发送+接收两段 需要/2
    distance = 3 * t; //距离=测量精度*持续时间
    
    return distance;
}

        驱动H源代码:

#ifndef _HCSR04_H
#define _HCSR04_H

#include "stm32f10x.h"

/* ---------------------------- 函数清单 -------------------------- */
void        ultrasonic_init         (void);
short       ultrasonic_GetDistance  (void);

#endif

END

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SDB传感器驱动板,可以将采集回来的所有传感器数据,通过RS23串口发送给主控PC或者嵌入式系统。同时SDB传感器驱动板带两路直流电机驱动,具备两路旋转编码器接口,内带PID电机控制算法。主控可通过串口精确控制两路电机速度。SDB板的IO0到IO7可设置为舵机控制口,这在机器人系统内带例如舵机云台,机械手夹持的情况下是非常有用的。 SDB传感器驱动板引脚图: SDB直接支持的传感器有: 1.I2C总线通讯协议的传感器:Devantech公司的SRF04 / SRF05 / SRF08 / SRF10 超声波传感器,SP03 TTS,CMP03电子罗盘等。 2.RS485总线传感器,例如URM04超声波,ADIO扩展板等。 3.SPI接口。 4.CAN工业总线接口。 5.模拟量输出传感器:GP2D12等红外距离传感器,IDG300陀螺仪传感器,加速度传感器,光敏传感器等。 6.开关量输出的传感器,例如红外开关,碰撞模块,跌落传感器等。 SDB传感器驱动板技术规格: 工作电源:内带稳压电路,宽工作电压6V-12V(极限电压15V) 工作电流:150mA(供电电压12V) 工作温度范围 :-10~+70℃ 使用Cortex-M3内核 ARM 32BIT处理器,运算速度90MIPS,总线间通信均采用DMA(存储器直接访问)方式,通信和处理速度更快 与主控通信接口方式:RS232串口或者TTL电平串口。波特率可设置为9600、19200、38400和115200BPS 具备8路12BIT高精度模数转换 11路数字输入/输出接口,其中8路(IO0-IO7)可设置为舵机控制口 8路舵机控制口可控制舵机的度数及其旋转速度 1路I2C总线 1路RS485总线 1路CAN总线(2.2版本未使用) 1路SPI总线(2.2版本未使用) 两路直流电机控制,每通道4A电流,具有AB两相旋转编码器接口,内部集成参数可调整的PID算法,可精确控制电机转速。可读取回电机旋转圈数用于里程计数。电机电流可读取,可用于电流保护 尺寸:长96mm,宽90mm,高20mm。安装孔兼容PC104结构。 重量:约87g SDB传感器驱动板应用教程及资料截图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值