⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc12.c

📁 MSP430z_f247.rar
💻 C
字号:
# include "ADC12.h"

//设定序列转换通道,从A0通道开始,共五个通道
static unsigned int A0_Results[NUM_OF_RESULTS]={0};
static unsigned int A1_Results[NUM_OF_RESULTS]={0};
static unsigned int A2_Results[NUM_OF_RESULTS]={0};
static unsigned int A3_Results[NUM_OF_RESULTS]={0};
static unsigned int A4_Results[NUM_OF_RESULTS]={0};

//序列通道单次转换忙标志
static unsigned char ADC12_CON_Flag=1;
static unsigned int ADC12_Index = 0;

void ADC12_Device_INIT(void)
{
	//ADC12_INIT();
 	ADC12_SM_INIT();
  	ADC12_PORT_INIT();
}

void ADC12_PORT_INIT(void)
{
	//P1DIR |= 0xff;
	//P1OUT |= 0xff;
}
/****************************************/
//单通道单次转换初始化与获取转换结果
void ADC12_INIT(void)
{
	ADC12CTL0 = ADC12ON+SHT0_8+ MSC;
	ADC12CTL1 = SHP+ CONSEQ_2; 
	ADC12IE |= 0x01;
	ADC12CTL0 |= ENC;
	ADC12CTL0 |= ADC12SC;
}           
//获取单通道单次转换的结果
//相关寄存器设定
void ADC12_SS_INIT(void)
{
  	P6SEL |= BIT0; 							//初始化默认选择A0通道
  	ADC12CTL0 &= ~ENC;						
	
  	ADC12CTL0 = ADC12ON+SHT0_8;				//使用采样保持定时器,单通道单次模式
  	ADC12CTL1 |= SHP| CONSEQ_0| CSTARTADD_0;//默认存储地址为ADC12MEM0
	
	ADC12MCTL0 |= INCH_0;					//选择对应转换存储器的采样通道(A0)
	
	ADC12CTL0 |= ENC;						//允许转换
}
//单通道单次转换,通道可选
unsigned int Get_ADC12_SS(unsigned char ch_INCH)
{
	//因为是单通道单次转换,所以存储寄存器不用选择,
  	//这里使用ADC12MEM0
  	unsigned int SS_Result=0;
	
	while(ADC12CTL0 & ADC12BUSY)
	  	;
  	ADC12CTL0 &= ~ENC;
	
	ADC12MCTL0 &= ~0x0f;					//清除上次转换选择通道
	ADC12MCTL0 |= ch_INCH;					//选择本次转换使用通道
	
	P6SEL &= ~0xff;
	P6SEL |= BIT(ch_INCH);					//选择复用通道
	
	ADC12CTL0 |= ENC;
	ADC12CTL0 |= ADC12SC; 					//开始转换
	
    while (!(ADC12IFG & BIT0));           	//等待转换结束                
		;
	SS_Result=ADC12MEM0;
	return SS_Result;
}

unsigned int Get_Real_Value(unsigned int Value, unsigned char Is_Real)
{
	unsigned long Temp_Value=(unsigned long)Value;
	
  	if(Is_Real)
	{
		Temp_Value = Temp_Value*329/409;//325
	}
  	return (unsigned int)Temp_Value;
}

void Get_Real_ADC12(unsigned int* p_Array, unsigned int* p_Result, 
					unsigned char ch_Sum)
{
	unsigned char i = 0; 
	for(i = 0; i < ch_Sum; i++)
	{
		p_Array[i] = Get_Real_Value(p_Result[i], 1);
	}
}
/******************************************/

