一,S32K144的ADC介绍
1,ADC模块特性
S32K14x和S32K14xW包含两个12位ADC模块,ADC0和ADC1。
S32K11x包含一个12位的ADC模块,ADC0。
不同封装,ADC0和ADC1所包含的通道数不一样,LQFP100来说ADC0和ADC1分别有16个外部通道。
- 双ADC模块支持交错(interleave)采样通道
43.4 ADC硬件交错通道在有两个ADC的设备上,有几种特殊的ADC通道支持多个ADC之间的硬件交错。以ADC0_SE4和ADC1_SE14通道为例,这两个通道可以独立工作,但它们也可以是硬件交错的,如下图所示。在硬件交错模式下,引脚PTB0上的一个信号都可以通过ADC0和ADC1进行采样。交错模式由SIM_CHIPCTL[ADC_INTERLEAVE_EN]位启用。
2,ADC的电源和参考电压
VREFH/VREFL -连接作为主要参考选项
VALTH/VREFL -连接作为备用参考选项
ADCx_SC2[REFSEL]位为ADC的电压参考源。有关更多细节,请参阅ADC章节中的REFSEL描述。在所有的S32K1xx设备中,VALTH与VDDA相同。在没有专用VREFH / VREFL引脚的包中,VREFH在包中连接到VDDA,VREFL连接到VSSA。如果外部可用,正参考应连接到与VDDA相同的电位,或者可能由外部源驱动到最小VREFH和VDDA电位之间的水平。VREFH永远不能超过VDDA。VREFL应被连接到与VSSA相同的电压电位上。
3,ADC的触发源
- ADC触发源
- 触发器通过 PDB 或者 TRGMUX 连接,并提供灵活的触发组合。
- 2xPDB 产生触发和预触发给 2xADC(ADC 和 PDB 都是成对动作的,例如 PDB0 和 ADC0,PDB1 和 ADC1),每个 PDB 通道最多有8个与处罚期给 ADC 通道控制。
- 每个ADC最少有1个外部引脚(通过TRGMUX支持)
- 软件必须确认相对的优先级
- 在上一个转换完成后开始下一个转换
- 通过 TRGMUX,CMP 输出,LPIT,RTC 和 LPTMR 都可以作为每个ADC的触发源。
- LPIT 支持最多4个与处罚期,来限制只在每个 ADC 的 ADHWTSO~ADHWTS3。对于剩下的外设,需要软件扩张来提供预触发器,这部分参照 SIM_ADCOPT[ADCxSWPRETRG] 设置软件预触发器。
什么是ADC的触发源,可以参考以下文章
工程师笔记|ADC 触发源介绍-电子头条-EEWORLD电子工程世界
4,ADC的特征
- ADC特征
- 12-bit精度的线性逐次逼近算法
- 最多16个单端模拟外部输入
- 输出模式:
- 单端12-bit,10-bit,8-bit
- 单端输出为右对齐的无符号形式
- 单次或持续转换
- 可配置的采样时间和转换速度/功率
- 转换完成/硬件平均值计算完成标志和中断
- 4种输入时钟源选择
- 低噪声低功率运行模式
- 可选的硬件转换触发器
- 自动产生多于,少于或等于的比较中断,或者是在范围内、范围外或一个可配置的值
- 温度传感器
- 硬件平均值计算功能
- 可选的电压参考值:外部的或可供选择的
- 自我矫正模式
5,ADC的结构框图
二,ADC在S32DS中的配置
1,添加ADC模块到工程
2,选择用哪个ADC
3,配置ADC
4,将使用的ADC 外部通道添加进来
三,程序中使用
1,初始化
ADC_DRV_ConfigConverter(INST_ADCONV1, &adConv1_ConvConfig0);
ADC_DRV_AutoCalibration(INST_ADCONV1);
2,读取函数
float ADC_GET_EXT2(void)
{
float adcValue;
uint16_t adcRawValue;
uint16_t adcMax = 4096;
/* Configure ADC channel and software trigger a conversion */
ADC_DRV_ConfigChan(INST_ADCONV1, 0U, &adConv1_ChnConfig0);
/* Wait for the conversion to be done */
ADC_DRV_WaitConvDone(INST_ADCONV1);
/* Store the channel result into a local variable */
ADC_DRV_GetChanResult(INST_ADCONV1, 0U, &adcRawValue);
/* Process the result to get the value in volts */
adcValue = ((float) adcRawValue / adcMax) * (ADC_VREFH - ADC_VREFL);
return adcValue;
}
float ADC_GET_EXT3(void)
{
float adcValue;
uint16_t adcRawValue;
uint16_t adcMax = 4096;
/* Configure ADC channel and software trigger a conversion */
ADC_DRV_ConfigChan(INST_ADCONV1, 0U, &adConv1_ChnConfig1);
/* Wait for the conversion to be done */
ADC_DRV_WaitConvDone(INST_ADCONV1);
/* Store the channel result into a local variable */
ADC_DRV_GetChanResult(INST_ADCONV1, 0U, &adcRawValue);
/* Process the result to get the value in volts */
adcValue = ((float) adcRawValue / adcMax) * (ADC_VREFH - ADC_VREFL);
return adcValue;
}
3,调用
float adcValue0 = ADC_GET_EXT2();
float adcValue1 = ADC_GET_EXT3();
参考文章
【S32K 进阶之旅】ADC 模块介绍与应用 - 大大通 (wpgdadatong.com)
S32K144之SDK版:ADC模块使用_*balance的博客-CSDN博客_s32k adc
S32K144(14)ADC_Suifqwu的博客-CSDN博客_trgmux