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条回答
776830702
1楼-- · 2019-07-14 23:21
应该是 vdd = 1.225*Nadc/4096;还有ADC采集的电压不能高于参考电压。
uchiha_itachi
2楼-- · 2019-07-15 02:22
776830702 发表于 2018-1-30 12:40
应该是 vdd = 1.225*Nadc/4096;还有ADC采集的电压不能高于参考电压。

谢谢你的解答,但是我觉得你的公式不对,读到的Nadc = 1568,那么套到你的公式算VDD = 1.225*1568/4096 =0.4689,ADC采集的电压不能高于参考电压?请问这个依据在哪里?谢谢!
人中狼
3楼-- · 2019-07-15 03:48
参考电压可以查芯片手册,或者查专用的ADC芯片手册里对参考电压的定义。去除参考电压的定义来说,ADC是由转换上限电压的,超过这个电压的转换结果都是最大值,对ADC的转换计算来说,通过ADC读取到的数值可以理解为这个数值在满量程里所占的份额,而满量程数值就是对转换上限电压的所能等分的份数,比如如果满量程是4096,就是对上限电压等分4096份,所以计算公式是VDD = Vref * (Nadc / 4096),加个括号或许容易理解一些
uchiha_itachi
4楼-- · 2019-07-15 05:46
人中狼 发表于 2018-1-31 09:36
参考电压可以查芯片手册,或者查专用的ADC芯片手册里对参考电压的定义。去除参考电压的定义来说,ADC是由转换上限电压的,超过这个电压的转换结果都是最大值,对ADC的转换计算来说,通过ADC读取到的数值可以理解为这个数值在满量程里所占的份额,而满量程数值就是对转换上限电压的所能等分的份数,比如如果满量程是4096,就 ...

谢谢解答。可是我测量VDD的电压确实是3.3V,那请问下有没什么办法在不是使用外部参考电压情况下,计算VDD的电压?(现在想计算电池剩余多少电量)
人中狼
5楼-- · 2019-07-15 05:53
 精彩回答 2  元偷偷看……
uchiha_itachi
6楼-- · 2019-07-15 08:08
人中狼 发表于 2018-1-31 11:57
如果要测量的电压高于ADC的最大测量电压,可以用电阻分压的方式,把待测量电压分压降至ADC的测量范围内,最后通过ADC计算到的电压值再乘以电阻的分压比例,就可以得到实际电压

谢谢回复。如图所示的分压,那这样就不是计算VDD的电压了,请问下这样怎么通过内部参考电压计算ADC采集电压?它的公式是什么?
捕获3.JPG

一周热门 更多>