单片机

1695720798862707.jpg

CFAR是非常普遍的信号过滤手段,用于提取超过动态阈值的点目标信息。AURIX™ TC3xx单片机的雷达信号处理单元SPU集成了该硬件功能,并且提供两种典型的CFAR算法。(英飞凌技术专家 钱伟喆

背景介绍

当雷达回波信号功率幅值超过某个阈值时,能被检测到,该阈值不可能是固定的,必须根据周围环境、目标分布反射强弱,杂波噪声干扰等动态变化,而CFAR(constant false alarm rate)就是用于计算动态阈值的典型手段。CFAR直接影响检测概率(probability of detection)【1】,同样的收发机信噪比,较大的CFAR能获得较大的检测概率。

算法实现

由于CFAR使用非常普遍,AURIX™ TC3xx单片机的雷达信号处理单元SPU集成了该硬件功能,并且提供两种典型的CFAR算法,分别是CA-CFAR (cell-averaging CFAR)和GOS-CFAR (generalized order statistic CFAR)。图1是典型CA-CFAR算法结构,摘自Matlab参考文献【1】。SPU还集成了两种算法的子分类,提供更多的检测方法。两种算法各有优缺点,GOS-CFAR在多目标场景性能较优,且其适应性强,参数的微小调整对杂波噪声的滤除影响较小【2】,【3】。

2.png

图1. 典型的CA-CFAR(摘自【1】)

为防止带相位信息的各天线信号互相干涉,通常使用不带相位的NCI(non-coherent integer)功率数据进行CFAR处理,这样能准确表征回波信号在各天线上的功率加总。得到的CFAR结果以位(bit)为基本单元,每个位对应NCI矩阵中的一个数据,该数据可能是32位或16位存储格式。NCI矩阵的维度是距离点数乘以多普勒点数。CFAR结果中置一的位,代表该对应NCI的数据被检测出;置零的位(图2中CFAR bit mask未置一的位),代表该对应NCI的数据未被检测出。

CFAR检测出的结果代表该数据点的功率幅值超过动态阈值,极大可能是来自某目标的反射点。该数据点在每个天线上的信息需要保留,用于下一步的到达角运算。而没超过动态阈值的数据点可能是噪声杂波等,可被删除。CFAR结果可以配合SPU内的Bin rejection单元用于过滤距离-多普勒FFT结果,删除不需要的数据点。图2形象地展示了如何用CFAR 结果过滤距离-多普勒FFT数据。

3.png

图2. CFAR结果对距离-多普勒FFT过滤示意图

SPU内的Bin rejection单元可以方便的实现滤波功能。Bin rejection单元可以设定多种灵活的判断条件,比如跟设定的阈值比较,或者设定需要保留的数据向量维度,或者配合CFAR单元设定需要保留的bit mask等等。不满足条件的数据单元可以被清零或删除。

将CFAR结果依次配置到Bin rejection的掩码寄存器中,该寄存器是32位,有64组,总共对应2048(=32x64)个数据。但距离-多普勒FFT数据维度往往较大,而且还要考虑天线维度,所以需要多次配置掩码寄存器,才能过滤全部三维数据。

使用SPU一维CFAR实现二维CFAR

SPU中CFAR硬件实现是一维的,可以沿距离维度,或者多普勒维度,而实际工程应用中往往需要二维CFAR。理论上的二维CFAR实现,是通过被测点与周围一圈点合成计算出的阈值进行比较,计算量较大,尤其使用GOS-CFAR时,因为需要进行排序的运算量是O(n^2),而一维是O(n)。文献【2】中提出一种分别由距离和多普勒维度CFAR合成的二维CFAR,这种方法有效降低了工程计算量,保持实时性的同时,也能兼顾在噪声环境下的性能。下面将详细介绍如何使用SPU的一维CFAR实现二维CFAR并进行检测。

4.png

图3. 二维CFAR、点目标检测和到达角计算流程,以及仿真结果

图3的第一行流程,提供了二维CFAR、点目标检测和到达角计算流程,其中淡蓝色显示的步骤使用SPU实现,而绿色则代表CPU实现的步骤。图3的第二行给出了每个步骤的仿真结果,能直观表现二维CFAR的计算方法。图中前两步是典型的毫米波雷达信号预处理步骤,只是在第一步同时计算了距离维的NCI及GOS-CFAR,等第二步获得多普勒维的CFAR后,就能合成二维结果。

需要注意的是,由于CFAR的存储方式是以一个位元(bit)代表一个数据点,而第二步完成的多普勒结果是距离结果的转置,所以第三步中要实现的位与(bit AND)操作并不简单,需要对两个互为转置的CFAR结果进行位寻址。Tricore™ CPU提供了位操作指令EXTR.U,能够方便地将某个32位字中的某个位元提取出来进行处理【4】。在某些频繁调用,或时间裕量较短的场景,建议使用汇编代码,减少耗时较长的存储器访问次数,使能CPU 指令缓存,并配合编译器的时间优化选项,来降低代码执行时间。举个例子,使用CPU计算512*128维度的二维CFAR,并进行检测提取出128个点目标,同时将提取出的目标数据搬运到连续内存,方便实施第四步骤的角度傅里叶运算,整个图3中第三步骤耗时大约是1ms ,CPU运行主频是300MHz。

总结

CFAR是非常普遍的信号过滤手段,用于提取超过动态阈值的点目标信息。AURIX ™ TC3xx单片机的雷达信号处理单元SPU集成了该硬件功能,并且提供两种典型的CFAR算法。配合SPU中的bin rejection硬件功能,CFAR结果用于过滤距离-多普勒FFT,将可能来自目标的反射点提取出来,进行下一步到达角计算。另外,AURIX™ TC3xx CPU能在较短时间内,将两次SPU的一维CFAR结果,进行位与操作,实现二维CFAR过滤功能,提取目标。

参考文献

【1】 RADAR SYSTEMS ANALYSIS AND DESIGN USING MATLAB’, Bassem R. Mahafza.

【2】Fast Two-Dimensional CFAR Procedure’, Matthias Kronauge, Hermann Rohling, IEEE Trans. on Aerospace and electronic systems Vol. 49, No. 3 July 2013.

【3】Ordered Statistic CFAR Technique – an Overview’, Hermann Rohling, Hamburg University of Technology.

【4】TC1.6_DSP_Optimization_Guide_part1_v1.2’, Infineon Technologies AG.

来源: 英飞凌汽车电子生态圈

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 67

一、功能介绍

CW32W031 读取 RSSI 功能是指在芯片接收到数据时,读取当前数据包的信号强度值的功能。RSSI 的计算分为两步,即计算 SNR 与计算 RSSI。在收到 RX_IRQ 信号之后,通过读取寄存器中的信号能量 (sig_pow_avg)以及噪声能量(noi_pow_avg)来计算 SNR,并根据当前带宽值 BW 等参数,计算最终信 号强度值 RSSI。

二、软件设计参考

2.1 编程示例 

1. 芯片初始化; 

2. 配置相关参数; 

3. 芯片进入接收模式; 

4. 芯片接收数据,并计算 SNR、RSSI 值。

2.2 软件设计验证 

参照 CW32W031 例程库中接收模式的代码。 

2.2.1 SDK 示例 

参考代码:

1.png

示例代码配置了连续接收模式,并在接收到数据后,将接收到的数据内容及 SNR、RSSI 值打印出来。

2.png

3.png

PAN3028 中 断 处 理 函 数 中, 当 芯 片 接 收 到 数 据, 产 生 REG_IRQ_RX_DONE(RX_IRQ) 中 断 时, 通 过 PAN3028_get_snr 和 PAN3028_get_rssi 接口函数计算并读取当前数据包的信号强度值。

2.2.2 验证结果 串口助手显示结果为:

4.png

三、注意事项 

3.1 关于 RSSI 

RSSI 功能读取信号强度值需要在接收到数据包的时候读取,且在清除 rxdone 中断之前。如果清除中断,这 个值就会失效。

RSSI 的测量范围是 -40 到 -130,不同参数(SF、BW)模式下,测量范围略有不同。 

3.2 关于 LNA 模块支持切换 LNA 增益,支持高增益和低增益两种模式。目前 SDK 默认使用高增益模式。 

当切换至 LNA 低增益时, 

1. LNA 低增益模式会比 LNA 高增益模式灵敏度差 3dB; 

2. 非 DCDC 模式下,RX 电流会降低 1.2mA; 

3. 在有干扰的环境中,LNA 低增益会比 LNA 高增益传输距离更远更稳定。

有关芯片购买事宜,请咨询武汉芯源半导体的销售和官方代理商。更多MCU详细信息,请访问武汉芯源半导体官方网站:https://www.whxy.com

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 49

焊接工业现场的干扰性太强,所以对MCU的抗干扰有很高要求。武汉芯源半导体的MCU全部ESD可靠性达到国际标准最高等级,HBM ESD通过8KV测试,具备超强抗干扰能力。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 15

机器人的应用越来越广泛了,大家熟知的稚晖君直接创业搞机器人,可想而至,接下来的十年,机器人绝对是热门的行业。

目前市面上很多机器人都是基于一套叫做ROS的系统开发的,今天就给大家分享一个跑在MCU上,基于FreeRTOS的轻量级(micro)ROS。

随着市场需求不断的扩大,这种基于MCU的ROS将会越来越普及,对于从事机器人相关工作的读者有必要了解一下。

关于ROS

ROS:Robot Operating System,,即机器人操作系统。

和普通OS(RTOS、TSOS)不一样的是,ROS主要是针对机器人,是基于操作系统之上,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。ROS遵守BSD开源许可协议。

ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。

micro-ROS

本文说的micro-ROS,是基于ROS2进行优化的一套轻量级ROS系统,它提供了完全部署的ROS 2生态系统的大多数吸引人的工具和功能,并具有入式和低资源设备的卓越能力,可以运行在MCU硬件平台。

传统上,即使机器人包含许多ROS,ROS仍停留在微控制器边界。它们通常通过串行协议与旧版ROS中的ROS-serial之类的工具集成在一起。

在微控制器中拥有所有ROS2的功能和相同的API会不是很好吗?这正是micro-ROS提供的-机器人系统嵌入式部分内部的ROS开发生态系统。micro-ROS允许开发人员在硬件级别附近运行ROS 2节点。这使所有硬件外设都可用于该应用程序,从而使其能够直接与SPI或I²C等低级总线进行交互,以与传感器和执行器接口。

微型ROS是一组分层的库,它们可以直接重用ROS 2的库,也可以使其适应资源受限设备的功能和需求。具体来说,如果我们转向ROS 2体系结构,则由微型ROS维护的层是ROS客户端库(RCL)和ROS中间件接口(RMW)。同样,RCLCPP是RCL之上的C ++抽象层,即使大多数与RCL直接接口,它也可以被微型ROS应用程序组件使用。该层在RCLC中提供了相对于ROS 2的附加功能,RCLC是用C99编写的库,其中专门设计和开发了与RCLCPP提供的功能类似的功能,例如便利功能或执行程序,以适合微控制器。 

1.png

通常,ROS是基于 Linux系统之上的运行的一套系统,而本文这套微型ROS基于FreeROS运行。

这使micro-ROS在硬件和软件级别上都能与大多数嵌入式平台兼容。
但是,最终构成micro-ROS体系结构的是RMW实现,该实现基于称为Micro XRCE-DDS的中间件库。Micro XRCE-DDS是由对象管理组(OMG)定义和维护的DDS-XRCE(用于极端资源受限环境的DDS)协议的C / C ++实现。

2.png

顾名思义,DDS-XRCE是一种有线协议,允许引入以数据为中心的发布者-订阅者DDS模型进入嵌入式世界。DDS-XRCE依赖于客户端-服务器体系结构,其中客户端是用C99编写的轻量级实体,可在低资源设备中运行,而代理(C ++ 11应用程序)则充当客户端与DDS世界之间的桥梁。DDS-XRCE协议负责在这两个实体之间传递请求和消息。相应地,该代理能够通过标准DDS有线协议与DDS全局数据空间进行通信。在DDS世界中,代理通过与其他DDS参与者进行通信来代表客户。该通信由客户端代理,能够通过所有标准DDS实体与DDS进行交互的模拟DDS应用程序进行协调。代理将客户端的状态保存在其内存中,这样,即使代理断开连接,代理也可以存活。代理与客户端之间的通信遵循请求-响应模式,即双向并基于操作和响应。

为什么选择FreeRTOS?

由于它们的轻巧性,XRCE-DDS客户端库和microROS都易于在实时操作系统之上运行,这使它们能够满足其典型目标应用程序所提出的对时间要求严格的要求,其中涉及的任务包括要求时限或确定性响应。

具体来说,FreeRTOS已成为micro-ROS项目支持的首批RTOS之一,因此已集成到其软件堆栈中。这允许重用FreeRTOS社区和合作伙伴提供的所有工具和实现。由于微型ROS软件堆栈是模块化的,因此期望并期望交换软件实体。

FreeRTOS是开发micro ROS和Micro XRCE-DDS应用程序的理想选择。首先,它为许多不同的体系结构和开发工具提供了一个独立的解决方案,它以非常清晰和透明的方式编写,并且拥有非常庞大的用户群,从而确保了大量FreeRTOS用户将能够将其应用程序与微型ROS应用程序集成。而且,它是众所周知的高度可靠的RTOS。至关重要的是,FreeRTOS具有最小的ROM,RAM和处理开销。通常,RTOS内核二进制映像的大小在6K到12K字节之间。由于要与RTOS进行资源竞争,因此,当要最小化MCU上的微型ROS应用程序的内存占用量时,这些内存是理想的选择。

在下文中,我们将讨论FreeRTOS提供的几种功能,以及微型ROS如何利用它们来获利,以优化其堆栈中组成的不同库的所需功能。

任务和计划程序

FreeRTOS提供了一组最少的任务实体,这些实体与调度程序的使用一起,为在应用程序中实现确定性提供了必要的工具。微型ROS客户端库(RCL,RCLC和RCLCPP)访问RTOS的资源,以控制调度和电源管理机制,从而为开发人员提供了优化应用程序的可能性。

FreeRTOS提供的任务有两种:标准任务和空闲任务。前者由用户创建,可以视为RTOS上的应用程序。至关重要的是,将微型ROS应用程序集成到RTOS中作为具有给定优先级的此类任务之一。空闲任务另一方面,优先级较低的任务只有在没有其他任务在运行时才进入运行模式。由于microROS主要针对低功耗和IoT设备,因此这些空闲任务和相关的空闲挂钩非常适合在MCU中启用深度睡眠状态。由于将无状态XRCE-DDS客户端实现为micro-ROS中间件,因此这些深度睡眠状态可能是内存易失的,也就是说,由于面向连接的中间件有线协议,可以使用没有RAM持久性的深度睡眠模式。

使用FreeRTOS调度程序,micro-ROS能够管理其主要任务以及负责传输层的任务的优先级。通常,负责网络堆栈或串行接口的任务必须优先于micro-ROS应用程序。

内存管理

FreeRTOS提供的最令人期望的功能(对于微型ROS开发人员和用户而言非常有趣)是堆栈管理和静态堆栈创建能力。在处理micro-ROS的任务创建时,通常,堆栈分配是关键的设计决策。FreeRTOS允许进行细粒度的堆栈大小管理,这又使程序员可以知道在程序执行期间正在使用多少堆栈内存,或例如确定堆栈内存分配是否存在于静态或动态内存中,从而确定帮助正确使用MCU的内存,这是嵌入式系统中的宝贵资源。至关重要的是,可以为微ROS提供繁重的堆栈使用方任务,并为其分配静态分配的堆栈,从而防止将来出现堆和其他任务初始化问题。

在这方面,值得一提的是,这些内存管理工具为基准化微型ROS和XRCE-DDS的内存占用量提供了理想的框架。具体而言,已进行了彻底的堆栈消耗分析,以评估XRCE-DDS客户端内存消耗。堆栈是程序员在运行应用程序之前未知的内存块。为了对其进行度量,可以使用FreeRTOS uxTaskGetStackHighWaterMark()函数,该函数返回在执行过程中XRCE-DDS任务堆栈达到最大值时未使用的堆栈量。通过将此值减去总堆栈,可以得到XRCE-DDS应用程序使用的堆栈峰值。用这种方法获得的结果汇总在此处发布的报告中。

我们还注意到,由于FreeRTOS中使用了可插拔的动态内存管理方法,因此micro-ROS能够完成所需的用于管理内存的接口。通过这种方式,已经使用heap_4作为参考实现了诸如calloc()或realloc()之类的函数。这些功能在馈入micro-ROS内存管理API之前已被包装,以便分析动态内存消耗。

与静态内存情况类似,FreeRTOS的可交换动态内存管理方法使在嵌入式系统中执行动态内存配置文件分析特别容易。的确,尽管在其他RTOS中,动态(取消)分配功能隐藏在RTOS或标准库的深处,但在FreeRTOS中,它们暴露给用户并易于定制,因此简化了处理和控制动态内存使用的过程。

传输

与客户端支持库访问FreeRTOS的特定原语和功能(例如调度机制)的方式相同,中间件实现Micro XRCE-DDS要求访问RTOS的传输和时间资源以使其正常运行。关于IP传输,在FreeRTOS的特定情况下,Micro XRCE-DDS使用在此RTOS上实现lwIP的附件。lwIP(轻型IP)是为嵌入式系统设计的,广泛使用的开源TCP / IP堆栈,旨在减少资源使用,同时仍提供完整的TCP堆栈。这使得lwIP的使用特别适用于以micro-ROS为目标的嵌入式系统和资源受限的环境。

除了TCP / IP堆栈,lwIP还有其他几个重要部分,例如网络接口,操作系统仿真层,缓冲区和内存管理部分。操作系统仿真层和网络接口允许将网络堆栈移植到操作系统中,因为它提供了lwIP代码和操作系统内核之间的通用接口。

FreeRTOS与lwIP 的集成是从头开始设计的,具有标准且熟悉的接口(伯克利套接字),并且具有线程安全性,旨在使其尽可能易于使用。而且,它可以将缓冲区管理保留在可移植层中。

请注意,XRCE-DDS客户端还支持FreeRTOS + TCP网络堆栈。FreeRTOS + TCP是用于TCP / IP堆栈协议支持的官方FreeRTOS扩展库。

还努力使FreeRTOS + TCP与micro-ROS兼容。这包括对TCP和UDP连接的支持,它们依靠FreeRTOS + TCP API来实现micro XRCE-DDS Client API所要求的抽象层,以便能够使用这些协议与代理进行通信。

此外,还存在使用FreeRTOS的时间测量功能的可能性,从而使XRCE-DDS库能够执行基于时间的任务,从而使用户看不到实现。

Posix扩展

允许将FreeRTOS无缝和盈利地集成到micro-ROS中的另一个显着原因是POSIX扩展的可用性。便携式操作系统接口(POSIX)是IEEE计算机协会为维护操作系统之间的兼容性而指定的一系列标准。FreeRTOS Labs提供的FreeRTOS + POSIX层实现了POSIX API的子集。

确实,尽管micro-ROS中间件具有较低的POSIX依赖关系(只是clock_gettime()函数),但整个micro-ROS堆栈具有与功能和类型定义相关的更高依赖关系。另外,由于微型ROS项目的基本原理之一是移植或重用Linux(主要是POSIX兼容操作系统)中本机编码的ROS 2的代码,因此使用了某种程度上可与Linux兼容的RTOS。POSIX显然是有益的,因为代码的移植工作量很小。

为此,使用了sleep()和usleep()之类的函数。micro-ROS的POSIX类型定义依赖项依赖于FreeRTOS内核中未定义的某些结构,例如struct timeval或struct timespec。还需要诸如type.h,signal.h或unistd.h之类的文件来定义一些标准的类型定义和结构。

对于errno.h,尽管在FreeRTOS + POSIX层中未实现,但出于编译目的,micro-ROS必须包括一些不可用的定义。

通过使用FreeRTOS + FAT库,应在micro-ROS堆栈中重构这些定义,以使FreeRTOS + POSIX具有完全的兼容性。这样,可以完全支持依赖文件系统支持的高级micro-ROS功能,例如日志记录机制。

更多相关教程

如何在FreeRTOS上使用Olimex STM32-E407评估板创建和运行第一个微型ROS应用程序:

3.png

4.jpg

该教材地址:https://micro-ros.github.io/docs/tutorials/core/first_application_rtos/freertos/

更多内容,请参看:https://micro-ros.github.io/

4.png

来源:嵌入式专栏(作者 | strongerHuang)

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 330

这是一个初学者不会去了解的问题,但会使老司机掉坑的问题。这也是最近在技术交流群看到的一个问题,所以,就出来简单分享一下。

概述

这个问题看起来比较简单,我相信很多人都能说出答案。但是,很多人都只是停留在表面,没有在项目中经历过,也没有更深入的去了解。

1.jpg

很早之前年的单片机可能没有输出速度这个配置选项,但是这后面的单片机基本都有配置速度的选项,下面结合STM32来简单介绍一下。

GPIO输出速度

不管标准外设库,还是STM32CubeMX配置GPIO输出引脚,都会有速度GPIO_InitStruct.Speed这个选项。

类似如下:

GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

根据不同MCU型号,速度选项,有些有3个,有些有4个。一般定义在xxx_gpio.h文件中。

#define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */
#define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */
#define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
#define  GPIO_SPEED_FREQ_LOW        (0x00000000u)  /*!< Low speed       */
#define  GPIO_SPEED_FREQ_MEDIUM     (0x00000001u)  /*!< Medium speed    */
#define  GPIO_SPEED_FREQ_HIGH       (0x00000002u)  /*!< High speed      */
#define  GPIO_SPEED_FREQ_VERY_HIGH  (0x00000003u)  /*!< Very high speed */

对于普通输出GPIO,使用STM32CubeMX配置,默认配置低:

2.png

当然,如果配置成其他模式,有可能是中,或高。

比如:配置UART、CAN引脚,速度会是高。

提问:你想过为什么会是低、高吗?

测量GPIO输出波形

不知道大家用示波器测量过GPIO输出波形没有,特别是在高速(单位M)的时候。

我以前经常测量MCO引脚输出时钟,测量过的人应该都知道,如果输出速度高于配置速度,会明显看到波形不正常。

波形会出现不完整,幅度低等失真现象。

相信不用我说,有一定常识的人都能理解。

差异原因

速度的配置,就是决定IO口驱动电路的响应速度。

我们需要结合实际情况配置速度,不同速度会有不同的影响。

高低速差异:配置高速:输出频率高,噪音大,功耗高,电磁干扰强; 

配置低速:输出频率低,噪音小,功耗低,电磁干扰弱;提高系统EMI(电磁干扰)性能;

看到差异,相信很多人就能理解了。

实际情况中,比如:低功耗的产品,你会考虑功耗。

环境不好的场合,通信不稳定,你会考虑电磁干扰等。

举例:如果你使用9600波特率UART通信,建议速度配置为低。

所以,如果你想使产品更加完美,速度配置也是关键的一项。

来源:strongerHuang

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 26

一、功能介绍 

CW32W031 的射频部分支持 CAD 中断。从 Deepsleep 进入 STB3,开启 CAD 功能并进入 RX 模式后, CW32W031 会检测信道中是否会有 ChirpIOT ™信号 , 如果存在将 CAD-IRQ 置高,MCU 内核可以通过一定的时间来检测 CAD-IRQ 信号是否拉高来判断信道中是否存在 ChirpIOT ™信号。

用户可通过 GPIO11 端口检测 CAD-IRQ 信号,信号检测流程如下:

1.png

图:信道活跃检测(CAD)

注:CW32W031 的 RF 部分有多种中断源,MCU 超时设置是在等待中断的产生,然后判断中断是否为 CAD 中断,从而执行不同的命令。

二、软件设计参考 

2.1 软件设计流程 

1. 芯片初始化; 

2. 配置 CAD 初始化; 

3. 芯片进入接收模式; 

4. 观察 CAD-IRQ 信号。 

2.2 软件设计验证 

2.2.1 验证步骤 

1. 发送模组周期性发送数据包; 

2. 接收模组配置为接收模式; 

3. 使用逻辑分析仪抓取接收端 CAD-IRQ 信号。

2.2.2 SDK 示例

参考代码

ret = rf_init(); 
if(ret != OK) 
{ 
    dis_err(" RF Init Fail"); while(1); 
} 
rf_set_default_para(); 
rf_set_cad(); 
rf_enter_continous_rx(); 
while (1)// 等待逻辑分析仪检测 CAD-IRQ 信号 
{ 
    rf_irq_process(); 
}‍

示例代码配置了 CAD 初始化,配置 GPIO11 作为 CAD 检测 IO 口,随后进入接收模式。

发送模组周期性发送数据包(数据包 preamble+payload 的持续时间约 20.5ms),用逻辑分析仪抓取接收

模组 GPIO11 波形,观察检测结果。

2.2.3 验证结果

逻辑分析仪抓取结果如下图所示:

2.png

图:逻辑分析仪抓取结果(CAD)

根据结果显示,当发送模组发送数据包时,接收模组发生了 CAD-IRQ,CAD 检测引脚 GPIO11 被拉高约 20.5ms,维持一个完整 ChirpIOT ™数据包的时间长度。

三、注意事项

3.1 关于 CAD 影响芯片的接收灵敏度

CAD 功能初始化时,修改了芯片的接收阈值,设置不同的接收阈值,会影响芯片的接收灵敏度,并可能存在CAD 误触发的情况。

uint32_t PAN3028_cad_en(void) 
{ 
    PAN3028_set_gpio_output(MODULE_GPIO_CAD_IRQ); 
    If(PAN3028_write_spec_page_reg(PAGE1_SEL,0x0f,0x10)!=OK) 
    { 
        return FAIL; 
    } 
    return OK; 
}

接收阈值的设置,需修改 PAN3028_cad_en() 函数中的寄存器配置,默认值为 0x10,修改接收阈值对接收灵

敏度及误触发概率的影响如下(实验数据在屏蔽放环境下测试):

3.png

用户在使用 CAD 功能时,需根据应用场景选择修改 PAN3028_cad_en() 函数中的寄存器值(PAGE1_SEL,0x0f, 默认值为 0x10),在使用完 CAD 功能后,建议调用 rf_set_cad_off() 函数,rf_set_cad_off() 函数可以关闭 CAD 功能并将接收阈值恢复。

3.2 关于 SDK 及演示系统板

SDK 中提供了 CAD 功能所需的函数接口,CAD-IRQ 被触发时,检测引脚 GPIO11 会被拉高。演示系统板将GPIO11 连接到了 PB07, 具体信息可前往官网查看 CW32W031 的开发板原理图。

3.3 关于 CAD 使用方法

CW32W031 的射频部分可以对 preamble 和 payload 进行 CAD 检测。

3.3.1 对 preamble 检查方式

当完整的 preamble+payload 信号到来时,用户可以在接收端通过 GPIO 口读取到 CAD-IRQ 信号,CAD 检测引脚 GPIO11被拉高,拉高时间为 preamble+payload的持续时间。此时,接收端可以产生正确的 rxdone结果。

4.png

图:逻辑分析仪抓取结果(完整 CAD)

当不完整的 preamble+payload 信号到来时(发射端先进行数据发送,随后接收端在 preamble 时间段内打开了 CAD 检测),此时,用户可以在接收端通过 GPIO 口读取到 CAD-IRQ 信号,CAD 检测引脚 GPIO11 的变化有两种情况:

1.preamble(部分)内含有较完整信息,GPIO11 会被拉高 preamble(部分)+payload 的持续时间。此时,接收端可以产生正确的 rxdone 结果。

5.png

图:逻辑分析仪抓取结果(较完整 preamble)

2.preamble(部分)内未含有完整信息,GPIO11 会呈现不规则高 - 低 - 高 - 低变换的现象。此时,接收端不会产生正确的接收结果。

6.png

图:逻辑分析仪抓取结果(不完整 preamble)

3.3.2 对 payload 检查方式

当只有 payload 信号到来时(发射端先进行数据发射,随后接收端在 payload 时间段内打开了 CAD 检测),此时,由于 RX-CAD 检测不到 preamble,CAD-IRQ 会呈现不规则高 - 低 - 高 - 低变换的现象。此时,接收端不会产生正确的接收结果。

7.png

图:逻辑分析仪抓取结果(只含 payload)

3.3.3 软件应用参考

当设置的 CAD 误触发概率较少,或存在少量误触发率但不影响软件应用时,可以通过检测 CAD-IRQ,GPIO11 上升沿来判断 CAD 触发,可以认为只要收到上升沿就是收到了 payload 信号(建议使用这种方法的接收阈值设为 0x15~0x20)。

当设置的 CAD 误触发概率较高时,需要结合 CAD 检测时间用软件方法来判断 payload 信号,CAD 检测的时间以单个 chirp 持续时间作为单位计算。单个 chirp 持续时间为 2SF/BW(SF 为扩频因子,BW 为带宽,BW单位为 Hz,时间单位为秒)。使用时,建议将检测时间窗口设置为 3 个 chirp 持续时间为佳。用户可以分别在 3 个 chirp 对应的位置检测 CAD 信号,如果同时检测到 CAD 信号(GPIO11 高电平),则可以认为有信号存在。同时,软件设计需要参考 3.3.1 对 preamble 检查方式和 3.3.2 对 payload 检查方式,进行灵活调整。

在打开 CAD 接收后,如果当前空中存在信号,那么芯片需要至少 2 个 chirp 持续时间的检测,GPIO11 才能首次对外输出高电平。一个典型的应用方法为:

1.计算 one_chirp_time = 2SF/BW;

2.配置需要检测的信道,rf_set_cad(),enter_rx;

3.检测 check_cad_inactive(),判断是否检测到 CAD 信号(下面的例程检测了三次,适用于误触发较多的情况)。

uint32_t check_cad_inactive(void) 
{ 
    delay10us(one_chirp_time*2/10); 
    if(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7) != 1) 
    { 
        return LEVEL_INACTIVE;// 没有 cad } delay10us(one_chirp_time/10); 
        if(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7) != 1) { return LEVEL_INACTIVE; 
    } 
    delay10us(one_chirp_time/10); 
    if(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7) != 1) 
    { 
        return LEVEL_INACTIVE; 
    }
    return LEVEL_ACTIVE;// 有 cad 
}

