【TI毫米波雷达笔记】ADCBuf外设初始化配置及驱动(以IWR6843AOP为例)

news2024/11/27 1:25:06

【TI毫米波雷达笔记】ADCBuf外设初始化配置及驱动(以IWR6843AOP为例)
ADCBuf是为mmwave服务的 在配置之前需要配置好mmwave

#include < ti/drivers/ADCBuf.h>

对应mmwave studio:
在这里插入图片描述

ADCBuf模块上电

调用:

ADCBuf_init();

ADCBuf初始化ADCBuf_open

1. 打开ADCBufADCBuf_open

ADCBuf_Params adcBufParams;
ADCBuf_Params_init(&adcBufParams);

adcBufParams.source = ADCBUF_SOURCE_DFE;
adcBufParams.continousMode = continousMode;  //连续模式
adcBufParams.chirpThresholdPing = chirpThresholdVal;
adcBufParams.chirpThresholdPong = chirpThresholdVal;
adcBufParams.custom = &adcBufParams;

adcBufParams.socHandle = MMWave_Global_Params.handle.socHandle;

MMWave_Global_Params.handle.adcbuf_handle = ADCBuf_open(0,&adcBufParams);
if (MMWave_Global_Params.handle.adcbuf_handle == NULL )
{
    System_printf ("Error: ADCBuf Initialization failed\n");
}

这里设置了ADCBuf的工作模式
其中 乒乓球(ping、pong)阈值表示接收到多少个ADC信号后才开始工作 我这里是一接收就工作

2. 控制(配置)ADCBufADCBuf_control

通过ADCBuf_control可以配置很多东西
第二个参数就是命令参数 结构体:ADCBufMMWave_CMD
通过传入不同的命令 控制要配置的东西 然后再把值传进去

 ADCBuf_RxChanConf   rxChanConf;
    memset((void *)&rxChanConf, 0, sizeof(ADCBuf_RxChanConf));
    rxChanConf.channel = 0;
    rxChanConf.offset = 0;

    for (channel = 0; channel < SYS_COMMON_NUM_RX_CHANNEL; channel++)
    {
        rxChanConf.channel = channel;
        retVal = ADCBuf_control(MMWave_Global_Params.handle.adcbuf_handle, ADCBufMMWave_CMD_CHANNEL_ENABLE, (void *)&rxChanConf);
        if (retVal < 0)
        {
            System_printf ("Error: ADCBuf Channel Enable failed\n");
        }
        rxChanConf.offset  += 128 * 4 * chirpThresholdVal;  //chanDataSize * chirpThresholdVal;
        // 128*4的原因是16位复数采样 就是16*2 换算过来就是4byte 然后ADC只采96个 但要按2^N也就是128对齐 所以每个RX通道第96个byte后面的都是0
    }

这里配置了ADCBuf的大小 我的ADC采样数为96个 16位复数采样
但是要进行2^N对齐 所以最低采样就是128个(后面的去掉或者补0)
16位复数采样就是4B 再乘以128个就是128*4=512B 那么一个ADC数据就是0.5KB 再加上四个通道就是2KB 那么一帧96个chirps就是192KB

retVal = ADCBuf_control(MMWave_Global_Params.handle.adcbuf_handle, ADCBufMMWave_CMD_SET_PING_CHIRP_THRESHHOLD,(void *)&chirpThresholdVal);
if(retVal < 0)
{
    System_printf ("Error: ADCBuf Ping Chirp THRESHHOLD failed\n");
}

retVal = ADCBuf_control(MMWave_Global_Params.handle.adcbuf_handle, ADCBufMMWave_CMD_SET_PONG_CHIRP_THRESHHOLD,(void *)&chirpThresholdVal);
if(retVal < 0)
{
    System_printf ("Error: ADCBuf Pong Chirp THRESHHOLD failed\n");
}

retVal = ADCBuf_control(MMWave_Global_Params.handle.adcbuf_handle, ADCBufMMWave_CMD_SET_CONTINUOUS_MODE,(void *)&continousMode);
if(retVal < 0)
{
    System_printf ("Error: ADCBuf Set Continuous Mode failed\n");
}

retVal = ADCBuf_control(MMWave_Global_Params.handle.adcbuf_handle, ADCBufMMWave_CMD_START_CONTINUOUS_MODE ,(void *)&continousMode);
if(retVal < 0)
{
    System_printf ("Error: ADCBuf Start Continuous Mode failed\n");
}

这里设置了乒乓阈值和连续模式
其实上面已经设置过了 再设置一遍以防万一

获取数据

有两种方式

  1. 官方推荐的ADC转换
    调用ADCBuf_Conversion :
ADCBuf_Conversion blockingConversion;
blockingConversion.arg = NULL;
blockingConversion.adcChannel = Board_ADCCHANNEL_A1;
blockingConversion.sampleBuffer = sampleBufferOnePtr;
blockingConversion.sampleBufferTwo = NULL;
blockingConversion.samplesRequestedCount = ADCBUFFERSIZE;
if (!ADCBuf_convert(adcBuf, &continuousConversion, 1)) {
    // handle error
}

