/*IO初始化*/
void ADC_GPIO_Config( void ) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init( GPIOC, &GPIO_InitStructure );
GPIO_Init( GPIOD, &GPIO_InitStructure );
GPIO_PinAFConfig( GPIOC, GPIO_PinSource4, GPIO_AF_7 );
GPIO_PinAFConfig( GPIOD, GPIO_PinSource2, GPIO_AF_7 );
}
/*ADC配置*/
void ADC_Config( void ) {
ADC_GPIO_Config();
ADC_DeInit( ADC1 );
ADC_StructInit( &ADC_InitStructure );
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init( ADC1, &ADC_InitStructure );
PWR_SetLDO_RefVolToADC( ADC_VREF_LDO );
//配置ADC采集通道
ADC_ChannelConfig( ADC1, ADC_Channel[0], ADC_SampleTime_239_5Cycles );
//启用ADC中断
ADC_ITConfig( ADC1, ADC_IT_EOC, ENABLE );
//使能ADC ADC_Cmd( ADC1, ENABLE );
//配置NVIC
NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
while (!ADC_GetFlagStatus( ADC1, ADC_FLAG_ADRDY ));
ADC_StartOfConversion( ADC1 );
}
/*ADC中断处理函数*/
void ADC1_IRQHandler( void ) {
static uint8_t a = 0;
static Filter_Struct adc_voltage = { 0, 2300, 0 };
static Filter_Struct adc_current3 = { 0, 25000, 0 };
if (ADC_GetITStatus( ADC1, ADC_FLAG_EOC )) {
ADC_ClearITPendingBit( ADC1, ADC_IT_EOC );
ADC_data[a] = ADC_GetConversionValue( ADC1 );
if (a == 0) {
adc_voltage.in_data = ((int32_t) ADC_data[a] * BUS_Voltage_constant) >> 15;
firstOrderFilter( &adc_voltage );
BUS_Voltage = adc_voltage.out_data;
} else if (a == 1) {
adc_current3.in_data = ADC_data[a];
firstOrderFilter( &adc_current3 );
led3_current = (adc_current3.out_data * BLDC_current_constant) >> 15;
led3_adc_con();
}
a++;
if (a > 1)
a = 0;
ADC1->CHSELR = 0;
ADC_ChannelConfig( ADC1, ADC_Channel[a], ADC_SampleTime_239_5Cycles );
ADC_Cmd( ADC1, ENABLE );
while (!ADC_GetFlagStatus( ADC1, ADC_FLAG_ADRDY ));
ADC_StartOfConversion( ADC1 );
}
}
|