如果误触发较少,或存在少量误触发但不影响软件应用时,可以将检测次数减少为一次(例程如下),或者通过 GPIO11 上升沿作为判断依据。

uint32_t check_cad_inactive(void) 
{ 
    delay10us(one_chirp_time*2/10); 
    If(GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7) != 1) 
    { 
        return LEVEL_INACTIVE;// 没有 cad 
    } 
    return LEVEL_ACTIVE;// 有 cad
}

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 20

本文将介绍两个利用通用输入/输出(GPIO)引脚复用来减少项目引脚使用的示 例。第一个示例使用了“查理复用算法”技术,第二个示例使用了定时外设和中 断来快速切换引脚输入状态和输出状态,以在驱动 LED 的同时读取按键。

PIC®和 AVR®单片机上的引脚复用 

通用输入/输出(GPIO)引脚是单片机设计时的重要考量之一。您需要足够的引 脚将单片机连接到设计中的所有其他组件;但是,超过所需的引脚可能会导致设计 成本增加,并且占用电路板上更多空间。此外,减少设计中的所需引脚数量可能就 可以选择另一种不同的封装。如果有一种方法可以从较小的封装中挤出更多的 I/O 引脚就好了!幸运的是,我们确实有方法可以在这种情况下释放引脚。 

下面是 Microchip 应用团队使用 AVR DD 系列单片机创建的两个示例。首先, 我们将探讨通过一种称为“查理复用算法”的技术复用 GPIO 引脚来控制 LED。接 下来,我们将看一下如何使用单个引脚同时运行独立的按键和 LED。 

