other parts discussed in post:awr1642, iwr1642, iwr1642boost, awr1443, iwr1443
作者:ti 工程师 chris meng
gpadc功能介绍
iwr1642/awr1642的毫米波传感器芯片上集成了通用adc(gpadc)的功能。用户可以利用gpadc对外部电压,例如电源电压进行监控。iwr1642/awr1642上的adc采样率为625ksps,精度为10-bit,提供给用户6个adc管脚进行测量。其中5个adc支持缓冲模式和非缓冲模式,一个adc仅支持非缓冲模式。在非缓冲模式下,adc的测量范围是0v~1.8v,而缓冲模式下,测量范围是0.4v~1.3v。
gpadc本身是由雷达子系统控制,用户可以通过在mss或者dss调用检测gpadc的api,向雷达子系统发送相关请求来获取gpadc相关信息。雷达子系统收到adc检测的消息后,会调度adc测量和其他射频和模拟的检测功能。用户可以配置adc设定时间,也就是跳过多少采样点后开始正式采用,以及连续采样点数。雷达子系统会在一帧结束的时候把adc采样的最小值,最大值和平均值通过消息发给gpadc采样的发起者(mss或者dss)。
注意事项
这里有两点需要注意。一个是bss里面异步消息发送对象的设置。对于gpadc这个检测,是调用配置gpadc的那个核会收到bss发出的消息。一个是mmwave link下消息发送的对象。在mmw demo里面使用了mmwave link的消息,这个消息是不同于bss的异步消息配置。在mmw demo里mms代码的消息处理函数mmwdemo_mssmmwaveeventcallbackfxn()的返回值默认为0,表示在接收到消息后,同样需要把消息发给dss。所以当mss发起了gpadc的配置,默认情况下不仅mss会收到gpadc的消息,dss也是会收到gpadc的消息。如果dss不处理收到的gpadc消息,dss侧就会报错。所以如果不需要dsp处理相关事件,可以在dsp侧的mmwdemo_dssmmwaveeventcallbackfxn函数里添加gpadc消息的处理,例如收到消息后break。但是,更好的方法是在mss侧把相应消息事件的返回值设置为1。这样可以减少对dss的打断。默认的代码mmwdemo_mssmmwaveeventcallbackfxn()函数的返回值只有统一的一个值,因为mmw demo每个核都会处理多个消息,所以最好修改一下mmwdemo_mssmmwaveeventcallbackfxn为不需要传给dss的消息返回值为1,而需要的返回值为0。如果用户需要在dss侧调用gpadc的配置代码,也需要类似的处理。
gpadc功能实现
下面以mss读取gpadc为例,介绍一下如何在mmwave sdk2.0的mmw demo下实现多次获取gpadc数值的功能。下面的测试基于iwr1642 boost es2.0。dss读取gpadc,也可以使用类似方法。
首先需要在mss_main.c里面添加gpadc配置的相关代码。每调用一次配置gpadc,就能够收到一个相关gpadc的消息,获取gpadc的值。如果需要多次读取gpadc的值,需要多次调用gpadc的配置。
#include
#include
rluint8_t isgetgpadcmeasdata = 0u;
rlrecvdgpadcdata_t rcvgpadcdata = {0};
const rlgpadccfg_t gpadccfg =
{
.enable = 0x3f,
.bufferenable = 0,//0表示非缓冲模式,
//1表示使能缓冲模式,如果全部adc使能缓冲模式则配置0x3f
.numofsamples[0].samplecnt = 20,
.numofsamples[0].settlingtime = 3,
.numofsamples[1].samplecnt = 14,
.numofsamples[1].settlingtime = 3,
.numofsamples[2].samplecnt = 14,
.numofsamples[2].settlingtime = 3,
.numofsamples[3].samplecnt = 14,
.numofsamples[3].settlingtime = 3,
.numofsamples[4].samplecnt = 14,
.numofsamples[4].settlingtime = 3,
.numofsamples[5].samplecnt = 14,
.numofsamples[5].settlingtime = 3,
.numofsamples[6].samplecnt = 14,
.numofsamples[6].settlingtime = 3,
.numofsamples[7].samplecnt = 14,
.numofsamples[7].settlingtime = 3
.numofsamples[8].samplecnt = 14,
.numofsamples[8].settlingtime = 3,
.numofsamples[9].samplecnt = 14,
.numofsamples[9].settlingtime = 3,
.numofsamples[10].samplecnt = 14,
.numofsamples[10].settlingtime = 3,
.numofsamples[11].samplecnt = 14,
.reserved0 = 0
};
int32_t mmwavelink_setgpadcconfig (void)
{
int32_t retval;
retval = rlsetgpadcconfig(rl_device_map_internal_bss, (rlgpadccfg_t*)&gpadccfg);
/* check for mmwavelink api call status */
if(retval != 0)
{
/* error: link reported an issue. */
system_printf(error: rlsetgpadcconfig retval=%d\n, retval);
return -1;
}
while(isgetgpadcmeasdata == 0u)
{
/* sleep and poll again: */
task_sleep(1);
}
return 0;
}
下面是具体调用gpadc配置的代码,可以添加在用户需要测试外部电压的地方。
if (mmwavelink_setgpadcconfig() < 0)
{
system_printf (error: mmwavelink_setgpadcconfig\n); break;
}
接下来在mss侧添加gpadc消息的处理代码。下面的处理代码是在ccs输出窗口打印出adc5的平均值。相关代码添加在mmwdemo_mssmmwaveeventcallbackfxn()函数里。将mmwdemo_mssmmwaveeventcallbackfxn函数的返回值设置为1,这样dsp就不会收到该消息,也就不需要在dsp侧添加消息处理代码了。当gpadc的配置代码被调用的时候,用户就可以在ccs打印输出窗口看到测量的gpadc的值。
case rl_rf_ae_gpadc_meas_data_sb:
{
isgetgpadcmeasdata = 1u;
memcpy(&rcvgpadcdata, payload, sizeof(rlrecvdgpadcdata_t));
system_printf (gpadc value: %d v\n, rcvgpadcdata.sensor[4].avg);
break;
}
下面是在iwr1642boost上实测的数据和万用表测量的数据的比较。
万用表测量(v) adc5的平均值 gpadc值转换为电压 (v)
iwr1642 es2.0 evm 1.7176 980 1.8/1024*980=1.722656
0 0 1.8/1024*0=0
上面介绍的gpadc使用方法适用于iwr1642/awr1642,对于iwr1443/awr1443上的gpadc的使用也是很好的参考。
SDWAN专线案例——企业分支机构
LTC5588-1:200MHz至6GHz直接转换I/Q调制
回顾2020年中国企业存储市场
按下时光暂停键看看人工智能的“今生”,才能发现它的重要性
妊娠期糖尿病帮助减少并发症的技术
GPADC功能介绍与实现
什么是电感器,电感器的常见知识汇总
让智能魔镜显示屏来带你玩转智能家居新生活
解决ADAS等电子设计瓶颈 安全可靠的元器件是关键
利用ADS来观测有损耗传输线的眼图特性
小米6将推出平面曲面双版本,价格2499起,说好的性价比呢?
弗莱克斯柔性振动盘:一键切换产品生产
AI智能医疗产品闪亮登场深受关注
比特币是如何在去中心化支付之外扩展DeFi的
百度VR技术支撑多场景赋能 核心技术层与业务层分离
PLC流量监控系统有什么应用场景
光电式液位传感器工作原理
加热板:真空共晶炉的热力中心与材料塑造者
中兴和紫光展锐海外发布国产新机全面提升拍照体验
关于使用GD32 MCU实现位带操作的指南