简介:
在汽车电子的应用中,对于汽车的电平的采集会爱很多场景下使用到,根据电瓶的电压等级来决定ECU的行为,本次是使用S32K的ADC 模块来模拟验证车载电瓶电压的采集。以下是S32K1XX 系列的ADC IP框图及Triger Source。


PIN 脚配置:
根据硬件的PIN脚,配置PA6 为ADC 功能,默认ADC 功能回路由到PA6,本地显性的配置为ADC功能。

时钟配置:
ADC0 时钟默认开启,时钟源为内部slow 8M RC时钟(SIRC),以下是时钟树的路由。

ADC 参数配置:
以下是ADC IP 的配置和对应channel 的参数配置

上述参数主要涉及到ADC 的时钟分频的设定,IP内部可以对输入时钟进行1、2、4、8 的分频设置,开发手册说明如下

ADC 转换触发方式的配置,我们配置为软件触发,及参考电压的配置为VrefH and VrefL

/*******************************************************************************
* adc_config_1 initialization code
******************************************************************************/
/* clang-format off */
/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
instance:
- name: 'adc_config_1'
- type: 'adc_config'
- mode: 'general'
- custom_name_enabled: 'false'
- type_id: 'adc'
- functional_group: 'BOARD_InitPeripherals'
- peripheral: 'ADC_0'
- config_sets:
- adc:
- adcConverterCfg:
- 0:
- name: 'adc_config_1_ConvConfig0'
- readonly: 'true'
- clockDivide: 'ADC_CLK_DIVIDE_4'
- sampleTime: '255'
- resolution: 'ADC_RESOLUTION_12BIT'
- inputClock: 'ADC_CLK_ALT_1'
- trigger: 'ADC_TRIGGER_SOFTWARE'
- pretriggerSel: 'ADC_PRETRIGGER_SEL_PDB'
- triggerSel: 'ADC_TRIGGER_SEL_PDB'
- dmaEnable: 'false'
- voltageRef: 'ADC_VOLTAGEREF_VREF'
- continuousConvEnable: 'false'
- supplyMonitoringEnable: 'false'
- adcCompareCfg: []
- adcAverageCfg: []
- adcChanCfg:
- 0:
- name: 'adc_config_1_ChnConfig0'
- readonly: 'true'
- interruptEnable: 'false'
- channel: 'ADC_INPUTCHAN_EXT2'
* BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
/* clang-format on */
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.7, External variable could be made static.
* The external variables will be used in other source files in application code.
*
*/
const adc_converter_config_t adc_config_1_ConvConfig0 = {
.clockDivide = ADC_CLK_DIVIDE_4,
.sampleTime = 255U,
.resolution = ADC_RESOLUTION_12BIT,
.inputClock = ADC_CLK_ALT_1,
.trigger = ADC_TRIGGER_SOFTWARE,
.pretriggerSel = ADC_PRETRIGGER_SEL_PDB,
.triggerSel = ADC_TRIGGER_SEL_PDB,
.dmaEnable = false,
.voltageRef = ADC_VOLTAGEREF_VREF,
.continuousConvEnable = false,
.supplyMonitoringEnable = false
};
const adc_chan_config_t adc_config_1_ChnConfig0 = {
.interruptEnable = false,
.channel = ADC_INPUTCHAN_EXT2
};ADC 功能验证
添加如下代码模拟读取电池电压:
#include "sdk_project_config.h"
#include <stdio.h>
#include "littleshell.h"
/********************************************************************************************************
* Global Function Declarations *
*******************************************************************************************************/
void adc_init(void)
{
/* Init ADC IP config*/
ADC_DRV_ConfigConverter(INST_ADC_CONFIG_1,&adc_config_1_ConvConfig0);
/* Config channel */
ADC_DRV_ConfigChan(INST_ADC_CONFIG_1, 0, &adc_config_1_ChnConfig0);
}
uint16_t ADC_Read(adc_inputchannel_t chan)
{
uint16_t adc_count;
adc_config_1_ChnConfig0.channel = chan;
ADC_DRV_ConfigChan(INST_ADC_CONFIG_1, 0, &adc_config_1_ChnConfig0);
while( (ADC_DRV_GetConvCompleteFlag(INST_ADC_CONFIG_1,0)) == false){};
ADC_DRV_GetChanResult(INST_ADC_CONFIG_1, 0, (uint16_t *)&adc_count);
return adc_count;
}
#define AD_GAIN() 13478 //13478 = ((4096*(40.2/(330+40.2)))/(3.3))*100
unsigned int bat(char argc,char *argv[])
{
uint16_t value,batt_value;
value = ADC_Read(ADC_INPUTCHAN_EXT2);
batt_value = (uint16_t)((((uint32_t)(value) * 100*100)/AD_GAIN()));
printf("bat %d \r\n",batt_value);
return 0;
}
LTSH_FUNCTION_EXPORT(bat,"get battry value");下载代码到板子中,调整电源电压通过bat shell 命令打印读取的ADC 电压值信息,验证结果如下,调整开关电源电压,ADC 读取的数值和电源一致,说明ADC功能已经按照工作起来。

我要赚赏金
