目录

本博客将采用标准库和HAL库实现

所用设备选择

引脚说明

与单片机的接线表

标准库实现

HAL库实现


本博客将采用标准库和HAL库实现

所用设备选择

单片机型号:STM32F103C8T6

 激光测距传感器型号:WT-VL53L0 L1

采用串口TTL电平输出,可以接USB-TTL串口到电脑,或者直接接MCU的串口,实时输出距离数据(ASCII码)。

该模块可以直接接收串口数据

本博文任务是将数据提取出来,以便其它模块使用。

引脚说明

模块的引脚说明:

序号 激光测距模块 引脚颜色
1 VCC 红色
2 RXD 绿色
3 TXD 黄色
4 SCL -
5 SDA -
6 GND 黑色

与单片机的接线表

序号 激光测距模块 引脚颜色 单片机STM32
1 VCC 红色 VCC/5V
2 RXD 绿色 PA2(USART2_TX)
3 TXD 黄色 PA3(USART2_RX)
4 SCL -
5 SDA -
6 GND 黑色 GND
7 - - PA9(USART1_TX)
8 - - PA10(USART1_RX)

这里选用了两个串口

串口1的作用是将数据测得数据显示在电脑端(串口助手显示)

串口2采集测得的数据,并进行处理。

标准库实现

usart.c

void uart1_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   //使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX     GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启串口接受中断  串口1暂时不需要接收数据,只需要发送数据即可USART_Cmd(USART1, ENABLE);                    //使能串口1
}void uart2_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  //使能USART2时钟 //USART1_TX   GPIOA.2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2//USART1_RX     GPIOA.3初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   //收发模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART2, ENABLE);                    //使能串口1
}void USART2_IRQHandler(void)                   //串口2中断服务程序
{int i = 0;    //  循环变量int n = 0; //  循环变量int Dis = 0;       //  距离char InStr[20]="";     //  存放整数字符串if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){USART_ClearITPendingBit(USART2, USART_IT_RXNE);//清除标志位aRxBuffer =USART_ReceiveData(USART2);//(USART1->DR);  //读取接收到的数据RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;          //  接收数据if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] ){USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//关闭串口接受中断  为了处理数据if(NULL != strstr(RxBuffer, "Valid"))          //  判断是否是有效数据{
//              for(i=0;i<strlen(RxBuffer);i++)               /// 调试代码 可删除
//              {
//                  USART_SendData(USART1, RxBuffer[i]);
//                  delay_ms(1);
//              }       for(i = 15;i<strlen(RxBuffer);i++){TxBuffer[i-15] = RxBuffer[i];}for(i = 0;i<strlen(TxBuffer);i++){if(TxBuffer[i]<='9' && TxBuffer[i]>='0'){InStr[n++] = TxBuffer[i];}}Dis = atoi(InStr);                  //  距离 一个整数 可以直接使用///****调试 串口1 输出**开始**********sprintf(TxBuffer,"%d\r\n",Dis); for(i=0;i<strlen(TxBuffer);i++){USART_SendData(USART1, TxBuffer[i]);    delay_ms(1);}///****调试 串口1 输出**结束********** }memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组memset(InStr,0x00,sizeof(InStr)); //清空数组Uart1_Rx_Cnt = 0;n = 0;USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断  为了处理数据}}
}

实现效果:

HAL库实现

