本帖最后由 慕容雪花 于 2025-1-9 10:25 编辑
MCXA156具有非常强大的模拟外设ADC (2路16 bit ADC0与ADC1)与一路12 bit DAC,还配有一路运放单元,2路LPCMP,还有一个温度传感器。
ADC有ADC0与ADC1.
开发板的mikro-bus接口上引出了I2C接口可以后续驱动OLED,还有个ADC引脚P3_30: ANALOG-ADC1_A21,可以作为数据采集入口。
温度传感器TMP235介绍
Adafruit退出的TMP235温度传感器有三个引脚,分别是GND, VCC和模拟温度信号。其中,模块可以3v-5v供电,在外界温度为-50°C时,模拟温度信号的输出为0v;在外界温度为125°C时,模拟温度信号的输出为1.75v
此外,手册还提供了一个通过电压计算温度的公式: Temp °C = 100*(reading in V) - 50。因此,接下来通过ADC获取温度值后,可以方便的进行温度监测等后续功能开发。
硬件实物连接图:
在代码中指定使用ADC1_A21通道:
#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
使用ADC模块的第一步是初始化一个ADC默认配置结构体。
LPADC_GetDefaultConfig(&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) && FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS
mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128;
#endif /* FSL_FEATURE_LPADC_HAS_CTRL_CAL_AVGS */
LPADC_Init(DEMO_LPADC_BASE, &mLpadcConfigStruct);
其中,enableAnalogPreliminary是预先使能ADC相关的模拟电路从而快速开始转换,代价是较高的电流消耗。
bool enableAnalogPreliminary; /*!< ADC analog circuits are pre-enabled and ready to execute conversions without
startup delays(at the cost of higher DC current consumption). */
其次,mLpadcConfigStruct.conversionAverageMode = kLPADC_ConversionAverage128,是在存储转换结果之前在硬件电路上进行均值处理。
接下来配置ADC转换命令:
LPADC_GetDefaultConvCommandConfig(&mLpadcCommandConfigStruct);
mLpadcCommandConfigStruct.channelNumber = DEMO_LPADC_USER_CHANNEL;
#if defined(DEMO_LPADC_USE_HIGH_RESOLUTION) && DEMO_LPADC_USE_HIGH_RESOLUTION
mLpadcCommandConfigStruct.conversionResolutionMode = kLPADC_ConversionResolutionHigh;
#endif /* DEMO_LPADC_USE_HIGH_RESOLUTION */
LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &mLpadcCommandConfigStruct);
设置触发方式:
/* Set trigger configuration. */
LPADC_GetDefaultConvTriggerConfig(&mLpadcTriggerConfigStruct);
mLpadcTriggerConfigStruct.targetCommandId = DEMO_LPADC_USER_CMDID;
mLpadcTriggerConfigStruct.enableHardwareTrigger = false;
LPADC_SetConvTriggerConfig(DEMO_LPADC_BASE, 0U, &mLpadcTriggerConfigStruct); /* Configurate the trigger0. */
获取ADC转换结果并打印:
while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &mLpadcResultConfigStruct))
{
}
static uint32_t tempAdcRaw;
static float tempAdcVolt;
static float Temp;
tempAdcRaw = ((mLpadcResultConfigStruct.convValue) >> 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);
烧录测试:
采样电压值跟温度均为浮点数,没有正常显示,猜测是跟浮点数打印相关的开关没有使能。在fsl_debug_console.h中:
/*! [url=home.php?mod=space&uid=159083]@brief[/url] Definition to printf the float number. */
#ifndef PRINTF_FLOAT_ENABLE
#define PRINTF_FLOAT_ENABLE 1U
#endif /* PRINTF_FLOAT_ENABLE */
再次测试,能够正常获取温度:
|