查理复用算法的核心思想是利用单片机引脚可以处于的三种状态:数字高电平、 数字低电平和高阻抗数字输入状态(也称为高阻态或三态)。通过使用这三种状态 而不仅仅是典型的高电平和低电平,用户可以使用 n 个引脚驱动最多(n2 -n)个独立的 LED。在此示例中,三个指定的引脚可以驱动六个独立的 LED。 

那么查理复用算法的工作原理到底是什么呢?为了理解这一点,我们需要看一 个示例。 

1.png

这里我们用三个 I/O 引脚驱动六个 LED。 

如果我们只想导通 LED1,则需要将 PA2 设为高电平,PA3 设为低电平,PA4 设为高阻态。电流将流过 LED1 并使其导通,同时使所有其他 LED 保持关断状态。 

2.png

这里的三态十分重要,因为如果 PA4 为“低电平”,它也会意外导通 LED5。 如下面所示:

3.png

高阻抗逻辑状态确保电流只流过 LED1。利用 I/O 引脚状态的相应组合(要获得 预期行为,用户必须将一个引脚设为高电平、一个引脚设为低电平,其余引脚设为 高阻抗),可以为电路中的任何 LED 重复此过程。 

虽然在任意给定时刻这种方法只会点亮一个 LED,但是快速改变 I/O 状态可创 造出点亮多个 LED 的错觉。(LED 调光的工作原理是通过在单个 LED 上使用脉冲 宽度调制,原理与此非常相似)。可以在下面看到:(点击图片查看动态效果) 

