|
发表于 2021-2-25 12:31:21
|
显示全部楼层
/*******************************************************************************
* @函数名称 ADC_Config
* @函数说明 ADC初始化
* @输出参数 无
* @返回参数 无
* @设计weimingming
*******************************************************************************/
static void ADC_Config(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
ADC_VrefintCmd(ENABLE); //使能内部参考电压
ADC_Init(ADC1,ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_2);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_24Cycles);
ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_24Cycles);
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
}
static u16 VREF_zishen(void)
{
static u8 iz;
static u16 value1[20],fVdd1,res1=0;
res1=0;
ADC_Cmd(ADC1,DISABLE);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_16Cycles);
ADC_ChannelCmd(ADC1,ADC_Channel_18,DISABLE);//xian guan bi zhiqian tongdaodelay_ms(2);
ADC_ChannelCmd(ADC1,ADC_Channel_Vrefint,ENABLE);//使能内部参考电压通道 delay_ms(2);
ADC_Cmd(ADC1,ENABLE);
delay_ms(1);
ADC_SoftwareStartConv(ADC1);//delay_ms(1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
for(iz=0; iz<20; iz++)
{
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
value1[iz]= ADC_GetConversionValue(ADC1);
fVdd1=50135/value1[iz]*10;
res1=res1+fVdd1;
}
res1=res1/20;
return(res1);
}
static u16 VREF_dianchi(void)
{
static u8 i;
static u16 value2[20],fVdd2,res2=0;
res2=0;
ADC_Cmd(ADC1,DISABLE);
ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_16Cycles);
ADC_ChannelCmd(ADC1,ADC_Channel_Vrefint,DISABLE);//xian guan bi zhiqian tongdao
ADC_ChannelCmd(ADC1,ADC_Channel_18,ENABLE);
ADC_Cmd(ADC1,ENABLE);
delay_ms(2);
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
for(i=0; i<20; i++)
{
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//清除对应标志
value2[i]= ADC_GetConversionValue(ADC1);
fVdd2=6*value2[i]/25;
res2=res2+fVdd2;
}
res2=res2/20;
return(res2);
}
这个程序是我精心调制的,废了几个月研究出来的 很准,给大家参考下。
测试自身VDD 测试电池电压 电池电压我是20K/10K电阻分压的。 |
|