本文主要是介绍6、S32K14X学习笔记(六)S32K14X-ADC学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
S32K14X-ADC学习笔记
S32K14x包含两个12位ADC模块:ADC0和ADC1;而S32K11x只包含一个12位的ADC模块:ADC0。
1、ADC通道数
每个ADC最多支持32个外部模拟输入通道,但设备上出现的确切ADC通道号与下表所示的软件包不同。
芯片的ADCx_SC1n[ADCH]位配置符合该芯片的最大通道配置:
2、ADC硬件交错通道
该设备上的硬件交错实现如下:
①、ADC0_4和ADC1_14通道交错在PTB0上;
②、ADC0_5和ADC1_15通道交错在PTB1上;
③、ADC0_8和ADC1_8通道交错在PTB13上;
④、ADC0_9和ADC1_9通道交错在PTB14上;
3、ADC触发器源
4、ADC特征
1、线性连续逼近算法,高达12位分辨率;
2、最多有32个单端外部模拟输入;
3、单端12位、10位和8位输出模式;
4、单端输出以右对齐的格式输出;
5、单一的或连续的转换模式;
6、在单次转换后自动恢复到空闲状态;
7、可配置的采样时间和转换速度/功率;
8、转换完成/硬件平均完成的标志和中断;
9、输入时钟可从多达四个源中进行选择;
10、在低功率模式下操作,以实现低噪音;
11、可选择的硬件转换触发器与硬件通道的选择;
12、自动比较与中断的小于、大于或等于、在范围内、或超出范围的可编程值;
13、硬件平均化;
14、可选择的电压参考:外部或备用;
15、自校准模式。
5、ADC内存映射及寄存器
5.1、内存映射
ADC0 base address: 4003_B000h
ADC1 base address: 4002_7000h
5.2、比较重要的寄存器
ADC状态控制寄存器-SC1~SC3
用于软件和硬件触发的操作模式。
ADC配置寄存器-CFG1
配置寄存器1(CFG1)用于选择操作模式、时钟源、时钟划分。
ADC配置寄存器-CFG2
6、ADC配置流程
adc.c文件
#include "adc.h"/*******************************************************************************函 数:ADC_Init*功 能:ADC模块初始化*参 数:nadc: ADC模块 ADC0、ADC1nbit: 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、ADC1chn : 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、ADC1chn : 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、ADC1nbit: adc分辨率 *返回值:无*备 注:无*******************************************************************************/
void ADC_Init(ADC_Type *base, ADC_nbit nbit);/*******************************************************************************函 数:ADC_Read*功 能:ADC采集一次*参 数:base: ADC模块 ADC0、ADC1chn : adc通道*返回值:ADC值(uint16_t类型)*备 注:无*******************************************************************************/
uint16_t ADC_Read(ADC_Type *base, ADC_CH chn);/******************************************************************************
*函 数:ADC_Ave
*功 能:ADC平均滤波
*参 数:nadc: ADC模块 ADC0、ADC1chn : 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); //初始化ADC1uartInit(UART0, 115200);ADC_temp[3] = ADC_Ave(ADC1, ADC_SE4 , 10); //PTC6printf("ptc6 : %5d \n", ADC_temp[3]);ADC_temp[2] = ADC_Ave(ADC1, ADC_SE5 , 10); //PTC7printf("ptc7 : %5d \n", ADC_temp[2]);while(1);return 0;
}
项目的仿真和PCB工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“S32K14X-DMA”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
这篇关于6、S32K14X学习笔记(六)S32K14X-ADC学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!