//单通道重复转换初始化与获取转换结果
void ADC12_SM_INIT(void)
{
	P6SEL |= BIT0| BIT1| BIT2| BIT3| BIT4;      // Enable A/D channel inputs
	
  	ADC12CTL0 |= ADC12ON| MSC| SHT0_8;          // Turn on ADC12, extend sampling time
                                            	// to avoid overflow of results
  	ADC12CTL1 |= SHP| CONSEQ_3| CSTARTADD_0;    // Use sampling timer, repeated sequence

  	ADC12MCTL0 |= INCH_0;                      	// ref+=AVcc, channel = A0
  	ADC12MCTL1 |= INCH_1;                      	// ref+=AVcc, channel = A1
  	ADC12MCTL2 |= INCH_2;                      	// ref+=AVcc, channel = A2
  	ADC12MCTL3 |= INCH_3;                  		// ref+=AVcc, channel = A3, end seq.
	ADC12MCTL4 |= INCH_4| EOS;
  	
	ADC12IE |= BIT4;                           	// Enable ADC12IFG.4

  	ADC12CTL0 |= ENC;                         	// Enable conversions
 	ADC12CTL0 |= ADC12SC;                     	// Start convn - software trigger
	Stop_ADC12_SM();
}
void Clear_ADC_Register(void)
{
	ADC12CTL0 = 0;
	ADC12CTL1 = 0;
	ADC12IE &= ~BIT4;
}

void Begin_ADC12_SM(void)
{
	ADC12CTL0 |= ENC;                         	// Enable conversions
 	ADC12CTL0 |= ADC12SC;                     	// Start convn - software trigger
}

void Stop_ADC12_SM(void)
{
	ADC12CTL0 &= ~ENC;                         
 	ADC12CTL0 &= ~ADC12SC;                     
}

void Get_ADC12_SM(unsigned int* p_Result)
{
	//通过取平均值增加了精确度	
  	unsigned char i = 0;
	unsigned int Temp_Result_Sum=0;
	Begin_ADC12_SM();						//启动单通道序列转换
	while(ADC12_CON_Flag)					//等待一轮转换结束
	  	;
	//这段代码看似冗长,但可以节约一定时间
	//****************************************
	//A0通道
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		Temp_Result_Sum += A0_Results[i];
	}
	p_Result[0] = Temp_Result_Sum / NUM_OF_RESULTS;
	Temp_Result_Sum = 0;
	//A1通道
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		Temp_Result_Sum += A1_Results[i];
	}
	p_Result[1] = Temp_Result_Sum / NUM_OF_RESULTS;
	Temp_Result_Sum = 0;
	//A2通道
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		Temp_Result_Sum += A2_Results[i];
	}
	p_Result[2] = Temp_Result_Sum / NUM_OF_RESULTS;
	Temp_Result_Sum = 0;
	//A3通道
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		Temp_Result_Sum += A3_Results[i];
	}
	p_Result[3] = Temp_Result_Sum / NUM_OF_RESULTS;
	Temp_Result_Sum = 0;
	//A4通道
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		Temp_Result_Sum += A4_Results[i];
	}
	p_Result[4] = Temp_Result_Sum / NUM_OF_RESULTS;
	Temp_Result_Sum = 0;
	//Clear_ADC_Buffer();
	//*************************************************
}

void Clear_ADC_Buffer(void)
{
	unsigned char i = 0;
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		A0_Results[i]=0;
	}
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		A1_Results[i]=0;
	}
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		A2_Results[i]=0;
	}
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		A3_Results[i]=0;
	}
	for(i=0; i<NUM_OF_RESULTS; i++)
	{
		A4_Results[i]=0;
	}
}

#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
  	A0_Results[ADC12_Index] = ADC12MEM0;            // Move A0 results, IFG is cleared
  	A1_Results[ADC12_Index] = ADC12MEM1;            // Move A1 results, IFG is cleared
  	A2_Results[ADC12_Index] = ADC12MEM2;            // Move A2 results, IFG is cleared
  	A3_Results[ADC12_Index] = ADC12MEM3;            // Move A3 results, IFG is cleared
	A4_Results[ADC12_Index] = ADC12MEM4;            // Move A3 results, IFG is cleared
	
	ADC12_Index = (ADC12_Index+1)%NUM_OF_RESULTS;  	// Increment results index, modulo; Set Breakpoint1 here
	
	if(ADC12_Index==0)								//一轮转换完成,数据将被读出
	{
		ADC12_CON_Flag=0;							//清除忙标志
		Stop_ADC12_SM();							//转换结束
	}
	else
	{
		ADC12_CON_Flag=1;							//设置忙标志,正在转换
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -