你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407内部温度偏差太大

[复制链接]
power568 提问时间:2016-3-24 16:58 /
各位有没有使用过F407内部的温度传感器,今天测试了下,室温在15度左右,采集内码值为1220,换算为温度为:
T = Vsense – V25/AVG_Slope +25 = 114.16,
V25 = 0.76V
AVG_Slope = 2.5mv/
这太离谱了吧,不知道是哪里出了问题;
按照官方给的公式,要是温度在15~30摄氏度之间,转换内码值就需要在910~960之间才可以
求高手指点


代码如下:

static void        AdcPinComInit(void)
{
        GPIO_InitTypeDef                                GPIO_InitStructure;
        ADC_CommonInitTypeDef                ADC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        ADC_InitStructure.ADC_Mode = ADC_DualMode_RegSimult;
        ADC_InitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
        ADC_InitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
        ADC_InitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
        ADC_CommonInit(&ADC_InitStructure);
}

static void        AdcDmaInit(void)
{
        DMA_InitTypeDef                DMA_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
       
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)AdcSampDmaBuf;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CCR_ADDRESS;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = ADC_DMA_BUF_LEN;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        ////
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;          ////        
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

  DMA_Cmd(DMA2_Stream0, ENABLE);
}

static void Adc1ChxConfig(void)
{
  ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  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 = 3;
  ADC_Init(ADC1, &ADC_InitStructure);

  //// ADC1 regular channels configuration
  ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_15Cycles);
}

static void Adc2ChxConfig(void)
{
  ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  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 = 3;
  ADC_Init(ADC2, &ADC_InitStructure);

  //// ADC2 regular channels configuration
  ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 2, ADC_SampleTime_15Cycles);
  ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 3, ADC_SampleTime_15Cycles);
}

收藏 2 评论16 发布时间:2016-3-24 16:58

举报

16个回答
power568 回答时间:2016-3-24 16:59:52
自己先顶起来,
参考了网上测教程,转换结果一样,另:硬件Vdda = 3.3V , Vref = 2V...
xmshao 回答时间:2016-3-25 14:48:58
power568 发表于 2016-3-24 16:59
自己先顶起来,
参考了网上测教程,转换结果一样,另:硬件Vdda = 3.3V , Vref = 2V... ...

STM32F407内部温度传感器测量范围 –40 to 125 °C  精度: ±1.5 °C
你的参考电压如果选择2V,那你只能使用ADC的慢速模式,
如果全速模式,VREF要2.4V以上。
power568 回答时间:2016-3-27 23:36:21
xmshao 发表于 2016-3-25 14:48
STM32F407内部温度传感器测量范围 –40 to 125 °C  精度: ±1.5 °C
你的参考电压如果选择2V,那你只能 ...

你说的慢速模式和快速模式在那个手册中有?
power568 回答时间:2016-3-25 13:09:19
问题解决了,应该使用Vref = 2.5V,但是抖动幅度还是很大,采集内码值相差100左右,只能滤波了...
紫藤Teng 回答时间:2016-3-26 16:47:15
芯片温度会不会影响
power568 回答时间:2016-3-27 23:36:45
紫藤Teng 发表于 2016-3-26 16:47
芯片温度会不会影响

芯片温度很低的,不会有影响...
huaiqiao 回答时间:2016-3-28 01:20:07
power568 发表于 2016-3-25 13:09
问题解决了,应该使用Vref = 2.5V,但是抖动幅度还是很大,采集内码值相差100左右,只能滤波了... ...

内部温度传感器用的人比较少应该,应该会用外部的。
wolfgang 回答时间:2016-3-28 09:20:46
内部温度是一个电压折算值,主要还是要看你的供电基础电压.....
在额定电压下的一个温度参考值,如果电压不额定,内部温度是不准的。
power568 回答时间:2016-3-28 14:58:44
huaiqiao 发表于 2016-3-28 01:20
内部温度传感器用的人比较少应该,应该会用外部的。

要求不高,只要个大致范围即可...
power568 回答时间:2016-3-28 14:59:31
wolfgang2015 发表于 2016-3-28 09:20
内部温度是一个电压折算值,主要还是要看你的供电基础电压.....
在额定电压下的一个温度参考值,如果电压不 ...

有可能,电压基准是用稳压二极管取得...
huaiqiao 回答时间:2016-3-29 19:27:43
power568 发表于 2016-3-28 14:58
要求不高,只要个大致范围即可...

哦哦 。
wuweijie 回答时间:2016-3-29 21:48:20
还没有用过,一直用了18B20来,哈哈
power568 回答时间:2016-3-30 16:34:11
wuweijie 发表于 2016-3-29 21:48
还没有用过,一直用了18B20来,哈哈

18B20精度比较高...
徐其C 回答时间:2016-3-31 20:14:14
测量室温 还是用外部的比较准吧
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版