用SDK包開發K66FX18學習筆記(5)

ADC採集(光敏電阻)

1、宏定義

#define ADC0_INSTANCE				ADC0
#define ADC1_GPIO					GPIOA
#define ADC1_PORT					PORTA
#define ADC1_PIN0					7U		//ADC引腳號
#define ADC1_CHANNEL				10U		//ADC通道號,即ADC0通道10
#define ADC1_CHANNEL_GROUP			0U		//通道組,最多8個(0-7)

2、ADC採集初始化

void ADC_PORT_INIT(void)//ADC端口時鐘初始化與端口複用
{
	CLOCK_EnableClock(kCLOCK_PortA);//使能端口時鐘
	PORT_SetPinMux(ADC1_PORT,ADC1_PIN0,kPORT_PinDisabledOrAnalog);//端口複用爲ADC模式
}

void ADC_CONFIG(void)//ADC配置
{
	adc16_config_t ADCconfig;//定義ADC初始化句柄
	
	ADC16_GetDefaultConfig(&ADCconfig);//配置重置
	
	ADCconfig.resolution = kADC16_ResolutionSE12Bit;//ADC分辨率爲12位
	ADCconfig.enableContinuousConversion = true;//使能連續採樣模式
	ADC16_Init(ADC0_INSTANCE,&ADCconfig);//初始化
	
	ADC16_EnableHardwareTrigger(ADC0_INSTANCE,false);//失能硬件流
	//ADC16_SetHardwareAverage(ADC_INSTANCE,kADC16_HardwareAverageCount32);//設置ADC硬件求平均值
}

void ADC_CHANNEL_CONFIG(void)//ADC通道配置
{
	adc16_channel_config_t ADCCHANNELconfig;//定義ADC通道初始化句柄
	ADCCHANNELconfig.channelNumber = ADC1_CHANNEL;	
	ADCCHANNELconfig.enableInterruptOnConversionCompleted = false;//使能轉換完成中斷
	ADC16_SetChannelConfig(ADC0_INSTANCE,ADC1_CHANNEL_GROUP,&ADCCHANNELconfig);//通道配置
	/*if(ADC16_DoAutoCalibration(ADC_INSTANCE)==kStatus_Success)//硬件校準
	{
		PRINTF("HardWere Calibration sucessful!\n");
	}
	else
	{
		PRINTF("HardWere Calibration error!\n");
	}*/
}

void ADC_NVIC_INIT(void)//ADC的中斷配置
{
	__NVIC_SetPriority(ADC0_IRQn,0);//設置中斷優先級
	__NVIC_EnableIRQ(ADC0_IRQn);//使能中斷
}

void ADC_INIT(void)//ADC初始化
{
	ADC_PORT_INIT();
	ADC_CONFIG();
	ADC_CHANNEL_CONFIG();
	//ADC_NVIC_INIT();
}


/*void ADC0_IRQHandler(void)//中斷服務函數
{
	if(ADC16_GetStatusFlags(ADC_INSTANCE))
	{			
		Valu = ADC16_GetChannelConversionValue(ADC_INSTANCE,ADC_CHANNEL_GROUP);//獲取ADC的值
		PRINTF(" Valu = %d",Valu);	
		Valu_vo = ((float)Valu)*(float)3.3/(float)4096;
		PRINTF("		Volote = %f\n",Valu_vo);
		ADC16_ClearStatusFlags(ADC_INSTANCE,kADC16_ChannelMuxA);
	}
}*/

初始化完成後,若沒開中斷,可以在main函數裏打印相關採集信息

if(ADC16_GetStatusFlags(ADC0_INSTANCE))
{			
	Valu = ADC16_GetChannelConversionValue(ADC0_INSTANCE,ADC1_CHANNEL_GROUP);//獲取ADC的值
	PRINTF(" Valu = %d\n",Valu);	//打印
}

學習心得:

1、K66的ADC可以採用軟件流和硬件流,但在測試的時候硬件流測不出數據,所以就只用了軟件流。
2、ADC可以使用中斷採集,也可以不用中斷,開中斷只需要打開轉換完成中斷就可以了,而不用中斷的話就要在main函數裏寫採集打印。

發佈了11 篇原創文章 · 獲贊 12 · 訪問量 2203
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章