OpenEdv-开源电子网

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

关于ADC1内部Vrefint的问题,麻烦知道的同学告知一下,感谢

[复制链接]

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
发表于 2018-6-7 15:54:29 | 显示全部楼层 |阅读模式
20金钱
1->    请问Vrefint是测量的什么值?         百度查到的资料说是内部电压用作AD转换时参考电压的值,但是库函数里面的描述感觉像是测量电池的电压值,板子上备份电池的电压能测量吗?
360截图166502185210692.png
void ADC1_Init(void)
{
        ADC_InitTypeDef                        ADC_InitStruct;
        ADC_CommonInitTypeDef        ADC_CommonInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
       
        ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        //ADC_InitStruct.ADC_ExternalTrigConv =
        ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
        ADC_InitStruct.ADC_NbrOfConversion = 2;
        ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStruct.ADC_ScanConvMode = DISABLE;
        ADC_Init(ADC1,&ADC_InitStruct);
       
        ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
        ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
        ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4;
        ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
        ADC_CommonInit(&ADC_CommonInitStruct);
        ADC_Cmd(ADC1,ENABLE);
        ADC_TempSensorVrefintCmd(ENABLE);
        ADC_VBATCmd(ENABLE);
}

u16 ADC1_GetVal(unsigned char chnl)
{
        ADC_RegularChannelConfig(ADC1,chnl,1,ADC_SampleTime_480Cycles);
        ADC_SoftwareStartConv(ADC1);
        while(ADC_GetSoftwareStartConvStatus(ADC1));
        return ADC_GetConversionValue(ADC1);
}

float Get_CPU_Temperature(u8 ConvNumber)
{
        u8 i;
        u32 val = 0;
        float CPU_Val;
       
        for(i=0;i<ConvNumber;i++)
        {
                val += ADC1_GetVal(CPU_Temperature);
        }
        CPU_Val = val / ConvNumber;
        CPU_Val = CPU_Val*3.3/4096;
        CPU_Val = (CPU_Val-0.76)/0.0025 + 25;
        return CPU_Val;
}

float Get_VBAT_Voltage(u8 ConvNumber)
{
        u8 i;
        u32 val = 0;
        float VBAT_Val;
       
        for(i=0;i<ConvNumber;i++)
        {
                val += ADC1_GetVal(VBAT);
        }
        VBAT_Val = val / ConvNumber;
        VBAT_Val = VBAT_Val*3.3/4096;
        VBAT_Val *= 2;
        return VBAT_Val;
}

#define CPU_Temperature    ADC_Channel_16
#define VBAT                           ADC_Channel_17


2->    为什么我代码采取分时复用的方式测量 “内部温度” 和 “VBAT” 的值不行,只测量一个就是正确的?


           只测量CPU温度如下:
         for(;;)
        {
                sprintf(LCD_Buffer,"CPU_Temperature:%7.2f C",Get_CPU_Temperature(5));
                LCD_ShowString(80,110,500,24,24,LCD_Buffer);
//                sprintf(LCD_Buffer,"VBAT_Voltage   :%7.3f V",Get_VBAT_Voltage(5));
//                LCD_ShowString(80,140,500,24,24,LCD_Buffer);
               
                LED0=!LED0;
                delay_ms(1000);
        }

360截图1648031484108121.png
       只测量电压如下:
         for(;;)
        {
//                sprintf(LCD_Buffer,"CPU_Temperature:%7.2f C",Get_CPU_Temperature(5));
//                LCD_ShowString(80,110,500,24,24,LCD_Buffer);
                sprintf(LCD_Buffer,"VBAT_Voltage   :%7.3f V",Get_VBAT_Voltage(5));
                LCD_ShowString(80,140,500,24,24,LCD_Buffer);
               
                LED0=!LED0;
                delay_ms(1000);
        }
       360截图1667102789113106.png
       温度和电压都测量如下:
          for(;;)
        {
                sprintf(LCD_Buffer,"CPU_Temperature:%7.2f C",Get_CPU_Temperature(5));
                LCD_ShowString(80,110,500,24,24,LCD_Buffer);
                sprintf(LCD_Buffer,"VBAT_Voltage   :%7.3f V",Get_VBAT_Voltage(5));
                LCD_ShowString(80,140,500,24,24,LCD_Buffer);
               
                LED0=!LED0;
                delay_ms(1000);
        }

360截图166908109312096.png
Vrefint测出的值在 2.428 V ~ 2.446 V之间

最佳答案

查看完整内容[请看2#楼]

看数据手册就知道了。 就是内部参考电压,一般为1.21V。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-6-7 15:54:30 | 显示全部楼层
看数据手册就知道了。
就是内部参考电压,一般为1.21V。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2018-6-7 15:55:52 | 显示全部楼层
@正点原子 求助原子哥
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2018-6-7 18:15:21 | 显示全部楼层
不要沉
回复

使用道具 举报

20

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-7-19
在线时间
31 小时
 楼主| 发表于 2018-6-8 18:58:03 | 显示全部楼层
正点原子 发表于 2018-6-7 15:54
看数据手册就知道了。
就是内部参考电压,一般为1.21V。

谢谢原子哥,为什么同时检测就会出错呢
回复

使用道具 举报

40

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-5-19
在线时间
192 小时
发表于 2020-2-25 13:33:19 | 显示全部楼层
同时设置温度传感器和VBAT时,只进行VBAT转换
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-7 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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