这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】S32K146 ADC 模块配置使用

共4条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】S32K146 ADC 模块配置使用

工程师
2025-03-02 14:23:19     打赏

简介:

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

image.png

image.png

PIN 脚配置:

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

image.png

时钟配置:

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

image.png

ADC 参数配置:

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

image.png

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

image.png

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

image.png

/*******************************************************************************
 * 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())*0.976);
    printf("bat %d \r\n",batt_value);
    return 0;
}

LTSH_FUNCTION_EXPORT(bat,"get battry value");

下载代码到板子中,调整电源电压通过bat shell 命令打印读取的ADC 电压值信息,验证结果如下,调整开关电源电压,ADC 读取的数值和电源一致,说明ADC功能已经按照工作起来。

S32K >
S32K >bat
bat 1179

S32K >bat
bat 1178

S32K >bat
bat 1178

S32K >
S32K >bat
bat 1228

S32K >bat
bat 730

S32K >





专家
2025-03-02 17:01:06     打赏
2楼

感谢分享


专家
2025-03-02 17:03:31     打赏
3楼

感谢分享


专家
2025-03-02 17:04:33     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]