前言
学习使用配置ADC模块,比如电压、温度的采集与检测等。本文章只讲解配置,原理暂不做讲解
EB Tresos需要的模块:
1.Port模块:配置ADC引脚
2.Mcu模块:时钟
3.Platfrom模块:使能ADC的中断
4.ADC模块:配置相关ADC的参数
1.Port模块的配置
本次使用的ADC: ADC0:一个通道,ADC0_X_3。 ADC1:三个通道,ADC1_X_0、ADC1_X_2和ADC1_S15
2.Platform模块的配置
使能ADC0与ADC1的中断,路径为Platform – Interrupt Contrller – 创建并进入 – Interrupt Configuration – 创建选择中断并使能中断
3.Mcu模块的配置
Mcu这里主要是配置ADC所需的时钟和使能ADC
使能ADC
路径:Mcu – McuModeSettingConf – 创建并进入 – McuPeripheral – 创建并使能ADC
配置ADC的时钟
根据S32K312的时钟树,ADC的时钟来源于CORE_CLK
采用外部晶振,使能PLL,然后分频得到
4.ADC模块的配置
使能ADC的中断
使能ADC的中断,ADC0与ADC1
添加ADC的Trigger
添加AdcHwUnit的通道
本次共使用ADC0与ADC1,采用中断模式
ADC0的配置(单个通道)
添加ADC的通道,选择Port已配置的引脚,例如ADC0配置的是X3,选择通道就该为X3开头的,要一一对应
添加ADC的组,这里是管理通道的,一个组可以管理多个通道
路径:ADCGroup – 创建并进入 – 设置参数,本次选用oneshot模式,并使能中断函数
在AdcGroupDefinition添加通道,管理多个通道
ADC1的配置(多个通道)
同理进入ADC1的配置,共3个通道
进入Group管理,其他的同ADC0配置,设置中断函数
在这里,ADC配置就结束了
简要代码
#include "Adc.h" //Import the header file generated by EB
//Single acquisition ADC0
static uint8 Adc0ConversionCompleteState = 0;
static Adc_ValueGroupType Adc0GroupResultBuffer = 0;
static Adc_ValueGroupType Adc0ReadGroupResult = 0;
//Multiple acquisition ADC1
#define ADC1_GROUP_NUMBER (2U)
static uint8 Adc1ConversionCompleteState = 0;
static Adc_ValueGroupType Adc1GroupResultBuffer[ADC1_GROUP_NUMBER] = {0};
static Adc_ValueGroupType Adc1ReadGroupResult[ADC1_GROUP_NUMBER] = {0};
void Adc0_Notification(void)
{
Adc0ConversionCompleteState = 1;
}
void Adc1_Notification(void)
{
Adc1ConversionCompleteState = 1;
}
void enable_and_start_adc_conversion_(void)
{
Adc0ConversionCompleteState = 0;
Adc1ConversionCompleteState = 0;
//Set the conversion result buffer
Adc_SetupResultBuffer(AdcHwUnit_1, &Adc0GroupResultBuffer); //ADC0
Adc_SetupResultBuffer(AdcHwUnit_0, Adc1GroupResultBuffer); //ADC1
//Enable interrupt function
Adc_EnableGroupNotification(AdcHwUnit_0);
Adc_EnableGroupNotification(AdcHwUnit_1);
//Open conversion
Adc_StartGroupConversion(AdcGroup_0);
Adc_StartGroupConversion(AdcGroup_1);
}
float get_Adc0_value(void)
(
float32 adc0_value = 0;
if(Adc0ConversionCompleteState == 1)
{
Adc0ConversionCompleteState = 0;
Adc_ReadGroup(AdcHwUnit_0, &Adc0ReadGroupResult);
adc0_value = Adc0ReadGroupResult;
Adc_StartGroupConversion(AdcHwUnit_0);
}
return adc0_value;
)
void get_Adc1_values(void)
{
float32 adc1_value1 = 0;
float32 adc1_value2 = 0;
if(Adc0ConversionCompleteState == 1)
{
Adc0ConversionCompleteState = 0;
Adc_ReadGroup(AdcHwUnit_1, &Adc1ReadGroupResult);
adc1_value1 = Adc1ReadGroupResult[0];
adc1_value2 = Adc1ReadGroupResult[1];
Adc_StartGroupConversion(AdcHwUnit_1);
}
}
总结
后续进行更新吧,要抓紧学技术了