第二个示例涉及到在单个引脚上改动一个 LED 和一个按键。 

从有利的角度看,可利用中断和定时器来实现此目的。单片机引脚大部分时间 都在驱动 LED。然而,一个定时外设会定期在单片机内部触发中断,将引脚从输出 快速切换为输入,然后检查按键的状态。虽然这会暂时停止驱动 LED,但如果这个 过程可以做得足够快,那么在检查按钮状态的时候,对 LED 造成的影响几乎不可见。 我们在下面的示例中使用了这种方法。单片机不停地驱动一个闪烁的 LED,同 时定期检查按键,如果按键被按下,就会点亮一个单独的 LED。

尽管本文章只涵盖了这两种技术的基础知识,但我们的 Microchip 应用团队发布 的相应 GitHub 页面包含了图表、示例代码和更详细的说明。请访问该页面或我们 的 AVR DD 产品系列页面来了解更多信息。

来源: Microchip微芯

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。    

围观 74

直接存储器访问(DMA)控制器,可以在内存和/或外设之间传输数据,而不需要CPU参与每次传输。合理利用DMA控制器,可以减轻CPU的负担。本文通过介绍DMA结构与工作原理,以及两种模式(兵乓模式与多数据包缓冲传输模式),来看看使用DMA如何提高MCU效率。

