STM8L051使用内部参考电压计算VDD电压误差问题

2019-07-14 19:00发布

本帖最后由 uchiha_itachi 于 2018-1-30 09:06 编辑

请教下各位大神
使用的芯片:STM8L051F3
使用内部参考电压1.225v来计算VDD的电压。
网上找的计算公式:VDD=1.225*4096/Nadc
我的输入电压是3.3V,也就是VDD电压3.3v


我的问题:
1.为什么每次读取到的Nadc值不一样?
2.为什么会有误差?我的误差大概在0.1V左右。
   读十次,取平均值,有时候在3.2V左右。


我的ADC配置代码如下:
void sys_ADC_Init(void)
{
CLK_PCKENR2_PCKEN20 = 1;    // Enable ADC1 clock
ADC1_TRIGR1_VREFINTON = 1;    // open internal reference voltage

ADC1_CR1_ADON = 1;          // wakes up the ADC from Power down mode.
ADC1_CR1_RES = 0;      // Configurable resolution(00: 12-bit resolution)
ADC1_CR1_CONT = 0;      // Continuous conversion(0:Single conversion mode)
ADC1_CR2_PRESC = 1;      //  Clock prescaler
ADC1_SQR1_DMAOFF = 1;     // disable DMA

ADC1_CR3_SMTP2 = 0x06;

ADC1_SQR1_CHSEL_S28 = 1;

}

void ADC_Data_Read(uint16_t *AD_Value)
{
uint16_t tmpreg_H = 0;
uint16_t tmpreg_L = 0;
  
ADC1_CR1_START = 1;      //  Conversion start

while( ADC1_SR_EOC == 0 );     //  Wait for Conversion complete(0: Conversion not complete)
ADC1_SR_EOC = 0;      // clear the interrupt flag
tmpreg_H = (uint16_t)((ADC1_DRH_CONV_DATA11 << 3)| (ADC1_DRH_CONV_DATA10 << 2)
    | (ADC1_DRH_CONV_DATA9 << 1) | (ADC1_DRH_CONV_DATA8));

tmpreg_L = (uint16_t)((ADC1_DRL_CONV_DATA7 << 7) | (ADC1_DRL_CONV_DATA6 << 6)
    | (ADC1_DRL_CONV_DATA5 << 5) | (ADC1_DRL_CONV_DATA4 << 4)
    | (ADC1_DRL_CONV_DATA3 << 3) | (ADC1_DRL_CONV_DATA2 << 2)
    | (ADC1_DRL_CONV_DATA1 << 1) | (ADC1_DRL_CONV_DATA0));

*AD_Value = (uint16_t)((uint16_t)((uint16_t)tmpreg_H << 8) | tmpreg_L);
  
}

void Get_battery_power_value(void)
{
uint16_t AD_value_tmp = 0;
uint16_t AD_value_sum = 0;
uint8_t  sample_count;

for(sample_count = 0; sample_count < 10; sample_count++){
  ADC_Data_Read(&AD_value_tmp);
  AD_value_sum += AD_value_tmp;
  delay_ms(100);
}
AD_value_sum = AD_value_sum/10;
d_battery_power = (uint16_t)((5018000/AD_value_sum));  // 5018 = 1.225*4096
}
以上是什么问题?有什么办法解决吗?
先谢过了。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
人中狼
2019-07-15 15:38
你的公式还是错误的,上图里的公式是两个,一个是Vref/4096,一个是VDD/4096,是或者的关系,也就是ADC的测量上限电压如果是VDD,那就是用VDD/4096,如果上限电压是Vref,那就是用Vref/4096,在你的设计里用的是Vref=1.225V,所以公式是:测量电压=(1.225(Vref)/4096)*Nadc,在有的ADC芯片里是没有Vref的,所以Vref应该是和VDD是一个概念,只是有些芯片会提供Vref引脚,毕竟外部可以给Vref引脚提供更稳定的电压来保证ADC的稳定

一周热门 更多>