新手入门 
 
	- 积分
 - 4
 
        - 金钱
 - 4 
 
       - 注册时间
 - 2022-5-20
 
      - 在线时间
 - 1 小时
 
 
 
 | 
 
1金钱 
 本帖最后由 wzh242473 于 2023-10-19 14:56 编辑  
 
实验时用万用表测量VBAT端电压为2.8V左右,程序配置ADC1精度为12位但是获取的ADC转换值为1700, 
根据公式V = adc_dr/4096,换算成电压值位1.4V左右,只有实际电压的一半。 
有大佬知道为啥吗,求解答。 
原码如下: 
 
void ADC1_VBAT_Init(void) 
 { 
  ADC_InitTypeDef       ADC_InitStructure; 
  ADC_CommonInitTypeDef ADC_CommonInitStructure; 
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); 
 
  //复位ADC1 
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE); 
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE); 
 
  /* ADC Common Init **********************************************************/ 
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; 
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; 
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; 
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; 
  ADC_CommonInit(&ADC_CommonInitStructure); 
 
  /* ADC1 Init ****************************************************************/ 
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; 
  ADC_InitStructure.ADC_ScanConvMode = DISABLE; 
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; 
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
  ADC_InitStructure.ADC_NbrOfConversion = 1; 
  ADC_Init(ADC1, &ADC_InitStructure); 
 
  /* Enable VBAT channel */ 
  ADC_VBATCmd(ENABLE);  
 
  /* Enable ADC1 **************************************************************/ 
  ADC_Cmd(ADC1, ENABLE); 
 } 
 
u16 Get_Adc1_VBAT(void)    
{ 
        //设置指定ADC的规则组通道,一个序列,采样时间 
        ADC_RegularChannelConfig(ADC1, ADC_Channel_Vbat, 1, ADC_SampleTime_480Cycles );        //ADC1,ADC通道,480个周期,提高采样时间可以提高精确度                             
 
        ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能         
          
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 
 
        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果 
} 
 
u16 Get_Adc1_VBAT_Average(u8 times) 
{ 
        u32 temp_val=0; 
        u8 t; 
        for(t=0;t<times;t++) 
        { 
                temp_val+=Get_Adc1_VBAT(); 
                delay_ms(5); 
        } 
        return temp_val/times; 
}  
 
 
 
 
 
 |   
 
 
 
 
 
 |