慕容雪花 发表于 2025-1-7 15:10

【MCXA156开发板测评】-2-ADC

本帖最后由 慕容雪花 于 2025-1-9 10:25 编辑

<p>MCXA156具有非常强大的模拟外设ADC (2路16 bit ADC0与ADC1)与一路12 bit DAC,还配有一路运放单元,2路LPCMP,还有一个温度传感器。</p>

<p> &nbsp;</p>

<p>ADC有ADC0与ADC1.</p>

<p> &nbsp;&nbsp;&nbsp;</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>开发板的mikro-bus接口上引出了I2C接口可以后续驱动OLED,还有个ADC引脚P3_30: ANALOG-ADC1_A21,可以作为数据采集入口。</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:18px;">温度传感器TMP235介绍</span></strong><br />
Adafruit退出的TMP235温度传感器有三个引脚,分别是GND, VCC和模拟温度信号。其中,模块可以3v-5v供电,在外界温度为-50&deg;C时,模拟温度信号的输出为0v;在外界温度为125&deg;C时,模拟温度信号的输出为1.75v<br />
此外,手册还提供了一个通过电压计算温度的公式: Temp &deg;C = 100*(reading in V) - 50。因此,接下来通过ADC获取温度值后,可以方便的进行温度监测等后续功能开发。</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p><strong><span style="font-size:18px;">硬件实物连接图:</span></strong></p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>在代码中指定使用ADC1_A21通道:</p>

<pre>
<code>#define DEMO_LPADC_BASE                  ADC1
#define DEMO_LPADC_USER_CHANNEL          21U
#define DEMO_LPADC_USER_CMDID            1U                        /* CMD1 */
#define DEMO_LPADC_VREF_SOURCE         kLPADC_ReferenceVoltageAlt3 /* VDDA */
#define DEMO_LPADC_DO_OFFSET_CALIBRATION true
#define DEMO_LPADC_USE_HIGH_RESOLUTION   true</code></pre>

<p>使用ADC模块的第一步是初始化一个ADC默认配置结构体。</p>

<pre>
<code>    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);</code></pre>

<p>其中,<u><span style="font-family:Times;">enableAnalogPreliminary</span></u>是预先使能ADC相关的模拟电路从而快速开始转换,代价是较高的电流消耗。</p>

<pre>
<code>    bool enableAnalogPreliminary; /*!&lt; ADC analog circuits are pre-enabled and ready to execute conversions without
                                       startup delays(at the cost of higher DC current consumption). */</code></pre>

<p>其次,mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128,是在存储转换结果之前在硬件电路上进行均值处理。</p>

<p> &nbsp;<br />
&nbsp;</p>

<p>接下来配置ADC转换命令:</p>

<pre>
<code>    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 /* DEMO_LPADC_USE_HIGH_RESOLUTION */
    LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &amp;mLpadcCommandConfigStruct);</code></pre>

<p>设置触发方式:</p>

<pre>
<code>    /* Set trigger configuration. */
    LPADC_GetDefaultConvTriggerConfig(&amp;mLpadcTriggerConfigStruct);
    mLpadcTriggerConfigStruct.targetCommandId       = DEMO_LPADC_USER_CMDID;
    mLpadcTriggerConfigStruct.enableHardwareTrigger = false;
    LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 0U, &amp;mLpadcTriggerConfigStruct); /* Configurate the trigger0. */</code></pre>

<p>获取ADC转换结果并打印:</p>

<pre>
<code>      while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &amp;mLpadcResultConfigStruct))
      {
      }
      static uint32_t tempAdcRaw;
                static float tempAdcVolt;
                static float Temp;
                tempAdcRaw = ((mLpadcResultConfigStruct.convValue) &gt;&gt; g_LpadcResultShift);
                tempAdcVolt = 3.3*tempAdcRaw/65536;
                Temp = (100.0*tempAdcVolt-50);
      PRINTF("ADC value: %d, Voltage: %.3f Volt, Temperature_C: %.2f degree_C\r\n", tempAdcRaw, tempAdcVolt, Temp);</code></pre>

<p>烧录测试:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>采样电压值跟温度均为浮点数,没有正常显示,猜测是跟浮点数打印相关的开关没有使能。在fsl_debug_console.h中:</p>

<pre>
<code>/*! @brief Definition to printf the float number. */
#ifndef PRINTF_FLOAT_ENABLE
#define PRINTF_FLOAT_ENABLE 1U
#endif /* PRINTF_FLOAT_ENABLE */</code></pre>

<p>再次测试,能够正常获取温度:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

慕容雪花 发表于 2025-1-11 13:13

<p>补充一下ADC1的配置:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>
页: [1]
查看完整版本: 【MCXA156开发板测评】-2-ADC