OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1357|回复: 5

STM32F407 ADC1 CH18 VBAT电压检测相关问题,求解答

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2022-5-20
在线时间
1 小时
发表于 2023-10-19 14:55:38 | 显示全部楼层 |阅读模式
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;
}





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-10-20 10:09:28 | 显示全部楼层
你的VDDA是不是有波动,用ADC的时候最好把内部基准也采集了加入计算
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2023-10-20 11:05:21 | 显示全部楼层

差别这么大,感觉不是基准造成的问题。
但肯定不难。
ADC 是基本的操作,例程里都有。

回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-1-11
在线时间
30 小时
发表于 2023-11-30 11:02:26 | 显示全部楼层
xuande 发表于 2023-10-20 11:05
差别这么大,感觉不是基准造成的问题。
但肯定不难。
ADC 是基本的操作,例程里都有。

这个问题解决了吗? 我也遇到了  ADC采集到的VBAT 只有实际的一半
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2023-11-30 11:15:30 | 显示全部楼层
ygll 发表于 2023-11-30 11:02
这个问题解决了吗? 我也遇到了  ADC采集到的VBAT 只有实际的一半

你先测下ADC测量引脚的电压
学无止境
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-1-11
在线时间
30 小时
发表于 2023-11-30 11:26:23 | 显示全部楼层
jermy_z 发表于 2023-11-30 11:15
你先测下ADC测量引脚的电压

VBAT电压3V
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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