STM32C8t6 驱动激光雷达实战(二)

这篇具有很好参考价值的文章主要介绍了STM32C8t6 驱动激光雷达实战(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

思岚激光雷达


数据格式为:角度(°):距离(mm)。

STM32C8t6驱动激光雷达

前言

前面我们了解了激光雷达的原理,下面用C8T6驱动激光雷达

一、接线说明

激光雷达一共有 6 个引脚,其中 2 个 GND,2 个 5V,一对 RX 和 TX 引脚, 按照下表 1-1 的接线要求接在 STM32 单片机上。其中 2 个 5V 因为电流要求, 可以接在 TTL 转串口的 5V 引脚或者 ST Link 的 5V 引脚上。激光雷达的立贴座 端子不能直接与 STM32 连接,需将引脚用排线接出。
STM32C8t6 驱动激光雷达实战(二)
STM32C8t6 驱动激光雷达实战(二)
STM32C8t6 驱动激光雷达实战(二)

二、效果实现

1.串口通信实现

想要实现激光雷达数据的接收和发送,就需要将雷达接在串口上,因为串口 1 需要用来与电脑通信,所以这里选用串口 2,通过查找芯片手册可以找到串口 2 的 TX 引脚为 A2,RX 引脚为 A3。
注意:这里的串口 2 并不需要使用接收中断,因为雷达数据传输速度非常快, 如果使用中断的话很容易卡死在中断里。

在串口 1 的接收中断里,我们把接收到的数据通过串口 2 发送出去。

void USART1_IRQHandler(void) //串口 1 中断服务程序
 { 
 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是 0x0d 0x0a 结尾) 
 { 
 Res =USART_ReceiveData(USART1); //读取接收到的数据 
 USART_SendData(USART2,Res); //发送到串口 2 
 while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); //等待发送完成 
 } 
 }

在串口调试助手与 STM32 单片机的通信中,串口通信的波特率 115200、停 止位 1、数据位 8、校验位无,接收使用 16 进制。通过串口调试助手发送指令来 控制激光雷达时,需要勾选 16 进制发送,取消发送新行。
STM32C8t6 驱动激光雷达实战(二)
STM32C8t6 驱动激光雷达实战(二)
STM32C8t6 驱动激光雷达实战(二)

2.激光雷达数据处理

因为不用在串口 2 接收中断里接收数据,所以我们只需要判断 USART_SR 状态寄存器的 RXNE(读数据寄存器非空)位就可以了。接收到数据后,我们先 判断有效性,判断激光雷达发送数据第一位的质量是否满足要求(直接过滤掉质 量低的点),即判断质量是否为 0x3E,如果满足要求再将之后的 4 位数据接收进行处理。
STM32C8t6 驱动激光雷达实战(二)

if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))  // 串口寄存器接收到数据
					{
						Res =USART_ReceiveData(USART2);	//读取接收到的数据
						if(flag)
						{
							i++;
							if(i>4)
							{
								flag=0;
								i=0;
							}
							if(i==2)printf("%d:",Res<<1);  //打印角度数据(°)
							if(i==3)distan=Res>>2;
							if(i==4)
							{
								result=Res;
								result=result<<6|distan;  //整合距离数据
								printf("%d\r\n",result);  // 打印距离数据(mm)
							}
							
						}

如果只是单纯想要接收数据的话可以将数据处理部分改为将接收到的数据 发送到串口 1。 处理数据的方式主要是通过移位操作来完成对数据的整合和解算,再将数据 通过 printf 的方式打印到串口 1 进行输出。因为激光雷达数据的校验位很少,通 过判断质量的方式来解算数据非常简单有效。
STM32C8t6 驱动激光雷达实战(二)

数据格式为:角度(°):距离(mm)。

3.PWM 控制激光雷达启停

和控制电机一样

TIM_SetCompare1(TIM2,1000); //电机开始转动,Compare1 最大值
TIM_SetCompare1(TIM2, 0); //设置 pwm,电机停止转动

三、完整代码

用正点原子的串口例程就行,主函数的代码改成下面的

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "TIMER.h"

u8 scan[]={0xA5,0x20}; //开始扫描采样(SCAN)命令请求
u8 stop[]={0xA5,0x25}; //停止扫描命令
u8 Res,distan;
u16 result;
int main(void)
{
	u8 i,j,flag;
	u8 t=0; 
	delay_init();	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart1_init(115200);   //串口初始化
	uart2_init(115200); 
	KEY_Init();	 			//按键初始化
	TIM2_PWM_Init(1000,71);  //pwm初始化
	TIM_SetCompare1(TIM2, 0);//pwm设置输出低电平
	j=1;
	printf("开始\r\n");  // 打印距离数据(mm)
	while(1)
	{
		if(j)
		{	
			
				TIM_SetCompare1(TIM2,1000);  //电机开始转动,Compare1最大值
				for (i=0;i<2;i++)  //发送开始扫描指令
				{	
					USART_SendData(USART2,scan[i]);
					while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
				}
				i=0;
				flag=0;//数据有效性标志
				while(1)
				{
					if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))  // 串口寄存器接收到数据
					{
						Res =USART_ReceiveData(USART2);	//读取接收到的数据
//						USART_SendData(USART1,Res);  //发送原始数据
//						while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
						if(flag)
						{
							i++;
							if(i>4)
							{
								flag=0;
								i=0;
							}
//							if(i==1)if(!(Res&0x01))flag=0,i=0;  //第二位C的奇偶校验
							if(i==2)printf("%d:",Res<<1);  //打印角度数据(°)
							if(i==3)distan=Res>>2;
							if(i==4)
							{
								result=Res;
								result=result<<6|distan;  //整合距离数据
								printf("%d\r\n",result);  // 打印距离数据(mm)
							}
							
						}
						if(Res==0x3E)flag=1;  //有效性数据判断
					}
					t=KEY_Scan();  //单击结束
					if(t==KEY_PRE)
					{	
						delay_ms(100);
						j=j^0x01;
						break;
					}
				}
			  }
					
	}
}

