锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

6、S32K14X学习笔记(六)S32K14X-ADC学习笔记

时间:2022-10-06 12:00:01 速度传感器spll85a

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”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章