DMA结构与工作原理

先进的DMA控制器,如STMicroelectronicsSTM32F4系列中包含的控制器,可以通过灵活的数据流分配和传输管理功能进一步减轻CPU的负担。

如图左侧所示,来自8个不同的通道DMA请求,并到仲裁器上,从而建立优先级(编号较低的输入通道,具有较高的优先级)。然后激活最高优先级的传输,传输到图中右侧的两个AHB 主设备(存储器端口和外设接口),提高了外设到存储器传输的效率。这可能是DMA在基于CPU的设计中最常见的情况。

1.jpg

图 1.   STM32F4系列DMA控制器(图片来源于STMicroelectronics)

为每个路径分配单独的FIFO,如图1中间所示,允许针对每个外设接口的特性调整FIFO特性。例如,FIFO的阈值级别(请求传输的深度)可以单独设置为FIFO大小的¼,½或¾。这允许低速通道等待,直到FIFO几乎满了才进行传输,以最小化开销。更快的通道会更早地启动传输,可能只有一半大小,以避免FIFO溢出。

我们来通过一个实例,来看看DMA怎么工作的。

实例:“使用 STM32 来控制 NeoPixels LED”

硬件部分采用 STM32 开发板,与 NeoPixel LED灯带矩阵等相连接。

2.png