核心代码就在回调函数这个地方:


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{int i = 0;    //  循环变量int n = 0; //  循环变量int Dis = 0;       //  距离char InStr[20]="";     //  存放整数字符串/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function Should not be modified, when the callback is needed,the HAL_UART_TxCpltCallback could be implemented in the user file*/if(aRxBuffer != 0){RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;         //  接收数据}if( 'm' == RxBuffer[Uart1_Rx_Cnt-1] && 'm' == RxBuffer[Uart1_Rx_Cnt-2] ){if(NULL != strstr(RxBuffer, "Valid"))          //  判断是否是有效数据{
//          HAL_UART_Transmit(&huart1, (uint8_t *)RxBuffer, strlen(RxBuffer),0xFFFF);   //将收到的信息发送出去
//          while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);                              //检测UART发送结束
//          HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", strlen("\r\n"),0xFFFF);           //将收到的信息发送出去
//          while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);                              //检测UART发送结束        for(i = 15;i<strlen(RxBuffer);i++){TxBuffer[i-15] = RxBuffer[i];}for(i = 0;i<strlen(TxBuffer);i++){if(TxBuffer[i]<='9' && TxBuffer[i]>='0'){InStr[n++] = TxBuffer[i];}}Dis = atoi(InStr);                  //  距离 一个整数 可以直接使用sprintf(TxBuffer,"%d\r\n",Dis); HAL_UART_Transmit(&huart1, (uint8_t *)TxBuffer, strlen(TxBuffer),0xFFFF); //将收到的信息发送出去while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束}memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组memset(TxBuffer,0x00,sizeof(TxBuffer)); //清空数组memset(InStr,0x00,sizeof(InStr)); //清空数组Uart1_Rx_Cnt = 0;n = 0;}while(HAL_OK != HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1));   //开启接收中断,并保证开启成功}

实现效果如下:

如有问题或需求可私信交流

源码链接(标准库与HAL库):

(1条消息) STM32F103实现激光测距传感器测距WT-VL53L0L1-C文档类资源-CSDN文库
吾芯电子工作室

STM32F103实现激光测距传感器测距WT-VL53L0 L1相关推荐

  1. 【机器人】激光测距传感器的数据处理步骤

    激光测距传感器FT55-RLAM-800 注:这里针对我们所使用的激光测距传感器FT 55-RLAM-800,不同测距传感器处理方式不完全相同. 问: 怎么从激光测距传感器得到数据并对其测量数据进行处 ...

  2. STM32F103驱动HCSR04超声波测距显示

    STM32F103驱动HCSR04超声波测距显示 目录 超声波模块介绍 ①实物图 ②产品说明 ③电气参数 ④超声波工作原理 驱动代码 ①STM32配置初始化代码 ①超声波驱动应用代码 ②超声波距离计算 ...

  3. shineblink VL53L0X激光测距传感器

    VL53L0X激光测距 一.本例程实现功能 二.VL53L0X传感器介绍 三.传感器性能描述 四. 传感器工作模式配置说明 五.接线图 七.完整代码 八.代码运行结果 九.关于校准 一.本例程实现功能 ...

  4. dfrobot红外激光测距传感器的精度,测量距离和应用场景

    最近有很多朋友问起红外激光测距传感器的一些问题,发现大家都很关注它的精度和原理以及应用场景.今天就给大家以dfrobot家一款主推的红外激光测距传感器为例子做下介绍. 首先个人觉得这是一款高性价比的红 ...

  5. 激光测距传感器选型指南 这2项重要指标一定要关注

    激光雷达作为机器人定位导航的标配,在帮助机器人自主行走中发挥了重要作用,作为主要用途是激光测距的传感器而言,测量距离.扫描频率.角分辨率.测量精度等数据必定是大部分人衡量的重要指标,但除此之外,还有两 ...

  6. ABB机器人利用激光测距传感器求与机器人法兰Z向夹角

    文章目录 前言 一.知识储备 二.代码说明 前言 激光测距传感器是工业自动化生产中的常用传感器,利用此传感器可以测出我们需要的数值,但装在机器人末端执行器时,传感器的安装角度并不一定能保证一定与机器人 ...

  7. 虹科技术 | 快速准确测量0.05m-500m--虹科dimetix激光测距传感器的优势

    引言 传统上,激光测距传感器测量飞行时差或相移.但是这些方法各有优缺点:飞行时差测量速度很快,但由于时间测量要求很高,通常不够准确.相移的测量明显更准确,但由于评估更复杂,不如飞行时差测量快.Dime ...

  8. 虹科案例 | 利用激光测距传感器进行锯齿定位

    PART ONE 应用描述 在这项应用中,两个激光测距传感器分别安装在一个凸出部分的末端的两侧,用以测量其两侧到锯齿的距离的差.一个微型控制器会按照预设,记录测量数据并提供一个方便快捷的前后位置校准的 ...

  9. 【虹科案例】Dimetix 激光测距传感器:筒仓内料位高度的测量

    摘要 应用领域: 仓储/加工  应用类型: 水平高度测量/监测 塑料成型.食品加工和建筑材料等行业都需要大量的散装材料.随着这些行业向准时制制造(just-in-time manufacturing ...

最新文章

  1. 关于MyEclipse连接SQLServer和Mariadbsql
  2. STL的forward_list链表
  3. 产品经理与交互设计师的区别是什么?
  4. 润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...
  5. golang(2):beego 环境搭建
  6. 推荐一些逐步深入学习mysql的书籍
  7. 如何以应届生的身份进入阿里巴巴?
  8. Gartner 魔力四象限 -- 应用安全检测
  9. 放假在家/异地/无法使用学校局域网-如何快速登录知网/web of science等学术平台
  10. HDU-6578 Blank
  11. android native 代码内存泄露 定位方案
  12. 金蝶报表制作_金蝶财务软件报表制作
  13. C语言中的指数函数pow()问题
  14. LitJson问题汇总
  15. 百度超级链(xuperchain),make时出现错误
  16. PMP学习笔记:采购合同类型
  17. 计算机操作系统pcb是什么意思,简述PCB的含义以及作用
  18. 程序员疯抢的 Java 面试宝典(PDF 版)限时开源,别把大厂想的那么难,关键是你准备得如何
  19. 05年,今年可是本命年啊~~~
  20. 《编译原理》-3.上下文无关文法及分析

热门文章

  1. 重磅开源:标星超过 10k+ 的免费接口,API 的搬运工,真香!
  2. 共轭梯度法求解线性方程组Ax=b(附代码)
  3. FAQ:Docker和K8s部署常见问题汇总(持续更新)
  4. PHP中使用SHA256,如何在php5.3.0中使用sha256
  5. minio操作,文件上传下载
  6. facebook是什么鬼_如果facebook是真正的沉默多数怎么办
  7. console.log()用法
  8. 2020-2021中科院陈玉福算法设计与分析期末考试
  9. python虚拟环境管理器
  10. 「手把手教你」Python计算股票收益率、Alpha和Beta值