简介:
在汽车电子的应用中,对于汽车的电平的采集会爱很多场景下使用到,根据电瓶的电压等级来决定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 功能验证
添加如下代码模拟读取电池电压:
/******************************************************************************************************** * 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,chan)) == 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())*0.976); printf("bat %d \r\n",batt_value); return 0; } LTSH_FUNCTION_EXPORT(bat,"get battry value");
下载代码到板子中,调整电源电压通过bat shell 命令打印读取的ADC 电压值信息,验证结果如下。