这种方式是一个阻塞 但是不太好控制存储的位置(我认为)

  1. 比较好实现的转换:
    调用ADCBuf_getChanBufAddr函数然后移过去
    我设置了SOC监听 然后把L3_RAM利用起来:
/*! L3 RAM buffer for object detection DPC */
uint8_t L3_RAM_Buf[SOC_L3RAM_SIZE]={0};
#pragma DATA_SECTION(L3_RAM_Buf, ".l3ram");
int32_t         errCode;
SOC_SysIntListenerCfg   listenerCfg;

/* Register Chirp Available Listener */
memset ((void*)&listenerCfg, 0, sizeof(SOC_SysIntListenerCfg));

listenerCfg.systemInterrupt   = SOC_XWR68XX_MSS_CHIRP_AVAIL_IRQ;
listenerCfg.listenerFxn       = MMWave_chirpIntCallback;
listenerCfg.arg               = 0;
MMWave_Global_Params.handle.chirpIntHandle = SOC_registerSysIntListener (MMWave_Global_Params.handle.socHandle, &listenerCfg, &errCode);
if (MMWave_Global_Params.handle.chirpIntHandle == NULL)
{
    System_printf ("Error: Unable to register the Chirp Available Listener [Error code %d]\n", errCode);
}

每次chirp接收完成以后 触发chirp有效中断 然后把四个RX通道的值移到L3_RAM里面 我一帧是96个Chirps 所以chirp_updata_flag计数96次
在回调函数里面移动数据:

static uint8_t chirp_updata_flag=0;
void MMWave_chirpIntCallback(uintptr_t arg)
{
    int32_t         errCode;
    uint8_t channel=0;
    uint32_t add=0;

    for(channel=0;channel<4;channel++)
    {
        add = ADCBuf_getChanBufAddr(MMWave_Global_Params.handle.adcbuf_handle,channel,&errCode);
        memset(&L3_RAM_Buf[chirp_updata_flag*2048+channel*512],0,512);
        memcpy(&L3_RAM_Buf[chirp_updata_flag*2048+channel*512],(void *)add,512);
    }
    chirp_updata_flag++;
    if(chirp_updata_flag==96)
    {
        chirp_updata_flag=0;
    }
}

最后效果:
在这里插入图片描述

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

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

相关文章

bash: cmake: command not found...+++++++lsb_release: command not found

一 .bash: cmake: command not found… centos中安装那个cmake。 1、问题 [rootPC3 home]# cmake bash: cmake: command not found... Similar command is: make当前系统&#xff1a; [rootPC3 home]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx…

dex2oat编译模式、触发场景、命令强制执行

dex2oat简单理解就是把delvik虚拟机的可执行文件dex转化成AndroidRuntime虚拟机的可执行文件oat。 Android T版本由PKMS下发命令、native层进程installd负责具体执行dex2oat操作。installd回去调用dex2oat64完成编译工作&#xff0c;可以将dex2oat64理解成一个程序。源码路径&…

本地使用GFPGAN进行图像人脸修复

人脸修复 1.下载项目和权重文件2.部署环境3.下载权重文件4.运行代码5.网页端体验 首先来看一下效果图 1.下载项目和权重文件 https://github.com/iptop/GFPGAN-for-Video.git2.部署环境 根据README文件部署好环境&#xff0c;额外还需要&#xff1a; cd GFPGAN-1.3.8 pyt…

在Qt创建的UI中放一个显示点云的窗口(PCL+QT5)

1、首先在Qt Designer创建UI后&#xff0c;拖一个Widget窗口出来 2、在对象查看器中右击该Widget&#xff0c;选择提升窗口部件&#xff0c;如下操作&#xff1a; 3、把UI转出来放在VS项目中&#xff0c;其中你的UI代码头文件会自带QVTKOpenGLNativeWidget.h&#xff0c;当然你…

企业专题片的优势

企业专题片可以通过生动、感人的方式传达企业形象和信息&#xff0c;引起观众的共鸣和兴趣。它是一种强有力的营销工具&#xff0c;能够提升品牌形象、增加产品或服务的认知度&#xff0c;并在激烈的市场竞争中突显企业的实力和成果。企业专题片具有多个好处和影响&#xff0c;…

【C语言】入门——数组

目录 ​编辑 1.一维数组的创建和初始化 1.1一维数组的创建&#xff1a; 1.2 一维数组的初始化 &#xff1a; 2.二维数组的创建的初始化 2.1二维数组的创建&#xff1a; 2.2二维数组的初始化&#xff1a; 3.数组越界 4.数组的使用 4.1一维数组的使用&#xff1a; 4.2二维…

1、PostgreSQL数据库的历史和特性简介

PostgreSQL是一个开源的关系型数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;它具有强大的功能和广泛的可扩展性&#xff0c;被广泛用于各种规模的应用程序和项目中。 一、PostgreSQL 的发展历史 PostgreSQL数据库的来历可以追溯到20世纪80年代末和90年代初。最早由…

