本文介绍: 该模块基于机器人自动控制应用设计的,针对目前市场上对于超声波传感器模组盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计。具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高、防尘防水、寿命长、可靠性高等一系列优点。

一、A22超声波传感器

在这里插入图片描述

模块基于机器人自动控制应用设计超声波避障传感器针对目前市场上对于超声波传感器模组盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计

具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高、防尘防水、寿命长、可靠性高等一系列优点。

参数

引脚

四根线,分别是VCC、GND、TX、RX。

输出方式

支持多种输出方式

输出格式

UART

输出为4个字节数据,分为是帧头+数据高八位+数据第八位+通讯校验
在这里插入图片描述
距离值= Data_H*256+ Data_L=0X07A1; 转换成十进制等于1953;
modbus寄存器0x0209的参数值为0x00时,单位mm表示当前测量距离值为1953mm
modbus寄存器0x0209的参数值为0x01时,单位为us,表示当前测量的距离回波时间值为1953us,此值除以5.75得mm单位距离值=1953/5.75≈340mm

PWM

公式:S=T*V/2(S为距离值,T为PWM高电平脉宽时间,V为声音在空气中的传播速度)。
在常温下得声速V为348M/S,可简化公式得S= T/57.5 (此时距离S单位为厘米,时间T单位为微秒)。

举例:当输出引线“TX”的PWM高电平脉宽时间T3为10000us时,
得S= T/57.5=10000/57.5≈173.9(cm),表示当前测量的距离值为173.9cm。

软件设计

以下为RT-ThreadUART受控输出方式 代码示例

  1. 定时器每200ms向传感器发送一次触发信号
rt_device_set_rx_indicate(hw_dev, timeout_cb);

/* 设置计数频率(若未设置该项,默认为1Mhz 或 支持最小计数频率) */
rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);

/* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/
mode = HWTIMER_MODE_PERIOD;
ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode);
if (ret != RT_EOK)
{
  rt_kprintf("set mode failed! ret is :%dn", ret);
}

/* 设置定时器超时值为1s并启动定时器 */
timeout_s.sec = 0;      /* 秒 */
timeout_s.usec = 200000;     /* 微秒 */
if (rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s))
{
    rt_kprintf("set timeout value failedn");
}

static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)  
{
    rt_device_write(serial, 0, "1", 1);   //触发信号
    return 0;
}
  1. 串口接收中断函数中释放信号量
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    rt_sem_release(&rx_sem);

    return RT_EOK;
}
  1. main线程接收数据,并判断帧数据
        if(rt_device_read(serial, 0, &ch[t], 1) != 0)
        {
            /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
            rt_sem_take(&rx_sem, RT_WAITING_FOREVER);

            t++;
            if(t==4)
            {
                t=0;
                if(ch[0]==0xFF )
                {
                    int a=(int)ch[1];
                    int b=(int)ch[2];
                    long int c=a*256+b;
                    int d=c%10;
                    c/=10;
                    rt_kprintf("%d.%dn",c,d);
                }
                memset(ch, 0, sizeof(ch));
            }
        }

在这里插入图片描述

原文地址:https://blog.csdn.net/Dustinthewine/article/details/134714947

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24944.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注