STM32F103实现激光测距传感器测距WT-VL53L0 L1
目录
本博客将采用标准库和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相关推荐
- 【机器人】激光测距传感器的数据处理步骤
激光测距传感器FT55-RLAM-800 注:这里针对我们所使用的激光测距传感器FT 55-RLAM-800,不同测距传感器处理方式不完全相同. 问: 怎么从激光测距传感器得到数据并对其测量数据进行处 ...
- STM32F103驱动HCSR04超声波测距显示
STM32F103驱动HCSR04超声波测距显示 目录 超声波模块介绍 ①实物图 ②产品说明 ③电气参数 ④超声波工作原理 驱动代码 ①STM32配置初始化代码 ①超声波驱动应用代码 ②超声波距离计算 ...
- shineblink VL53L0X激光测距传感器
VL53L0X激光测距 一.本例程实现功能 二.VL53L0X传感器介绍 三.传感器性能描述 四. 传感器工作模式配置说明 五.接线图 七.完整代码 八.代码运行结果 九.关于校准 一.本例程实现功能 ...
- dfrobot红外激光测距传感器的精度,测量距离和应用场景
最近有很多朋友问起红外激光测距传感器的一些问题,发现大家都很关注它的精度和原理以及应用场景.今天就给大家以dfrobot家一款主推的红外激光测距传感器为例子做下介绍. 首先个人觉得这是一款高性价比的红 ...
- 激光测距传感器选型指南 这2项重要指标一定要关注
激光雷达作为机器人定位导航的标配,在帮助机器人自主行走中发挥了重要作用,作为主要用途是激光测距的传感器而言,测量距离.扫描频率.角分辨率.测量精度等数据必定是大部分人衡量的重要指标,但除此之外,还有两 ...
- ABB机器人利用激光测距传感器求与机器人法兰Z向夹角
文章目录 前言 一.知识储备 二.代码说明 前言 激光测距传感器是工业自动化生产中的常用传感器,利用此传感器可以测出我们需要的数值,但装在机器人末端执行器时,传感器的安装角度并不一定能保证一定与机器人 ...
- 虹科技术 | 快速准确测量0.05m-500m--虹科dimetix激光测距传感器的优势
引言 传统上,激光测距传感器测量飞行时差或相移.但是这些方法各有优缺点:飞行时差测量速度很快,但由于时间测量要求很高,通常不够准确.相移的测量明显更准确,但由于评估更复杂,不如飞行时差测量快.Dime ...
- 虹科案例 | 利用激光测距传感器进行锯齿定位
PART ONE 应用描述 在这项应用中,两个激光测距传感器分别安装在一个凸出部分的末端的两侧,用以测量其两侧到锯齿的距离的差.一个微型控制器会按照预设,记录测量数据并提供一个方便快捷的前后位置校准的 ...
- 【虹科案例】Dimetix 激光测距传感器:筒仓内料位高度的测量
摘要 应用领域: 仓储/加工 应用类型: 水平高度测量/监测 塑料成型.食品加工和建筑材料等行业都需要大量的散装材料.随着这些行业向准时制制造(just-in-time manufacturing ...
最新文章
- 关于MyEclipse连接SQLServer和Mariadbsql
- STL的forward_list链表
- 产品经理与交互设计师的区别是什么?
- 润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...
- golang(2):beego 环境搭建
- 推荐一些逐步深入学习mysql的书籍
- 如何以应届生的身份进入阿里巴巴?
- Gartner 魔力四象限 -- 应用安全检测
- 放假在家/异地/无法使用学校局域网-如何快速登录知网/web of science等学术平台
- HDU-6578 Blank
- android native 代码内存泄露 定位方案
- 金蝶报表制作_金蝶财务软件报表制作
- C语言中的指数函数pow()问题
- LitJson问题汇总
- 百度超级链(xuperchain),make时出现错误
- PMP学习笔记:采购合同类型
- 计算机操作系统pcb是什么意思,简述PCB的含义以及作用
- 程序员疯抢的 Java 面试宝典(PDF 版)限时开源,别把大厂想的那么难,关键是你准备得如何
- 05年,今年可是本命年啊~~~
- 《编译原理》-3.上下文无关文法及分析
热门文章
- 重磅开源:标星超过 10k+ 的免费接口,API 的搬运工,真香!
- 共轭梯度法求解线性方程组Ax=b(附代码)
- FAQ:Docker和K8s部署常见问题汇总(持续更新)
- PHP中使用SHA256,如何在php5.3.0中使用sha256
- minio操作,文件上传下载
- facebook是什么鬼_如果facebook是真正的沉默多数怎么办
- console.log()用法
- 2020-2021中科院陈玉福算法设计与分析期末考试
- python虚拟环境管理器
- 「手把手教你」Python计算股票收益率、Alpha和Beta值