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 <ti/control/mmwavelink/test/common/link_testcase_setting.h>

#include <ti/control/mmwavelink/mmwavelink.h>

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的使用也是很好的参考。

Anonymous
  • 请问,可以帮我回答一下下面三个问题吗,谢谢。

    ” IWR1642/AWR1642上的ADC采样率为625Ksps,精度为10-bit,提供给用户6个ADC管脚进行测量。其中5个ADC支持缓冲模式和非缓冲模式,一个ADC仅支持非缓冲模式。在非缓冲模式下,ADC的测量范围是0V~1.8V,而缓冲模式下,测量范围是0.4V~1.3V。“

    这句话里,5个ADC支持缓冲(假设编号为1、2、3、4、5),1个ADC支持非缓冲(假定编号为6),

    1)在非缓冲模式下,是不是只有1个ADC也就是6号ADC工作?

    2)在缓冲模式下,是不是只有1、2、3、4、5这5个ADC工作?

    3)无论是缓冲模式还是非缓冲模式,ADC的分辨率均是1.8V/1024吗?

  • 如果对这篇blog的内容有疑问的,建议到传感器论坛提问,回复会更及时。

    论坛地址:传感器论坛 - 传感器 - E2ETm 设计支持 (ti.com)

  • 你好,

    请参考代码里的相关信息:

    rl_sensor.h

    ...

    /**
    * @brief Number of samples to skip before collecting the data
    * 1 LSB = 0.8 us, Valid range: 0 to 12 us
    */
    rlUInt8_t settlingTime;
    /**
    * @brief Number of samples to collect
    */
    rlUInt8_t sampleCnt;
    #endif
    }rlGpAdcSamples_t;

    ...

    /**
    * @brief Configure number of sample to be \n
    collected for each sensor This array of numOfSamples is for the sensors \n
    which are enabled in above parameter 'enable' \n
    */
    rlGpAdcSamples_t numOfSamples[RL_MAX_GPADC_SENSORS];
    /**
    * @brief Reserved for Future use
    */
    rlUInt16_t reserved0;
    /**
    * @brief Reserved for Future use
    */
    rlUInt32_t reserved1[3U];
    } rlGpAdcCfg_t;

  • 你好,

    你测试的电压范围已经超出了GPADC的可测量范围。下面的信息可以在AWR1642数据手册里找到:

  •     .numOfSamples[0].sampleCnt = 20,

        .numOfSamples[0].settlingTime = 3,

    请问这个的含义是什么?有的程序初始化到了numOfSamples[5].