lora pingpang系统 4

1 深入了解LoRa技术原理

1.1 LoRa扩频通信原理

1.1.1 模拟无线通信:

模拟无线通信是一种使用模拟信号传输数据的通信方式。这种通信方式已经被数字无线通信所取代,因为数字通信具有更高的效率和可靠性。

  1. 天线:从空中接收到的无线电波转换成微弱的电信号,这些信号随后将被传送到收音机的电路中进行处理。

  2. 输入调谐:输入调谐电路的作用是选择要接收的频率,并将该频率的信号传送到后续电路中。通常,输入调谐电路由可调谐电感和电容构成,通过调整电感或电容的值来选择不同的频率。

  3. 变频(混频):变频器或混频器将输入信号与由振荡器产生的本地振荡信号混合,产生中频信号。这个步骤将原始的无线电信号转换为更易于处理的中频信号,以减少信号在处理过程中的干扰。

  4. 中频放大:中频放大器用于放大中频信号,以增强信号的强度和质量。放大后的信号将被传送到后续的检波器。

  5. 检波:检波器将中频信号转换为音频信号。常见的检波方式包括二极管检波和晶体管检波。检波过程中,中频信号的振幅调制将被解调,得到原始的音频信号。

  6. 前置放大:前置放大器用于进一步放大音频信号,以增加其强度,以便后续的处理。

  7. 功率放大:功率放大器用于将放大后的音频信号的功率增大,以便驱动扬声器产生清晰的声音输出。

1.1.2 数字无线通信: 

数字无线通信的一般原理和主要技术:

  1. 调制与解调(调制解调器): 数字信号需要通过调制技术转换为模拟信号以便在无线介质中传输,接收端则需要通过解调技术将模拟信号转换为数字信号。常见的调制技术包括调幅(AM)、调频(FM)和调相(PM),而解调则是这些过程的逆操作。

  2. 多址技术: 在数字通信中,多址技术允许多个用户在同一频率范围内进行通信。常见的多址技术包括时分多址(TDMA)、频分多址(FDMA)、码分多址(CDMA)等。

  3. 信道编码与纠错码: 为了提高数据传输的可靠性,数字无线通信中常常采用信道编码和纠错码技术。信道编码将数据添加冗余信息,纠错码则在接收端用来检测并纠正传输过程中发生的错误。

  4. 自适应调制: 自适应调制技术允许根据信道条件的变化动态地调整调制方式和参数,以最大程度地提高数据传输速率和可靠性。

  5. 天线技术: 天线在数字无线通信中起着至关重要的作用,它们可以影响信号的传输范围、方向性以及抗干扰能力等。常见的天线技术包括定向天线、增益天线和多天线系统等。

  6. 安全与加密: 数字无线通信中的数据传输往往需要保证安全性,因此常常采用加密技术对数据进行保护,防止被未经授权的用户窃取或篡改。

  7. 网络协议: 数字无线通信通常基于各种网络协议进行数据交换,例如Wi-Fi、蓝牙、LTE等。这些协议规定了数据的格式、传输方式以及通信过程中的控制机制等。

1.1.3 无线传播方式

1.1.4 无线通信传播路径: 

1.1.5 无线通信噪声:

无线通信噪声是指在无线通信过程中引入的干扰信号。这些干扰信号可能来自于自然环境、其他无线设备或通信信道本身的噪声。无线通信系统需要采取一些技术手段来抑制噪声,以保证通信质量。

1.1.6 扩频通信的由来:

扩频通信是一种利用宽带信号来传输窄带数据的通信技术。它的由来可以追溯到二战期间的军事通信系统,用于抵抗干扰和窃听。扩频通信通过将窄带信号展开到较大的频带宽度,使得信号在频域上分散,从而提高了通信系统的抗干扰性能。

1.1.7 扩频通信算法:

C是信道容量,单位为比特每秒(bps),它是在理论上可接受的误码率(BER)下允许的最大数据速率,表示通信信道所允许的信息量,也表示了所希望得到的性能。
W单位是Hz,是要求的信道带宽,是付出的代价,因为频率是一种有限的资源。
S/N是信号噪声功率比,表示周围的环境或者物理特性(例如障碍、阻塞和干扰等)。
信噪比指传播的信号的功率与传播信号的过程中参入的噪声的功率之比,也就是说,信噪比越大,抑制噪声的能力越强,声音越清晰一般这个比值用分贝(dB)表示
在信道中对于给定的信噪比要无差错发射信息,我们只需要执行基本的信号扩频操作:提高发射带宽。