STM32C8t6 驱动激光雷达实战(二)文章来源地址https://www.toymoban.com/news/detail-432606.html

到了这里,关于STM32C8t6 驱动激光雷达实战(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【基于stm32c8t6的智能加湿系统】

    🔥这里是小殷学长,单片机毕业设计篇1 基于stm32的智能加湿系统 🧿创作不易,拒绝白嫖 可私 ------------------------------------------智能加湿系统----------------------------------------- 1.按键进行界面模式切换和参数阈值调节(定时时间、温湿度值) 2.蓝牙进行界面模式切换和参数阈值

    2024年02月16日
    浏览(30)
  • 学习笔记——STM32C8T6如何配置普通IO口

     最近使用stm32f103c8t6时,想要使用PA15端口作为普通io口输出电平信号,但是发现配置不生效,于是就去网上查,发现要关闭初始状态下芯片默认的专用复位功能,于是总结了一下几个配置普通io口的引脚: 有: PA13  PA14  PA15  PB3  PB4 同时,这些引脚主功能(复位后)的功能

    2024年02月02日
    浏览(34)
  • STM32学习笔记(三)端口复用与重映射(stm32c8t6)

    记录一下学习过程 1.端口复用 STM32有很多内置外设,这些外设的外部引脚是与GPIO复用的。默认情况下,这些GPIO口只能作为普通的IO口输入输出,把一个GPIO口的引脚复用为内置外设的功能引脚,通过这些GPIO口就可以使用内置外设了,这个过程叫做复用。但不是每一个引脚都用

    2023年04月27日
    浏览(35)
  • STM32学习笔记(五)串口空闲中断+DMA实现不定长收发(stm32c8t6)

    记录一下学习过程 DMA DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个 地址空间复制到另外一个地址空间。 这一过程无需cpu的参与,从而提高cpu使用的效率 DMA相关的参数:1 数据的源地址、2 数据传输的目标地址 、3 传输宽度,4 传输多少字节,5 传

    2024年02月14日
    浏览(33)
  • 使用stm32c8t6和mpu6050制作一台穿越机

    介绍:使用stm32c8t6和mpu6050制作一款低价飞控,固件用的是开源的betaflight_3.2.5_NAZE,飞行噪声很小,可能是桨叶好,乾丰5寸3叶桨。 原理图: PCB: 拿到嘉立创打样后: 焊接: 飞控需要单独5v供电,随便找了各降压模块,某宝大概3元钱,插入3s电池,调节旋钮,电源稳压到5v,

    2024年02月02日
    浏览(25)
  • 【单片机毕业设计1-基于stm32c8t6的智能加湿系统】

    🔥这里是小殷学长,单片机毕业设计篇1 基于stm32的智能加湿系统 🧿创作不易,拒绝白嫖 可私 ------------------------------------------智能加湿系统----------------------------------------- 1.按键进行界面模式切换和参数阈值调节(定时时间、温湿度值) 2.蓝牙进行界面模式切换和参数阈值

    2024年02月11日
    浏览(35)
  • 实现语音识别系统:手把手教你使用STM32C8T6和LD3320(SPI通信版)实现语音识别

            本文实际是对LD3320(SPI通信版)的个人理解,如果单论代码和开发板的资料而言,其实当你购买LD3320的时候,卖家已然提供了很多资料。我在大学期间曾经多次使用LD3320芯片的开发板用于设计系统,我在我的毕业设计作品中也有添加这个系统功能,用于添加整个系

    2024年02月06日
    浏览(29)
  • STM32F103C8T6(HAL库)驱动舵机

    常见的舵机分为360°和180°两种,本次对180°舵机进行驱动,舵机驱动需要通过PWM信号进行驱动。本文通过定时器中的PWM信号设定使得SG90舵机进行不同角度的转动。 对于舵机的驱动,需要20ms的脉冲,高电平时间在0.5ms-2.5ms区间即可控制舵机在0-180°角度进行转动。常见角度对应

    2024年02月05日
    浏览(32)
  • STM32F103C8T6 驱动 oled 4针篇

    大部分买的STM32F103C8T6属于国产的,会导致程序烧录报错,如果出现问题参考另一篇STM32F103C8T6程序烧录方法_流浪法师解剖鱼的博客-CSDN博客 环境配置好后,编写程序烧录就可以了。 测试了增加上拉电阻不行。测试了厂家给的程序还是不行。查看器件参数,写的3.3-6V供电,当时

    2024年02月07日
    浏览(29)
  • STM32F103C8T6继电器驱动篇

    由于设计的东西是一个电机,但是stm32端口输出电流太小,所以采用继电器控制,通过实际接线测试发现,单片机的IO口驱动不了继电器,当继电器接到IO口上时,端口电压会将至2.2V左右,更加驱动不了继电器了。 所以,为了可以驱动继电器,重新设计了电路,通过三极管来

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包