RGB NeoPixels实际上是WS2812智能控制LED。下面是WS2812 LED的3字节数据协议的结构,分别代表绿红蓝三个信息。

3.jpg

图 2.  WS2812 LED的3字节数据协议的结构

使用计时器来PWM控制波形,然后配置DMA使CPU高效并且易于实施。

4.jpg
图 3.   WS2812 LED的0和1位的计时图

在软件中,配置DMA, 选择了“TIM2_CH3/UP”, 将方向改为“内存到外设”, 同时,将优先级改为“非常高”,最后保存.ioc 文件,以生成项目代码。

5.jpg
图 4.   配置DMA流,以便有效更新PWM信号的占空比

更多内容请看下面文章:使用 STM32 来控制 NeoPixels

DMA的两种模式

合理使用两种DMA模式(兵乓模式与多数据包缓冲传输模式),可以帮助提高MCU效率。

USB外设是一个很好的外设示例,早期的USB实现的最大吞吐量只有1.5 Mb/秒。随着更高性能的标准版本的出现。比如要接近12 Mbit/s全速USB标准的理论最大值。我们来看看,数据传输方面DMA如何帮助提高MCU效率!

我们以MicrochipATXMEGA16D4-MH举例。

01、兵乓模式

之前通常使用单个存储器缓冲区进行外设数据传输。如果数据缓冲区已满,MCU将响应NAK(否定确认)消息。接收到NAK后,主机将等待并稍后重试传输。它将继续重试,直到MCU能够成功接收数据。

