搜索
bottom↓
回复: 9

STM8L有没有什么稳定值的ADC参考源

[复制链接]

出0入0汤圆

发表于 2012-1-10 11:58:21 | 显示全部楼层 |阅读模式
硬件部分使用STM8L152的,使用3.3V的纽扣电池直接给MCU供电,然后MCU采集纽扣电池的电压。
碰到的问题是,我使用MCU的内部VCC作为参考源,而参考源又是变化的(即纽扣电池的电压),所以软件上要是以3.3为参考源去算电压值是有问题的。
想请教一下,这种情况应该怎么处理?或是STM8L有没有什么稳定值的参考源。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2012-1-10 12:07:07 | 显示全部楼层
stm8L有1.224V的内部参考电压,精度大约2%,不过测电池电压足够了

出0入0汤圆

 楼主| 发表于 2012-1-10 12:20:03 | 显示全部楼层
回复【1楼】physis  
-----------------------------------------------------------------------

谢谢你朋友,给了我启发,我在看看参考源这,如果如你所说肯定没问题

出0入0汤圆

 楼主| 发表于 2012-1-10 16:42:28 | 显示全部楼层
回复【1楼】physis  
-----------------------------------------------------------------------

朋友你要是用过这个功能,咱们就再交流一下,我碰到点问题

出0入0汤圆

发表于 2012-5-4 13:36:51 | 显示全部楼层
能不能检测两路AD呀??楼上的高手共同解决一下

出0入0汤圆

发表于 2014-1-15 11:37:46 来自手机 | 显示全部楼层
wxlcj 发表于 2012-5-4 13:36
能不能检测两路AD呀??楼上的高手共同解决一下

使用外部基准

出0入0汤圆

发表于 2014-1-15 12:15:27 来自手机 | 显示全部楼层
加个431。测量431的电压,然后再变换。

出0入0汤圆

发表于 2014-12-12 15:35:11 | 显示全部楼层
楼主的问题解决了吗?

出0入0汤圆

发表于 2021-2-25 11:31:40 | 显示全部楼层
都没人回了。。。
我也遇到问题了 测量总是偏大,但是很稳定。。

出0入0汤圆

发表于 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电阻分压的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表