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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版