1.1.8 扩频通信原理:

把用户数据和扩频数据异或,从而得到发送数据。(发送数据增加了带宽,但是提高了发射质量)

干扰信号和噪声频谱被扩展后,其谱密度降低,这就大大降低了进入信号通带内的干扰功率,使解调器的输入信噪比提高,从而提高系统的抗干扰能力。

1.2 LoRa关键技术参数

1.2.1 信号带宽(BW)7.8-500khz

增加BW,可以提高有效数据速率以缩短传输时间,但是 以牺牲部分接受灵敏度为代价。对于LoRa芯片SX127x,LoRa带宽为双边带宽(全信道带宽),而FSK调制方式的BW是指单边带宽。

1.2.2 扩频因子(SF)6-12 

LoRa采用多个信息码片来代表有效负载信息的每个位,扩频信息的发送速度称为符号速率(Rs),而码片速率与标称的Rs比值即为扩频因子(SF,SpreadingFactor),表示了每个信息位发送的符号数量。

1.2.3 编码率(CR)1-4

编码率(或信息率)是数据流中有用部分(非冗余)的比例。也就是说,如果编码率是k/n,则对每k位有用信息,编码器总共产生n位的数据,其中n-k是多余的。 LoRa采用循环纠错编码进行前向错误检测与纠错。。使用该方式会产生传输开销。

LoRa关键技术参数 

LoRa符号速率Rs计算: Rs=BW/(2^SF)
LoRa数据速率DR计算: DR= SF*( BW/2^SF)*CR
LoRaWAN主要使用了125kHz信号带宽设置,但其他专用协议可以利用其他的信号带宽(BW)设置。改变BW、SF和CR也就改变了链路预算和传输时间,需要在电池寿命和距离上做个权衡。

LoRa参数设置

1.3 LoRa数据收发任务

1.3.1 LoRa数据发送序列

判断是否有新的发送,没有就返回标准模式

1.3.2 LoRa数据接收序列 

等待接收中断

1.3.3 Radio事件任务 

2 LoRa PingPong系统设计

2.1 PingPong系统设计需求

2.2 PingPong系统通信机制 

发送完要等到发送完成才能进行接收。

无线通信机制都是通过这几个状态实现的 LoRa.h 

获取数据包:给到数据和大小 buffer内存拷贝
把发送缓冲器赋值到射频的里面,同时设置无线任务状态为发送初始化,就可以发送

2.3 PingPong系统业务流程 

Master:判断无线模块工作状态,是否接收到pang数据,发送ping数据 

Slave:和主机一样,是否接收到ping数据,发送pang数据。 

2.4 LoRa参数设置

3 LoRa PingPong系统功能开发

3.1 IAR工程配置

添加主机和从机的定义

目的:3个工程公用一个代码

3.2 搭建框架

3.2.1 建立功能函数

main.c

