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函数里写采集打印。