S32K14X-ADC学习笔记
1、ADC通道数
2、ADC硬件交错通道
3、ADC触发器源
4、ADC特征
5、ADC内存映射及寄存器
5.1、内存映射
5.2、比较重要的寄存器
ADC状态控制寄存器-SC1~SC3
ADC配置寄存器-CFG1
ADC配置寄存器-CFG2
6、ADC配置流程
adc.c文件
#include "adc.h"
/******************************************************************************
*函 数:ADC_Init
*功 能:ADC模块初始化
*参 数:
nadc: ADC模块 ADC0、ADC1
nbit: adc分辨率
*返回值:无
*备 注:无
*******************************************************************************/
void ADC_Init(ADC_Type *base, ADC_nbit nbit)
{
//初始化ADC时钟
if(base == ADC0)
{
PCC->PCCn[PCC_ADC0_INDEX] &=~ PCC_PCCn_CGC_MASK; /* Disable clock to change PCS */
PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1); /* PCS=1: Select SOSCDIV2 */
PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in ADC */
}
else
{
PCC->PCCn[PCC_ADC1_INDEX] &=~ PCC_PCCn_CGC_MASK; /* Disable clock to change PCS */
PCC->PCCn[PCC_ADC1_INDEX] |= PCC_PCCn_PCS(1); /* PCS=1: Select SOSCDIV2 */
PCC->PCCn[PCC_ADC1_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in ADC */
}
base->SC1[0] = ADC_SC1_ADCH(1) /* ADCH=1F: Module is disabled for conversions */
| ADC_SC1_AIEN(0);/* AIEN=0: Interrupts are disabled */
base->CFG1 = ADC_CFG1_ADICLK(0) /* Only ALTCLK1 is available */
| ADC_CFG1_ADIV(0) /* ADIV=0: Prescaler=1 */
| ADC_CFG1_MODE(nbit);/* 0b00: 8-bit, 0b01: 12-bit, 0b10: 10-bit */
base->CFG2 = 0x00000000C; /* SMPLTS=12(default): sample time is 13 ADC clks */
base->SC2 = 0x00000000; /* ADTRG=0: SW trigger */
/* ACFE,ACFGT,ACREN=0: Compare func disabled */
/* DMAEN=0: DMA disabled */
/* REFSEL=0: Voltage reference pins= VREFH, VREEFL*/
base->SC3 = 0x00000000; /* CAL=0: Do not start calibration sequence */
/* ADCO=0: One conversion performed */
/* AVGE,AVGS=0: HW average function disabled */
}
/******************************************************************************
*函 数:ADC_Read
*功 能:ADC采集一次
*参 数:
base: ADC模块 ADC0、ADC1
chn : adc通道
*返回值:ADC值(uint16_t类型)
*备 注:无
*******************************************************************************/
uint16_t ADC_Read(ADC_Type *base, ADC_CH chn)
{
uint16_t adc_result=0;
base->SC1[0]&=~ADC_SC1_ADCH_MASK; /* Clear prior ADCH bits */
base->SC1[0] = ADC_SC1_ADCH(chn); /* Initiate Conversion */
while(!((base->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT)); /* Wait for completion */
adc_result = base->R[0]; /* For SW trigger mode, R[0] is used */
return (uint16_t)(adc_result); /* Convert result to mv for 0-5V range */
}
/******************************************************************************
*函 数:ADC_Ave
*功 能:ADC平均滤波
*参 数:
nadc: ADC模块 ADC0、ADC1
chn : adc通道
N : 平均滤波次数
*返回值:ADC滤波值
*备 注:无
*******************************************************************************/
uint16_t ADC_Ave(ADC_Type *base, ADC_CH chn,uint16_t N)
{
uint32_t tmp = 0;
uint8_t i;
for(i = 0; i < N; i++)
{
tmp += ADC_Read(base, chn);
}
tmp = tmp / N;
return (uint16_t)tmp;
}
adc.h文件
#ifndef __ADC_H__
#define __ADC_H__
#include "S32K142.h" /* include peripheral declarations S32K144 */
typedef enum
{
ADC_SE0=0,
ADC_SE1=1,
ADC_SE2=2,
ADC_SE3=3,
ADC_SE4=4,
ADC_SE5=5,
ADC_SE6=6,
ADC_SE7=7,
ADC_SE8=8,
ADC_SE9=9,
ADC_SE10=10,
ADC_SE11=11,
ADC_SE12=12,
ADC_SE13=13,
ADC_SE14=14,
ADC_SE15=15,
}ADC_CH;
//精度位数
typedef enum ADC_nbit
{
ADC_8bit = 0x00,
ADC_10bit = 0x02,
ADC_12bit = 0x01,
} ADC_nbit;
/******************************************************************************
*函 数:ADC_Init
*功 能:ADC模块初始化
*参 数:
nadc: ADC模块 ADC0、ADC1
nbit: adc分辨率
*返回值:无
*备 注:无
*******************************************************************************/
void ADC_Init(ADC_Type *base, ADC_nbit nbit);
/******************************************************************************
*函 数:ADC_Read
*功 能:ADC采集一次
*参 数:
base: ADC模块 ADC0、ADC1
chn : adc通道
*返回值:ADC值(uint16_t类型)
*备 注:无
*******************************************************************************/
uint16_t ADC_Read(ADC_Type *base, ADC_CH chn);
/******************************************************************************
*函 数:ADC_Ave
*功 能:ADC平均滤波
*参 数:
nadc: ADC模块 ADC0、ADC1
chn : adc通道
N : 平均滤波次数
*返回值:ADC滤波值
*备 注:无
*******************************************************************************/
uint16_t ADC_Ave(ADC_Type *base, ADC_CH chn,uint16_t N);
#endif
main.c文件
#include "include.h"
//延时
void delayms(int ms)
{
volatile uint32_t i = 0;
while(ms--)
{
for (i = 0; i < 10000; ++i)
{
__asm("NOP"); /* delay */
}
}
}
int main(void)
{
SOSC_init_8MHz(); /* Initialize system oscilator for 8 MHz xtal */
SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
char txt[32];
uint16_t ADC_temp[8];
ADC_Init(ADC1, ADC_12bit); //初始化ADC1
uartInit(UART0, 115200);
ADC_temp[3] = ADC_Ave(ADC1, ADC_SE4 , 10); //PTC6
printf("ptc6 : %5d \n", ADC_temp[3]);
ADC_temp[2] = ADC_Ave(ADC1, ADC_SE5 , 10); //PTC7
printf("ptc7 : %5d \n", ADC_temp[2]);
while(1);
return 0;
}