完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 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 } 以上是什么问题?有什么办法解决吗? 先谢过了。
|
|
相关推荐
11个回答
|
|
你需要查查ADC方面的资料,确定ADC转换上限电压的定义,在我的概念里,你的这个芯片的VDD,外部VREF,内部VREF都可以是ADC转换上限电压,只是在于你用哪个,只能用一个,但是都是各自独立的,没有转换关系。所以选用内部VREF,那就不存在1.225/VDD = Nadc/4096。这个比例关系。
ADC转换的计算公式只有一个,就是被测量电压 = (测量上限电压/ADC转换最大量程)* 被测量电压的ADC转换数值
最佳答案
评分
|
||
|
||
应该是 vdd = 1.225*Nadc/4096;还有ADC采集的电压不能高于参考电压。
|
|
|
|
谢谢你的解答,但是我觉得你的公式不对,读到的Nadc = 1568,那么套到你的公式算VDD = 1.225*1568/4096 =0.4689,ADC采集的电压不能高于参考电压?请问这个依据在哪里?谢谢! |
|
|
|
参考电压可以查芯片手册,或者查专用的ADC芯片手册里对参考电压的定义。去除参考电压的定义来说,ADC是由转换上限电压的,超过这个电压的转换结果都是最大值,对ADC的转换计算来说,通过ADC读取到的数值可以理解为这个数值在满量程里所占的份额,而满量程数值就是对转换上限电压的所能等分的份数,比如如果满量程是4096,就是对上限电压等分4096份,所以计算公式是VDD = Vref * (Nadc / 4096),加个括号或许容易理解一些
|
|
|
|
人中狼 发表于 2018-1-31 09:36 谢谢解答。可是我测量VDD的电压确实是3.3V,那请问下有没什么办法在不是使用外部参考电压情况下,计算VDD的电压?(现在想计算电池剩余多少电量) |
|
|
|
如果要测量的电压高于ADC的最大测量电压,可以用电阻分压的方式,把待测量电压分压降至ADC的测量范围内,最后通过ADC计算到的电压值再乘以电阻的分压比例,就可以得到实际电压
|
|
|
|
人中狼 发表于 2018-1-31 11:57 谢谢回复。如图所示的分压,那这样就不是计算VDD的电压了,请问下这样怎么通过内部参考电压计算ADC采集电压?它的公式是什么?
|
|
|
|
重新查看了手册,网上的公式是正确的。请看下图,VDD电压总共分成4096份,一份电压为:VDD/4096;参考电压占了Nadc份,那么1.225v = (VDD/4096)*Nadc.
|
|
|
|
你的公式还是错误的,上图里的公式是两个,一个是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的稳定
|
|
|
|
人中狼 发表于 2018-2-5 11:16 我的设计里是选择ADC_IN VREFINT作为ADC channel,1.225V内部输入电压是固定的,VDD就相当于是满量程4096,所以根据比例:1.225/VDD = Nadc/4096。(所以这里Nadc会根据VDD的变化而变化,成比例关系)
|
|
|
|
人中狼 发表于 2018-2-5 14:01 嗯,学习了。非常感谢! |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2201 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2027 浏览 3 评论
4633 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2171 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2705 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 07:10 , Processed in 0.837792 second(s), Total 69, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号