ATXMEGA16D4-MH使用乒乓模式来消除这个问题。乒乓模式使用两个存储单元(memory banks)进行数据传输。当一个存储单元满时,主机可以将数据传输到另一个存储单元。在两个存储单元之间交替传输可以避免复审,并提高整体数据带宽。

6.jpg
图 5.  乒乓模式提高了效率(图片来源于Microchip)

此外,如上图所示,以乒乓模式还使MCU有更多时间来处理数据。如图所示,没有乒乓,CPU只能处理传输之间的数据。使用乒乓模式,CPU可以在传输周期的一部分时间内处理数据,并降低NAK被要求“赶上”数据处理要求的可能性。

02、多数据包缓冲传输模式

另一个很有用的模式,可以让MCU的数据传输更高效。这个特性叫做“多数据包缓冲传输模式”。如果你要通过USB端口传送的数据包,超过了全速USB的BULK传输模式所允许的最大值(64字节),那么就可以用上这个模式。以前,你需要在主机上把数据包分成小块,然后在接收端把它们合并,这会增加中央处理器(CPU)的负担。不过现在,多数据包缓冲功能加入了USB设备,它会在数据包超过USB标准大小时自动帮你分割和合并数据。重要的是,这个模式还能减少中断的次数,因为只有在整个传输结束后才需要中断CPU。这意味着,CPU可以处理其他任务,或者进入休眠模式,直到整个传输完成并且准备好处理。

总结

合理利用DMA控制器,可以减轻减轻CPU的负担,事半功倍。结合“乒乓缓冲”和“多传输模式”,你可以把传输的带宽从基准BULK传输模式的5.6 Mb/s提升到8.7 Mbits/s,这是一个不小的提升。更重要的是,在使用这两个功能的情况下,CPU的负担从基准的46%降低到只有9%。这两个功能的结合,不仅在性能上有所改进,而且还能节省能源。

