6、S32K14X学习笔记(六)S32K14X-ADC学习笔记
时间:2022-10-06 12:00:01
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特征
线性连续接近算法,高达12位分辨率;
2、最多有32个单端外部模拟输入;
三、单端12位、10位、8位输出模式;
4.以右对齐格式输出单端输出;
5.单一或连续的转换模式;
6.单次转换后自动恢复空闲状态;
7.采样时间和转换速度/功率可配置;
8.转换完成/硬件平均完成的标志和中断;
9.输入时钟可从多达四个源中选择;
10.低功率模式下操作,实现低噪声;
11.硬件转换触发器和硬件通道的选择;
自动比较和中断小于、大于或等于、在范围内或超出范围的可编程值;
硬件平均化;
可选电压参考:外部或备用;
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、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;
}
项目的仿真和PCB工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“S32K14X-DMA”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!