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

STM32L083读取内部温度,AD不校准可以,校准后为负,求助!

[复制链接]
ldj2000 提问时间:2019-11-14 17:31 /
STM32L083读取内部温度,AD不校准可以读出现在温度18.3度,校准后温度为负了,-13.42.有没有朋友遇到过这个问题,求助!
AD校准后,测试到的VREF值非常准确3.298 V,其他输入电压也很准,就是温度不正确了。
校准程序如下:
  if (HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED) !=  HAL_OK)
  {
    printf("\r\nAD Calibration fail\r\n");        
  }

收藏 2 评论4 发布时间:2019-11-14 17:31

举报

4个回答
Paderboy 回答时间:2019-11-14 21:39:08

复制代码
Temperature configuration code example
/* (1) Select HSI16 by writing 00 in CKMODE (reset value) */
/* (2) Select continuous mode */
/* (3) Select CHSEL18 for temperature sensor */
/* (4) Select a sampling mode of 111 i.e. 239.5 ADC clk to be greater
than 2.2us */
/* (5) Wake-up the Temperature sensor (only for Temp sensor and
VRefInt) */
//ADC1->CFGR2 &= ~ADC_CFGR2_CKMODE; /* (1) */
ADC1->CFGR1 |=ADC_CFGR1_CONT; /* (2) */
ADC1->CHSELR =ADC_CHSELR_CHSEL18; /* (3) */
ADC1->SMPR |=ADC_SMPR_SMP; /* (4) */
ADC->CCR |=ADC_CCR_TSEN; /* (5) */

  1. #define TEMP130_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007E))
  2. #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FF8007A))
  3. #define VDD_CALIB ((uint16_t) (300))
  4. #define VDD_APPLI ((uint16_t) (330))
  5. int32_t ComputeTemperature(uint32_t measure)
  6. {
  7. int32_t temperature;
  8. temperature = ((measure *VDD_APPLI /VDD_CALIB)- (int32_t) *TEMP30_CAL_ADDR );
  9. temperature =temperature * (int32_t)(130 - 30);
  10. temperature =temperature / (int32_t)(*TEMP130_CAL_ADDR-*TEMP30_CAL_ADDR);
  11. temperature =temperature + 30;
  12. return(temperature);
  13. }
复制代码



aiherong 回答时间:2019-11-15 04:06:38
不知你校验步骤是否正确,好像先开启AD转换器、重置校准寄存器(软件写1)并一直等其硬件清零,再才是校验ADC,同样要等到其硬件清零此位才算校验完成。在此之前设置RCC有一项专门设置AD的分频系数,还有要用右对齐,禁止触发检测,独立模式非扫描,不要开启连续转换;
读温度时正负号是依据getadcvalue值大于还是小于零决定,关键是值的计算准确
ldj2000 回答时间:2019-11-15 15:00:25
Paderboy 发表于 2019-11-14 21:39
Temperature configuration code example
/* (1) Select HSI16 by writing 00 in CKMODE (reset value) */ ...

非常感谢!在static void MX_ADC_Init(void)初始化函数最后增加如下两行就可以了:
                ADC1->SMPR |=ADC_SMPR_SMP;
                ADC->CCR |=ADC_CCR_TSEN;
ldj2000 回答时间:2019-11-15 15:02:24
非常感谢,在AD的初始化函数里面增加:
                ADC1->SMPR |=ADC_SMPR_SMP;
                ADC->CCR |=ADC_CCR_TSEN;
就可以了,我试了增加第一个ADC1->SMPR |=ADC_SMPR_SMP;其实就可以了。意思是我的温度采样速度太快了吗?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版