来源:得捷电子DigiKey(作者:Alan Yang)

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 81

本章为CW32F030C8T6时钟的参考资料,面向初学者。

第一部分 默认时钟和启动文件

单片机内部基本由内核、总线、外设组成,这三部分作为数字电路,都需要开发者提供时钟信号才能正常工作。所谓时钟信号,就是周期脉冲信号,由电路分析可知RC振荡电路可以产生稳定的脉冲,故单片机的时钟信号可以由RC振荡器提供。但是RC振荡器提供的时钟信号质量不高,而晶体振荡器依靠压电效应提供稳定的、高质量的时钟信号。

以CW32F030C8T6单片机为例,他拥有2个内部振荡器,并且可以使用外部振荡器输入的脉冲信号作为时钟。先说内部振荡器,有HSI(高速-high speed、内部-internal)和LSI两个震荡器,这两个振荡器均为RC振荡器,可以通过配置相关的寄存器来调整输出频率,一般单片机启动的时候都会使用内部振荡器提供的时钟,这种RC振荡器启动速度很快,价格低廉,非常时候作为启动时钟。内部低速振荡器一般不作为内核运行的时钟,而是作为部分外设的时钟,如rtc定时器(实时时钟)和看门狗。

对于此款单片机,可以通过下述办法来判断单片机上电之后的行为,提示:一般单片机上电之后都会配置主要的时钟参数,但配置之后工作状态不同,后文会有对比。

1.找到单片机的启动文件,启动文件以“.s”后缀出现,意为start_up。

2.启动文件由汇编语言编写,单片机启动一定会从启动文件开始,而不是C语言下的main函数。

3.下图为启动文件截图。

1.png

4.在上方文件中找到那个叫SystemInit的东西,这是个函数名字,一般来讲都可以在厂商提供的库函数中找到,cw32的在下面这个图的文件里

2.png


1.在执行完SystemInit函数的这三行代码之后,单片机会正常跳转到main函数开始执行,就像启动文件里面写的那样。

至此,启动文件主要部分及系统默认的上电时钟已讲解完。

如果你看不懂C语言,那就去补习C语言。

如果你看不懂为什么这是在操作寄存器,下一部分会教你如何看寄存器。

第二部分 库函数和寄存器

我们都知道计算机编程最早使用的是机器语言,也就是用打点纸带来编程,后续出现了汇编语言,使用助记符来辅助编程,再到后来的C语言,高级语言诞生,软件开发变得更加简单。但是到计算机这一层,他依然是使用的数字电路来工作的,至少,开发者需要操作的东西就算不是数字电路,也是个寄存器。

计算机发展中,寄存器被人们用“地址”这个东西来标号,翻开编程手册(单片机至少有三个手册是开发者需要看的,分别是:data_sheet \user_program_guide \core_program_guide),你会发现每个寄存器都会有一个地址,到目前为止,32位单片机拥有非常多的寄存器,这些寄存器地址已经不会再用最直接的地址累加形式显示出来(如0x00,0x01,0x02........)。稍微高级一些的单片机都会使用基地址+地址偏移量的形式指示寄存器的地址,如下图所示:

3.png



4.png

如果开发者想要使用位于SYSCTRL这个寄存器组下的分寄存器,如总线时钟或是PLL时钟,就需要用基地址+地址偏移量的方式找到这个寄存器,并赋值寄存器来配置。所谓地址偏移量,就是这个寄存器有多少字节的容量,32位单片机就是4字节,所以地址偏移量基本上就是4字节步进来累加的,某些情况会有多个寄存器一起负责一个功能的情况,这个时候偏移量要酌情理解。

那地址代表了寄存器,地址和库函数有什么联系?C语言最精髓的东西是什么?那必然是指针,指针就用的是这种“以地址指示参数位置”的办法,所以你可以在库函数看到如下一系列的宏定义:

5.png


基地址。

6.png


地址强制转换为结构体指针。

7.png


上面那个东西又会被定义成开发者可以直接操作的寄存器。

有朋友肯定会问,这里只有一个基地址,为什么可以用CW_SYSCTRL->REG的形式操作很多寄存器呢?

由于每个寄存器都是32位的,也就是4字节,由C语言联合体和结构体的特性,内部的地址是基地址累加的,只需要一个寄存器累加固定的偏移量,就能把结构体成员和单片机内的寄存器一一对应起来,这就是寄存器与库函数的联系。

一旦想通寄存器和库函数是怎么联系起来的,单片机编程就会变成一个非常简单的事情,因为库函数本质上就是在用地址操作去赋值、改写寄存器,全世界的单片机库函数都是如此。在任何时候,开发者都可以通过直接赋值寄存器的办法去完成自己期望的配置。

现在我们回头看cw32系统初始化函数的最后两行,最开始的就是基地址指针,这个是一个结构体指针,结构体由很多联合体构成,指针选择结构体成员,结构体成员是联合体,所以用‘.’的方式选择了TRIM成员进行赋值,赋的值就是等号右边的部分。

细说等号右边的含义。RCC是一个十六进制数,他被强制转化为了16位指针类型,并在赋值之前解引用被变成了本身的值,即前文提到的十六进制数,根据编程手册,这个十六进制数表示了RC振荡器对应48MHz输出的校准值。

8.png



至此,关于第二部分的寄存器-库函数联系已讲解完成,如有错误或遗漏,欢迎指正和补充。

总结:

1、单片机启动并不是从main函数开始执行的,而是从启动文件规定的函数开始执行的

2、大部分单片机都会上电自动配置时钟保证单片机能够正常工作

3、寄存器和库函数通过地址这个东西联系在一起,库函数本质就是在操作寄存器

来源:CW32生态社区

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 34

页面

订阅 RSS - 单片机