#include "adc.h"
#include "delay.h"
#include "usart.h"
#include "main.h"
u16 ADC1_Value[NUM_CHANNEL]={0}; //save ADC value from ADC to DMA
float AdcVal[NUM_CHANNEL] = {0}; //save sample relevant voltage value.
SAMPVAL SampPara;
/************************************************************
* Function Name :Adc_Config
* Description :adc initialization
* Input :none
* Return :none
*************************************************************/
/*adc init*/
void Adc_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = NUM_CHANNEL;
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_RegularChannelConfig(ADC1, ADC1_CHANNEL, 1, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC2_CHANNEL, 2, ADC_SampleTime_239Cycles5 );
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
/**********************************
* Function Name :Adc_Config
* Description :get ADC value
* Input :none
* Return :none
***********************************/
u16 Get_Adc(u8 rank)
{
return ADC1_Value[rank-1];
}
/*************************************************************
* Function Name :Get_Adc1_Average
* Description :get ADC average value with smoothing.
* Input :sample timer
* Return :ADC average value
**************************************************************/
float Get_Adc1_Average(u16 rank, u8 times)
{
float temp_vol=0;
u16 temp_adc = 0;
u8 t;
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA_Cmd(DMA1_Channel1, ENABLE);
for(t=0;t<times;t++)
{
temp_adc += Get_Adc(rank);
}
temp_adc = temp_adc/times;
temp_vol = (float)temp_adc*VOL_REF*PWR_RATE_DIV/ADC_MAX;
if (temp_vol >= MAX_24ADC_ACTUAL)
{
temp_vol = MAX_24ADC_THEORE;
}
else
{
temp_vol -= CALIB_FACTOR_PWR1;
if (temp_vol <= 0)
{
temp_vol = 0;
}
}
return temp_vol;
}
/***********************************************
* Function Name :Set_Samp_Para
* Description :get sample with smoothing.
* Input :none
* Return :none
************************************************/
void Set_Samp_Para(void)
{
AdcVal[0]=Get_Adc1_Average(1, TIMER_FILTER);
AdcVal[1]=Get_Adc1_Average(2, TIMER_FILTER);
SampPara.V_DA1 = AdcVal[0];
}
/**********************************************************************
* Function Name :Get_Samp_Para
* Description :offer adc relevant voltage value to other module.
* Input :none
* Return :adc sample voltage value
***********************************************************************/
SAMPVAL Get_Samp_Para(void)
{
Set_Samp_Para();
//printf("adc=%.2f",SampPara.V_DA1);
return SampPara;
}
评论0