jinglixixi 发表于 2025-1-10 21:38

【MCXA156开发板测评】+A/D数据采集测试

本帖最后由 jinglixixi 于 2025-1-15 22:48 编辑

<p>MCXA156具有2路16 bit ADC0与ADC1与一路12 bit DAC,并配有一路运放单元,2路LPCMP及一个温度传感器。</p>

<p>使用ADC0_A2进行数据采集的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    lpadc_config_t mLpadcConfigStruct;
    lpadc_conv_trigger_config_t mLpadcTriggerConfigStruct;
    lpadc_conv_command_config_t mLpadcCommandConfigStruct;
    lpadc_conv_result_t mLpadcResultConfigStruct;
    RESET_ReleasePeripheralReset(kADC1_RST_SHIFT_RSTn);
    CLOCK_SetClockDiv(kCLOCK_DivADC1, 1u);
    CLOCK_AttachClk(kFRO12M_to_ADC1);
    BOARD_InitPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();
    PRINTF("LPADC Polling Example\r\n");
    LPADC_GetDefaultConfig(&amp;mLpadcConfigStruct);
    mLpadcConfigStruct.enableAnalogPreliminary = true;
#if defined(DEMO_LPADC_VREF_SOURCE)
    mLpadcConfigStruct.referenceVoltageSource = DEMO_LPADC_VREF_SOURCE;
#endif /* DEMO_LPADC_VREF_SOURCE */
#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS) &amp;&amp; FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS
    mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128;
#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */
    LPADC_Init(DEMO_LPADC_BASE, &amp;mLpadcConfigStruct);
#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE) &amp;&amp; FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE
    LPADC_SetOffsetCalibrationMode(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_CALIBRATION_MODE);
#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CALOFSMODE */

#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CALOFS) &amp;&amp; FSL_FEATURE_LPADC_HAS_CTRL_CALOFS
#if defined(DEMO_LPADC_DO_OFFSET_CALIBRATION) &amp;&amp; DEMO_LPADC_DO_OFFSET_CALIBRATION
    LPADC_DoOffsetCalibration(DEMO_LPADC_BASE);
#else
#if defined(FSL_FEATURE_LPADC_HAS_OFSTRIM) &amp;&amp; FSL_FEATURE_LPADC_HAS_OFSTRIM
#if defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) &amp;&amp; (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 2U)
    LPADC_SetOffsetValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE_A, DEMO_LPADC_OFFSET_VALUE_B);
#elif defined(FSL_FEATURE_LPADC_OFSTRIM_COUNT) &amp;&amp; (FSL_FEATURE_LPADC_OFSTRIM_COUNT == 1U)
    LPADC_SetOffsetValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE);
#endif

#else
    if (DEMO_LPADC_OFFSET_CALIBRATION_MODE == kLPADC_OffsetCalibration12bitMode)
    {
      LPADC_SetOffset12BitValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE_A, DEMO_LPADC_OFFSET_VALUE_B);
    }
    else
    {
      LPADC_SetOffset16BitValue(DEMO_LPADC_BASE, DEMO_LPADC_OFFSET_VALUE_A, DEMO_LPADC_OFFSET_VALUE_B);
    }
#endif

#endif
#endif

#if defined(FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ) &amp;&amp; FSL_FEATURE_LPADC_HAS_CTRL_CAL_REQ
    LPADC_DoAutoCalibration(DEMO_LPADC_BASE);
#endif
#if (defined(FSL_FEATURE_LPADC_HAS_CFG_CALOFS) &amp;&amp; FSL_FEATURE_LPADC_HAS_CFG_CALOFS)
    LPADC_DoAutoCalibration(DEMO_LPADC_BASE);
#endif
    LPADC_GetDefaultConvCommandConfig(&amp;mLpadcCommandConfigStruct);
    mLpadcCommandConfigStruct.channelNumber = DEMO_LPADC_USER_CHANNEL;
#if defined(DEMO_LPADC_USE_HIGH_RESOLUTION) &amp;&amp; DEMO_LPADC_USE_HIGH_RESOLUTION
    mLpadcCommandConfigStruct.conversionResolutionMode = kLPADC_ConversionResolutionHigh;
#endif
    LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &amp;mLpadcCommandConfigStruct);
    LPADC_GetDefaultConvTriggerConfig(&amp;mLpadcTriggerConfigStruct);
    mLpadcTriggerConfigStruct.targetCommandId       = DEMO_LPADC_USER_CMDID;
    mLpadcTriggerConfigStruct.enableHardwareTrigger = false;
    LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 0U, &amp;mLpadcTriggerConfigStruct);
    PRINTF("ADC Full Range: %d\r\n", g_LpadcFullRange);
#if defined(FSL_FEATURE_LPADC_HAS_CMDL_CSCALE) &amp;&amp; FSL_FEATURE_LPADC_HAS_CMDL_CSCALE
    if (kLPADC_SampleFullScale == mLpadcCommandConfigStruct.sampleScaleMode)
    {
      PRINTF("Full channel scale (Factor of 1).\r\n");
    }
    else if (kLPADC_SamplePartScale == mLpadcCommandConfigStruct.sampleScaleMode)
    {
      PRINTF("Divided input voltage signal. (Factor of 30/64).\r\n");
    }
#endif
    PRINTF("Please press any key to get user channel's ADC value.\r\n");
    while (1)
    {
      GETCHAR();
      LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1U);
#if (defined(FSL_FEATURE_LPADC_FIFO_COUNT) &amp;&amp; (FSL_FEATURE_LPADC_FIFO_COUNT == 2U))
      while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &amp;mLpadcResultConfigStruct, 0U))
#else
      while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &amp;mLpadcResultConfigStruct))
#endif
      {
      }
      PRINTF("ADC value: %d\r\n", ((mLpadcResultConfigStruct.convValue) &gt;&gt; g_LpadcResultShift));
    }
}
</code></pre>

<p>&nbsp;</p>

<p>经程序的编译与下载,由J8端口的28号引脚可输入相应的模拟信号,其测试结果如图1所示。</p>

<p>在连续采集数据时,需通过串口来方式字符以不断进行。</p>

<p> &nbsp;</p>

<p>图1 数据采集</p>

<p>&nbsp;</p>

<p>在使用内部温度传感器通道的情况下,可进行内部温度的检测,其效果如图2所示。</p>

<p> &nbsp;</p>

<p>图2 内部温度检测</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>图3&nbsp; ADC 引脚分配</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【MCXA156开发板测评】+A/D数据采集测试