关于内部传感器的问题

tddwp   2008-12-1 15:36 楼主
从datasheet上可以看到Vrefint的电压在1.2V左右,可是我现在采样到的数据是2080左右,如果按照这个推算,Vref1.2*4096/2080 =2.35V,不知道我的这个推算对不?
一个关键问题,使用其内部传感器测量CPU温度,公式中的Vdd,为什么会是Vdd,而不是Vref,为什么datasheet上没有其回路图,4.3mV/℃按照这个标准0~100℃电压变化只有0.43V,如果按照STM的公式进行计算,带入不同的值,计算到的数据误差比较大,我想这个公式是不是可以简化,就像datasheet上讲串口波特率的事情一样,说什么12整数,4位小数,算了半天还要除以16,其实寄存器的值就是系统时钟除以波特率,费劲!!!
我想这个测量值肯定跟Vdd、V25没有什么关系

回复评论 (12)

读取STM32内部温度传感器

首先,关于VREFINT的推算是正确的。

关于内部温度传感器的计算公式,请看下图是STM32技术参考手册中的有关部分,公式中没有你说的Vdd。

温度转换是一条直线,Avg_Slope给出了这条线的斜率,V25给出了这条线的一个点,这样才能唯一确定这条线。如果没有V25这个点,光有斜率时不足以定义一条直线的。
点赞  2008-12-1 22:26

看看这个链接,源码已经提供了,呵呵,

STM32内置的温度传感器应用 2008-11-30 13:02:15 
点赞  2008-12-1 22:53

那个温度,只可作参考。

                                 不要用来做测量什么的,做个参考还可以的。
点赞  2008-12-1 23:02

仅仅注意公式正确是不够的,整数运算,要特别注意有效数

void ADC_Temperature_Read(void)
{
    
#define Vdd 34600
#define V25 14300
#define Avg_Slope 43
#define Vdd_convert_value 0xFFF    

    vu32 ADC_ConvertedValue;
    vu32 Vsense;
    vs32 Vtemperature;

    ADC_ConvertedValue = ADC1->DR & Vdd_convert_value;
         Vsense = ADC_ConvertedValue * Vdd / Vdd_convert_value; 
    Vtemperature = V25-Vsense;    
         D_Temperature = (Vtemperature*100/Avg_Slope) + 2500; 
}
点赞  2008-12-1 23:18

有问题

                                 有问题,Vref1.2*4096/2080 =2.35V是不对的。Vref1.2*2080/4096差不多
点赞  2008-12-2 09:43

哈哈,我太笨了,6楼才是正确的

                                  
点赞  2008-12-2 13:27

版主,看看5楼的回复

#define Vdd 34600,这个定义可以推算Vsense,3.3V电压是有很大偏差的,
如果按照这个电压来计算的话,误差势必会超出datasheet上的数据范围的,
我想测量温度时,如果将Vref传入温度传感器,如果Vref变化的话,ADC16采样到数据将是不变的,可是我不知道是否是将温度传感器和一个电阻串联后施加一个Vref电压,要是这样,就与参考电压无关了,但根据公式,好像问题跟Vref有关联
点赞  2008-12-2 16:59

#define Vdd 34600 因该是330000

                                 但是我实测我的3.3V电压不准,偏高,所以我用的是实测电压值。否则测量结果偏差较大。
点赞  2008-12-3 08:22

xxx

                                  
点赞  2008-12-5 17:24

Vref

                                 我觉得可以先读Vref,再算温度需要的电压,然后再带入公式
点赞  2008-12-7 21:51

请大家各抒己见

                                 我说的Vref不是内部的Vref,而是参考电压引脚的Vref,也就是64脚或更小芯片的Vdda,也就是通常说的3.3V电压,如果这个变化,那么STM32提供的公式就会误差很大,因为该芯片的AD工作电压为2.4V~3.6V,这工作电压我们可以要求电压电压不一定就是某个特定的值,肯定对于相同产品的不同设备,这个电压肯定各不相同,一个3.2V,3.3V,有的甚至3.4V,那么这个温度偏差是很大的,我们不可能对每个设备定义一次#define Vdd 34600,这样就比较麻烦了
点赞  2008-12-8 13:41
引用: haimao 发表于 2008-12-1 23:18 void ADC_Temperature_Read(void){    #define Vdd 34600#define ...

vu16 GetTemp(vu16 advalue)
{
     vu32 Vtemp_sensor;
     vu16 Current_Temp;
     
//    ADC转换结束以后,读取ADC_DR寄存器中的结果,转换温度值计算公式如下:
//          V25 - VSENSE
//  T(℃) = ------------  + 25
//           Avg_Slope
//   V25:  温度传感器在25℃时 的输出电压,典型值1.43 V。
//  VSENSE:温度传感器的当前输出电压,与ADC_DR 寄存器中的结果ADC_ConvertedValue之间的转换关系为: 
//            ADC_ConvertedValue * Vdd
//  VSENSE = --------------------------
//            Vdd_convert_value(0xFFF)
//  Avg_Slope:温度传感器输出电压和温度的关联参数,典型值4.3 mV/℃。

     Vtemp_sensor = ((vu32)advalue )* 3300>>12 ;   //工作电压3.3伏.
     Current_Temp = 25 +((vu16)Vtemp_sensor - 1430)*10/43; 
     return Current_Temp;
}  

大佬这个是什么问题啊,这个是我找的一个,这个我的芯片算出来就是52,你写的我不太懂 Vdd_convert_value什么意思,还有这一句ADC_ConvertedValue = ADC1->DR & Vdd_convert_value;这个DR是什么意思?

点赞  2021-2-13 07:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复