MyBatisPlus入门篇1 - 入门案例、CRUD开发、Lombok、分页查询

目录 MyBatisPlus是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提高效率。 1.入门案例 ①创建SpringBoot项目&#xff0c;添加Spring Web和Mysql driver ②手动在pom.xml文件中添加mybatis plus和druid依赖 <dependency><groupId>com.b…

攻防世界-Get-the-key.txt

原题 解题思路 notepad看到&#xff0c;这应该是一个压缩包&#xff0c;解压。 但是解压的时候提示格式不对&#xff0c;不是zip&#xff0c;rar可以。解压出来有一个key.txt&#xff0c;打开就行。

taro h5 点击页面任意地方关闭弹窗组件 --- findDOMNode 判断点击节点是否属于某个组件

场景&#xff1a;如图&#xff0c;弹窗在大组件中&#xff0c;点击小组件显示弹窗&#xff0c;要求点击除弹窗外的任何元素都能关闭弹窗并且能执行元素原有的逻辑 方法一 最简单的是弹窗背后有一个覆盖整个页面的透明的cover, 点击直接关闭&#xff0c;但是这样虽然点击页面…

【算法篇】动态规划(二)

文章目录 分割回文字符串编辑距离不同的子序列动态规划解题思路 分割回文字符串 class Solution { public:bool isPal(string& s,int begin,int end){while(begin<end){if(s[begin]!s[end]){return false;}begin;end--;}return true;}int minCut(string s) {int lens.si…

便捷式发电机UL2201/UL2200测试报告要求

便携式发电机是一种燃料驱动的引擎或电机&#xff0c;可将化学能直接转换为交流电输出。便携式发电机可以随身携带&#xff0c;或用人力推拉移动。便携式发电机可能还包括更为复杂的便携式逆变发电机&#xff0c;这种发电机也由燃料驱动但内置交流逆变器。便携式电源逆变器可将…

react 初级基础

react基本使用 项目创建 项目的创建命令 npx create-react-app react-basic创建一个基本元素进行渲染 // 1 导入react 和 react-dom import React from "react"; import ReactDOM from "react-dom";// 2 创建 react 元素 React提供了创建元素的api Rea…

QCAD for Mac免费下载:卓越的2D辅助设计工具

QCAD是一款功能强大的2D辅助设计画图软件&#xff0c;现已适配Mac系统&#xff0c;为Mac用户提供了便捷高效的设计工具。 QCAD提供了丰富的绘图功能&#xff0c;可以轻松绘制各种平面图形&#xff0c;包括直线、圆、椭圆、弧线等。 同时&#xff0c;QCAD还支持多种绘图工具&am…

webpack打包常用配置项

webpack打包配置项 参考链接 文件结构&#xff1a;最基础版 先安装 npm i webpack webpack-cli --dev 运行命令&#xff1a;npx webpack 进行打包 1. 配置webpack.config.js文件&#xff1a; const path require(path); module.exports {mode: development, // 开发环境 …

聊聊如何玩转spring-boot-admin

前言 1、何为spring-boot-admin&#xff1f; Spring Boot Admin 是一个监控工具&#xff0c;旨在以良好且易于访问的方式可视化 Spring Boot Actuators 提供的信息 快速开始 如何搭建spring-boot-admin-server 1、在服务端项目的POM引入相应的GAV <dependency><grou…

Linux之NFS服务器

目录 Linux之NFS服务器 简介 NFS背景介绍 生产应用场景 NFS工作原理 NFS工作流程图 流程 NFS的安装 安装nfs服务 安装rpc服务 启动rpcbind服务同时设置开机自启动 启动nfs服务同时设置开机自启动 NFS的配置文件 主配置文件分析 示例 案例 --- 建立NFS服务器&#…

4、QT中的网络编程

一、Linux中的网络编程 1、子网和公网的概念 子网网络&#xff1a;局域网&#xff0c;只能进行内网的通信公网网络&#xff1a;因特网&#xff0c;服务器等可以进行远程的通信 2、网络分层模型 4层模型&#xff1a;应用层、传输层、网络层、物理层 应用层&#xff1a;用户自…

C++核心基础教程之STL容器详解 vector容器的概述 vector常见的API

容器作用域迭代器 就是定义一个迭代器&#xff0c;迭代器的名称叫it 保存起始迭代器 *it int 相当与取内容&#xff0c;像指针&#xff0c;但不是指针&#xff0c;因为底层很多细节 vector 一次开辟两倍原来的空间 另辟空间 迭代器右边是开区间&#xff0c;不包含右端…

sql中的排序函数dense_rank(),RANK()和row_number()

dense_rank()&#xff0c;RANK()和row_number()是SQL中的排序函数。 为方便后面的函数差异比对清晰直观&#xff0c;准备数据表如下&#xff1a; 1.dense_rank() 函数语法&#xff1a;dense_rank() over( order by 列名 【desc/asc】) DENSE_RANK()是连续排序&#xff0c;比如…