//******************
// 函数: MLCD_SHOW
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:主机显示任务
//
//******************void MLCD_SHOW(void)
{//LCDgpio重新初始化LCD_GPIO_Init();}//******************
// 函数: SLCD_SHOW
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:从机显示任务
//
//******************void SLCD_SHOW(void)
{//LCDgpio重新初始化LCD_GPIO_Init();}//******************
// 函数: Master_Task
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:主机无线任务
//
//******************void Master_Task(void)
{}//******************
// 函数: Slave_Task
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:从机无线任务
//
//******************void Slave_Task(void)
{}

 

3.2.2 建立数据结构 

#define BUFFERSIZE 4//ping pang数据 字符串
uint8_t PingMsg[] = "PING";
uint8_t PongMsg[] = "PONG";// 缓存区空间大小 ping pang 4个字节,
uint16_t BufferSize = BUFFERSIZE;
uint8_t Buffer[BUFFERSIZE];//设备类型判断
#ifdef MASTER
uint8_t EnbleMaster = true;
#else
uint8_t EnbleMaster = false;
#endif//数据记录
uint32_t Master_TxNumber = 0;
uint32_t Master_RxNumber = 0;uint32_t Slave_TxNumber = 0;
uint32_t Slave_RxNumber = 0;//无线收发的数据结构,来自radio.c的tRadioDriver* RadioDriverInit();
tRadioDriver *Radio = NULL;

3.3 编码

3.3.1 功能函数编码

//无线收发的数据结构,来自radio.c的tRadioDriver* RadioDriverInit();
tRadioDriver *Radio = NULL;//******************
// 函数: MLCD_SHOW
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:主机显示任务
//
//******************void MLCD_Show(void)
{uint8_t str[20] = {0};  //申请一个可变的字符串20个字节//LCDgpio重新初始化LCD_GPIO_Init(); // lcd和lora公用spi接口,spi特殊要操作miso,操作lcd要重新初始化sprintf((char*)str,"%d",Master_RxNumber); //获取到Tx NumberGui_DrawFont_GBK16(64,48,BLACK,YELLOW,str);memset((char*)str,0,strlen((const char*)str));//清除strsprintf((char*)str,"%d",Master_TxNumber);Gui_DrawFont_GBK16(64,64,BLACK,YELLOW,str);//操作完SPI重新初始化HAL_SPI_DeInit(&hspi1);MX_SPI1_Init();}//******************
// 函数: SLCD_SHOW
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:从机显示任务
//
//******************void SLCD_Show(void)
{uint8_t str[20] = {0};//LCDgpio重新初始化LCD_GPIO_Init();sprintf((char*)str,"%d",Slave_RxNumber);Gui_DrawFont_GBK16(64,48,BLACK,YELLOW,str);memset((char*)str,0,strlen((const char*)str));sprintf((char*)str,"%d",Slave_TxNumber);Gui_DrawFont_GBK16(64,64,BLACK,YELLOW,str);//SPI重新初始化HAL_SPI_DeInit(&hspi1);MX_SPI1_Init();}//******************
// 函数: Master_Task
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:主机无线任务
//
//******************void Master_Task(void)
{switch(Radio->Process()) //用swtich判断业务状态(发送完成、接收完成){case RF_RX_DONE:Radio->GetRxPacket(Buffer,&BufferSize);   //接收函数获取数据printf("Master_Task:RX_____%s\n",Buffer);if(strncmp((const char*)Buffer,(const char*)PongMsg,strlen((const char*)PongMsg)) == 0)  //判断是否为pong数据{LedToggle(LED_RX);Master_RxNumber++;Radio->SetTxPacket(PingMsg,strlen((const char*)PingMsg));HAL_Delay(200);}break;case RF_TX_DONE:LedToggle(LED_TX);  //调用led的函数Master_TxNumber++;  //发送完成计数+1Radio->StartRx();   //开启接收模式break;default :break;}
}//******************
// 函数: Slave_Task
//
// 参数:  无
//
// 返回值: 无
// 
// 函数描述:从机无线任务
//
//******************void Slave_Task(void)
{switch(Radio->Process()){case RF_RX_DONE:Radio->GetRxPacket(Buffer,&BufferSize);printf("Slave_Task:RX_____%s\n",Buffer);if(strncmp((const char*)Buffer,(const char*)PingMsg,strlen((const char*)PingMsg)) == 0){LedToggle(LED_RX);Slave_RxNumber++;Radio->SetTxPacket(PongMsg,strlen((const char*)PongMsg));HAL_Delay(200);}break;case RF_TX_DONE:LedToggle(LED_TX);Slave_TxNumber++;Radio->StartRx();break;default :break;}

 3.3.2 Main函数编码

```
int main(void)
{/* USER CODE BEGIN 1 */uint8_t RegVersion = 0;/* USER CODE END 1 *//* MCU Configuration----------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_ADC_Init();MX_USART1_UART_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */Lcd_Init();//Lcd_Clear(YELLOW);//Gui_DrawFont_GBK16(10,10,GREEN,RED,"hello world");  //只支持英文showimage(gImage_logo);HAL_Delay(500);Lcd_Clear(YELLOW);Gui_DrawFont_GBK16(0,0,RED,GREEN,"  LoRa Topology  ");#ifdef MASTERGui_DrawFont_GBK16(0,16,RED,GREEN,"     Master     ");
#elseGui_DrawFont_GBK16(0,16,RED,GREEN,"     Slave      ");
#endifGui_DrawFont_GBK16(0,32,BLACK,YELLOW,"SSID:");Gui_DrawFont_GBK16(64,32,BLACK,YELLOW,"30");Gui_DrawFont_GBK16(0,48,BLACK,YELLOW,"RX:");//Gui_DrawFont_GBK16(64,48,BLACK,YELLOW,"255"); //剪切到MLCD和SLCD中Gui_DrawFont_GBK16(0,64,BLACK,YELLOW,"TX:");//Gui_DrawFont_GBK16(64,64,BLACK,YELLOW,"255");//剪切到MLCD和SLCD中//SPI重新初始化HAL_SPI_DeInit(&hspi1);MX_SPI1_Init();SX1276Read( REG_LR_VERSION, &RegVersion );if(RegVersion != 0x12){printf("LoRa read Error!\r\n");printf("LoRa RegVersion = %d!\r\n",RegVersion);}else{printf("LoRa read OK!\r\n");printf("LoRa RegVersion = %d!\r\n",RegVersion);}//无线任务初始化Radio = RadioDriverInit();  Radio->Init();/* USER CODE END 2 *///判断是主机,发送数据,若是从机接收数据
#ifdef MASTERRadio->SetTxPacket(PingMsg,strlen((const char*)PingMsg));printf("I am Master!\n");
#elseRadio->StartRx();printf("I am Slave!\n");
#endif/* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */if(EnbleMaster == true){MLCD_Show();Master_Task();}else{SLCD_Show();Slave_Task();}/* USER CODE BEGIN 3 */}/* USER CODE END 3 */}

3.3.3 LoRa驱动源码修改

增加Fsk的两个代码

注释掉dio2

 

tLoRaSettings LoRaSettings =
{
470000000, // RFFrequency
20, // Power
9, // SignalBw [0: 7.8kHz, 1: 10.4 kHz, 2: 15.6 kHz, 3: 20.8 kHz, 4: 31.2 kHz,
// 5: 41.6 kHz, 6: 62.5 kHz, 7: 125 kHz, 8: 250 kHz, 9: 500 kHz, other: Reserved]
7, // SpreadingFactor [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips]
2, // ErrorCoding [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
true, // CrcOn [0: OFF, 1: ON]
false, // ImplicitHeaderOn [0: OFF, 1: ON]
0, // RxSingleOn [0: Continuous, 1 Single]
0, // FreqHopOn [0: OFF, 1: ON]
4, // HopPeriod Hops every frequency hopping period symbols
1000, // TxPacketTimeout
1000, // RxPacketTimeout
4, // PayloadLength (used for implicit header mode)
};

 

3.4 实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——图的概念,图的存储结构,图的遍历(dfs,bfs)

目录 1.图的定义和术语 2.案例引入 1.六度空间理论 3.图的类型定义 4.图的存储结构 1.邻接矩阵 1.无向图的邻接矩阵表示法 2.有向图的邻接矩阵表示法 3.网(有权图)的邻接矩阵表示法 代码示例: 2.采用邻接矩阵表示法创建无向图…

MySQL 表的增删改查

文章目录 一、什么是CRUD?二、新增(Create)1、单行数据 全列插入2、多行数据 指定列插入3、插入特殊类型 三、查询(Retrieve)1、全列查询2、指定列查询3、表达式查询4、指定别名5、去重6、排序7、条件查询基本查询&a…

java算法day44 | ● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

完全背包理论基础 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。 体现在代码中就是对背包的遍历顺序不同。01背包是逆序遍历背包,完全背包是顺序遍历背包。 518. 零钱兑换 II class Solution {public int change(int amount, int[] coin…

IMAP的要点:旅行前需要了解的内容

你是否经常因会议而出差,需要在各种设备上灵活地访问你的电子邮件?如果是的话,你可能会想了解你的电子邮件系统是如何通过使用互联网消息访问协议(IMAP)来工作的,这样当你不在办公桌前时,你可以…

Java基础 - 代码练习

第一题&#xff1a;集合的运用&#xff08;幸存者&#xff09; public class demo1 {public static void main(String[] args) {ArrayList<Integer> array new ArrayList<>(); //一百个囚犯存放在array集合中Random r new Random();for (int i 0; i < 100; …

SpringCloud - 如何本地调试不会注册到线上环境(Nacos)?

问题描述 有时候我们需要本地调试注册到 Nacos 上&#xff0c;但是会影响线上服务的 Feign 请求打到本地导致不通影响了线上业务。 原因分析 一般最传统的解决方案就是修改本地 bootstrap.yml 的 spring.cloud.nacos.discovery.namespace spring:application:name: app-serv…

jvisualvm 使用教程

之前看过 jvisualvm&#xff0c;但是那个时候对 JVM 并不是很熟悉&#xff0c;后面看了下八股文&#xff0c;看了下 JVM 的相关知识之后&#xff0c;发现多了解点 JVM 的东西&#xff0c;对我们 CRUD 其实是有指导意义的&#xff0c;就比如我们通常会 new 一堆的没有用到的对象…

使用 Spring Email 和 Thymeleaf 技术,向新注册用户发送激活邮件(二)

本篇博客对应“2.2 开发注册功能”小结 对应视频: 开发注册功能 开发注册功能-续 注册功能是相对比较复制的功能&#xff0c;对于一个相对复杂的功能&#xff0c;可以把这个功能进行拆解。把这个功能的流程想清楚&#xff0c;就知道怎么拆解了&#xff1a; 也可以按照请求进行…

[每周一更]-第92期:Go项目中的限流算法

这周五在清明假期内&#xff0c;提前更新文章 很多业务会有限流的场景&#xff0c;比如活动秒杀、社区搜索查询、社区留言功能&#xff1b;保护自身系统和下游系统不被巨型流量冲垮等。 在计算机网络中&#xff0c;限流就是控制网络接口发送或接收请求的速率&#xff0c;它可防…

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法&#xff0c;先得知道两个概念&#xff1a;未排序序列&#xff0c;已排序序列。 原理&#xff1a;以升序为例&#xff0c;选择排序算法的思想是&#xff0c;先将整个序列当做未排序的序列&#xff0c;以序列的第一个元素开始。然后从左…

K8S - Deployment 的版本回滚

当前状态 先看deployment rootk8s-master:~# kubectl get deploy -o wide --show-labels NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES …

理解pytorch的广播语义

目录 什么是广播运算 广播的条件 示例 示例1 示例2 示例3 补1 示例4 原位运算 示例5 参与广播运算的两个tensor&#xff0c;必须是从右向左对齐 总结规律 两个tensor可以做广播运算的条件&#xff1a; 两个可以互相广播的tensor运算的步骤&#xff1a; 例子&#x…

【深度学习】深度学习md笔记总结第3篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

整数与浮点数在内存中的存储

整数与浮点数在内存中的存储 一&#xff0c;大小端存储二&#xff0c;整数在内存中的存储三&#xff0c;浮点数在内存中的存储3.1浮点数的存储规则3.2浮点数的存储过程3.2.1有效数字M3.2.2指数E3.2.3浮点数存储的特殊情况4&#xff0c;例题讲解 在C语言的编程中&#xff0c;我们…

分布式系统架构中的相关概念

1.1、衡量网站的性能指标 响应时间&#xff1a;指执行一个请求从开始到最后收到响应数据所花费的总体时间。并发数&#xff1a;指系统同时能处理的请求数量。 并发连接数&#xff1a;指的是客户端向服务器发起请求&#xff0c;并建立了TCP连接。每秒钟服务器连接的总TCP数量请…

Python--Django--说明

Django 是基于python 的 Web 开发框架. &nsbp;   Web开发指的是开发基于B/S 架构, 通过前后端的配合, 将后台服务器上的数据在浏览器上展现给前台用户的应用. &nsbp;   在早期, 没有Web框架的时候, 使用 Python CGI 脚本显示数据库中的数据. Web框架致力于解决一些…

c++宏有什么离谱操作?

Boost.Preprocessor确实是一个非常强大而复杂的C宏库&#xff0c;专门用于元编程&#xff0c;即在编译时进行代码生成和变换。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程不妨点个关注&#xff0c;给个评论222&…

面试总结------2024/04/04

1.面试官提问&#xff1a;你说你在项目中使用springsecurity jwt 实现了登录功能&#xff0c;能简单讲一下怎么实现的吗&#xff1f; 2.使用RabbitMQ实现订单超时取消功能 订单状态定义 首先&#xff0c;我们需要定义订单的不同状态。在这个示例中&#xff0c;我们可以定义以下…

实验一 Windows 2008虚拟机安装、安装VM Tools、快照和链接克隆、添加硬盘修改格式为GPT

一、安装vmware workstation软件 VMware workstation的安装介质&#xff0c;获取路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1AUAw_--yjZAUPbsR7StOJQ 提取码&#xff1a;umz1 所在目录&#xff1a;\vmware\VMware workstation 15.1.0 1.找到百度网盘中vmwa…

Pandas Dataframe合并连接Join和merge 参数讲解

文章目录 函数与参数分析otheronhowlsuffix, rsuffix, suffixesleft_index, right_index 函数与参数分析 在pandas中主要有两个函数可以完成table之间的join Join的函数如下&#xff1a; DataFrame.join(other, onNone, how‘left’, lsuffix‘’, rsuffix‘’, sortFalse, v…