0
点赞
收藏
分享

微信扫一扫

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

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;
}

举报

相关推荐

0 条评论