硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7226|回复: 24
收起左侧

[ADC] STM32H7的ADC温度传感器测量

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
发表于 2018-9-9 02:28:41 | 显示全部楼层 |阅读模式
代码公式:
float Vtemp_sensor;
uint16_t TS_CAL1;
uint16_t TS_CAL2;

uint32_t   uwConvertedValue;

TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);
TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);
uwConvertedValue = HAL_ADC_GetValue(&AdcHandle);  /* 读取数值 */
Vtemp_sensor = (110.0 - 30.0) * (uwConvertedValue - TS_CAL1)/ (TS_CAL2 - TS_CAL1) + 30;   /* 转换 */


公式:
99.png
QQ截图20180908152901.png

效果:
888.png
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2018-9-9 14:19:17 | 显示全部楼层
感谢分享
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-9 19:28:15 | 显示全部楼层
不知道为什么  ADC的DMA模式,CUBEMX配置的,一直只能转换第一次数据,后面的数据没变化过。 MB1137  VEB的板子,跟你的一模一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-9-10 00:58:05 | 显示全部楼层
KAIXIN 发表于 2018-9-9 19:28
不知道为什么  ADC的DMA模式,CUBEMX配置的,一直只能转换第一次数据,后面的数据没变化过。 MB1137  VEB的 ...

多试试,估计是配置有问题。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2018-9-10 09:37:49 | 显示全部楼层
eric2013 发表于 2018-9-10 00:58
多试试,估计是配置有问题。

好的!!,再试试
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-10 16:01:25 | 显示全部楼层
问一下楼主,这个参考电压是不需要设置的吧?内部默认设置好了就是你圈出来的电压值吗?我读取的总不对。
比如我的某次读取:
TS_CAL1:12309,
TS_CAL2:15501,
adc:15359,                                  <-- 原始ADC值
T:106.441101                              <-- 换算温度
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-9-10 17:28:35 | 显示全部楼层
oneV 发表于 2018-9-10 16:01
问一下楼主,这个参考电压是不需要设置的吧?内部默认设置好了就是你圈出来的电压值吗?我读取的总不对。
...

从你的数值来看,没问题
TS_CAL1:12309 ---对应的30°
TS_CAL2:15501 --- 对应的110°
adc:15359, --- 对应的106.

就是这个温度值的确有点高。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-10 19:44:01 | 显示全部楼层
本帖最后由 oneV 于 2018-9-10 19:48 编辑
eric2013 发表于 2018-9-10 17:28
从你的数值来看,没问题
TS_CAL1:12309 ---对应的30°
TS_CAL2:15501 --- 对应的110°

对  根据线性比例是的   但关键是我的温度(室温)不太对   所以我想知道是不是跟这个参考电压有关系   另外你的设置有什么其他不一样的或者说特别之处吗
adc:14132,TS_CAL1:12309,TS_CAL2:15501,T:75.689224
感觉我的不加后面那个30才是正确的
好奇怪

楼主的工程能发我参考一下吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-9-11 02:25:56 | 显示全部楼层
oneV 发表于 2018-9-10 19:44
对  根据线性比例是的   但关键是我的温度(室温)不太对   所以我想知道是不是跟这个参考电压有关系    ...

把你的ADC配置代码发出来看下。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-11 09:34:03 | 显示全部楼层
  1. ADC_HandleTypeDef hadc3;

  2. /* ADC3 init function */
  3. void MX_ADC3_Init(void)
  4. {
  5.   ADC_ChannelConfTypeDef sConfig;

  6.     /**Common config
  7.     */
  8.   hadc3.Instance = ADC3;
  9.   hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  10.   hadc3.Init.Resolution = ADC_RESOLUTION_16B;
  11.   hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  12.   hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  13.   hadc3.Init.LowPowerAutoWait = DISABLE;
  14.   hadc3.Init.ContinuousConvMode = DISABLE;
  15.   hadc3.Init.NbrOfConversion = 1;
  16.   hadc3.Init.DiscontinuousConvMode = DISABLE;
  17.   hadc3.Init.NbrOfDiscConversion = 1;
  18.   hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  19.   hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  20.   hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
  21.   hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  22.   hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  23.   hadc3.Init.BoostMode = ENABLE;
  24.   hadc3.Init.OversamplingMode = DISABLE;
  25.   if (HAL_ADC_Init(&hadc3) != HAL_OK)
  26.   {
  27.     _Error_Handler(__FILE__, __LINE__);
  28.   }

  29.     /**Configure Regular Channel
  30.     */
  31.   sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  32.   sConfig.Rank = ADC_REGULAR_RANK_1;
  33.   sConfig.SamplingTime = ADC_SAMPLETIME_387CYCLES_5;
  34.   sConfig.SingleDiff = ADC_SINGLE_ENDED;
  35.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  36.   sConfig.Offset = 0;
  37.   if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)
  38.   {
  39.     _Error_Handler(__FILE__, __LINE__);
  40.   }

  41. }

  42. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  43. {

  44.   if(adcHandle->Instance==ADC3)
  45.   {
  46.   /* USER CODE BEGIN ADC3_MspInit 0 */

  47.   /* USER CODE END ADC3_MspInit 0 */
  48.     /* ADC3 clock enable */
  49.     __HAL_RCC_ADC3_CLK_ENABLE();
  50.   /* USER CODE BEGIN ADC3_MspInit 1 */

  51.   /* USER CODE END ADC3_MspInit 1 */
  52.   }
  53. }
复制代码
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-11 09:42:09 | 显示全部楼层
eric2013 发表于 2018-9-11 02:25
把你的ADC配置代码发出来看下。

如上                      紫薯
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-9-11 12:44:04 | 显示全部楼层
oneV 发表于 2018-9-11 09:42
如上                      紫薯
AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4

试试。


回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-11 14:05:34 | 显示全部楼层
eric2013 发表于 2018-9-11 12:44
AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4

试试。

试过                                   
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2018-9-11 17:36:09 | 显示全部楼层
eric2013 发表于 2018-9-11 12:44
AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4

试试。

楼主的工程能参考一下么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2018-9-12 02:10:07 | 显示全部楼层
oneV 发表于 2018-9-11 17:36
楼主的工程能参考一下么

暂时没有现成的工程供参考,只能帮你看下配置
回复

使用道具 举报

5

主题

7

回帖

22

积分

新手上路

积分
22
发表于 2020-11-26 11:06:58 | 显示全部楼层
oneV 发表于 2018-9-10 16:01
问一下楼主,这个参考电压是不需要设置的吧?内部默认设置好了就是你圈出来的电压值吗?我读取的总不对。
...

你查一下板子上ADC的参考电压是不是3.3v,ST给出的这组校准值是在3.3v时做出来的,如果你的板子的ADC参考电压不是3.3v的话,就会有一个误差,手动转换一下就能解决
回复

使用道具 举报

8

主题

28

回帖

52

积分

初级会员

积分
52
发表于 2021-7-5 18:26:24 | 显示全部楼层
参考电压是2.5V时,公式怎样改一下?找了半天教程都找不到头绪。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2021-7-6 08:45:05 | 显示全部楼层
q164129345 发表于 2021-7-5 18:26
参考电压是2.5V时,公式怎样改一下?找了半天教程都找不到头绪。

公式只有这一个,这个公式正常情况下,用户使用3.3V电压基准或者2.5V电压基准都行。

你测试使用2.5V差距比较大吗,如果是的话,那就表示仅支持3.3V情况下了

回复

使用道具 举报

8

主题

28

回帖

52

积分

初级会员

积分
52
发表于 2021-7-6 09:37:12 | 显示全部楼层
eric2013 发表于 2021-7-6 08:45
公式只有这一个,这个公式正常情况下,用户使用3.3V电压基准或者2.5V电压基准都行。

你测试使用2.5V差 ...

我有两块板子,一块板子的Vref是3.3V,测到40几度,证明是对的。另外一块板子的Vref是2.5V,测到120几度,证明有问题。一开始我以为Vref有问题,后来我通过Vref去计算内部参考电压Vrefint = 1.2v左右(证明Vref是正常的)。

正在思考,使用外部Vref2.5V时,怎么计算CPU温度。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-2-27 09:01:22 | 显示全部楼层
xucn 发表于 2020-11-26 11:06
你查一下板子上ADC的参考电压是不是3.3v,ST给出的这组校准值是在3.3v时做出来的,如果你的板子的ADC参考 ...

怎么进行手动转化啊?
TS_CAL1:12309 ---对应的30°
TS_CAL2:15501 --- 对应的110°
TS_DATA:15359---本次测试的值
转换后的值:15359* 2.5 / 3.3 = 11636
Vtemp_sensor = (110.0 - 30.0) * (11636 -  12309)/ (15501 - 12309) + 30
Vtemp_sensor = 13.13
这样转化吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2023-2-27 10:52:53 | 显示全部楼层
匆匆123 发表于 2023-2-27 09:01
怎么进行手动转化啊?
TS_CAL1:12309 ---对应的30°
TS_CAL2:15501 --- 对应的110°

新版做函数了

[C] 纯文本查看 复制代码
/**
  * @brief  Helper macro to calculate the temperature (unit: degree Celsius)
  *         from ADC conversion data of internal temperature sensor.
  * @note   Computation is using temperature sensor typical values
  *         (refer to device datasheet).
  * @note   Calculation formula:
  *           Temperature = (TS_TYP_CALx_VOLT(uV) - TS_ADC_DATA * Conversion_uV)
  *                         / Avg_Slope + CALx_TEMP
  *           with TS_ADC_DATA      = temperature sensor raw data measured by ADC
  *                                   (unit: digital value)
  *                Avg_Slope        = temperature sensor slope
  *                                   (unit: uV/Degree Celsius)
  *                TS_TYP_CALx_VOLT = temperature sensor digital value at
  *                                   temperature CALx_TEMP (unit: mV)
  *         Caution: Calculation relevancy under reserve the temperature sensor
  *                  of the current device has characteristics in line with
  *                  datasheet typical values.
  *                  If temperature sensor calibration values are available on
  *                  on this device (presence of macro __LL_ADC_CALC_TEMPERATURE()),
  *                  temperature calculation will be more accurate using
  *                  helper macro @ref __LL_ADC_CALC_TEMPERATURE().
  * @note   As calculation input, the analog reference voltage (Vref+) must be
  *         defined as it impacts the ADC LSB equivalent voltage.
  * @note   Analog reference voltage (Vref+) must be either known from
  *         user board environment or can be calculated using ADC measurement
  *         and ADC helper macro @ref __LL_ADC_CALC_VREFANALOG_VOLTAGE().
  * @note   ADC measurement data must correspond to a resolution of 12bits
  *         (full scale digital value 4095). If not the case, the data must be
  *         preliminarily rescaled to an equivalent resolution of 12 bits.
  * @param  __TEMPSENSOR_TYP_AVGSLOPE__   Device datasheet data: Temperature sensor slope typical value (unit: uV/DegCelsius).
  *                                       On STM32H7, refer to device datasheet parameter "Avg_Slope".
  * @param  __TEMPSENSOR_TYP_CALX_V__     Device datasheet data: Temperature sensor voltage typical value (at temperature and Vref+ defined in parameters below) (unit: mV).
  *                                       On STM32H7, refer to device datasheet parameter "V30" (corresponding to TS_CAL1).
  * @param  __TEMPSENSOR_CALX_TEMP__      Device datasheet data: Temperature at which temperature sensor voltage (see parameter above) is corresponding (unit: mV)
  * @param  __VREFANALOG_VOLTAGE__        Analog voltage reference (Vref+) voltage (unit: mV)
  * @param  __TEMPSENSOR_ADC_DATA__       ADC conversion data of internal temperature sensor (unit: digital value).
  * @param  __ADC_RESOLUTION__            ADC resolution at which internal temperature sensor voltage has been measured.
  *         This parameter can be one of the following values:
  *         @arg @ref ADC_RESOLUTION_16B
  *         @arg @ref ADC_RESOLUTION_14B
  *         @arg @ref ADC_RESOLUTION_12B
  *         @arg @ref ADC_RESOLUTION_10B
  *         @arg @ref ADC_RESOLUTION_8B
  * @retval Temperature (unit: degree Celsius)
  */
#define __HAL_ADC_CALC_TEMPERATURE_TYP_PARAMS(__TEMPSENSOR_TYP_AVGSLOPE__,\
                                              __TEMPSENSOR_TYP_CALX_V__,\
                                              __TEMPSENSOR_CALX_TEMP__,\
                                              __VREFANALOG_VOLTAGE__,\
                                              __TEMPSENSOR_ADC_DATA__,\
                                              __ADC_RESOLUTION__)              \
         __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS((__TEMPSENSOR_TYP_AVGSLOPE__),\
                                              (__TEMPSENSOR_TYP_CALX_V__),\
                                              (__TEMPSENSOR_CALX_TEMP__),\
                                              (__VREFANALOG_VOLTAGE__),\
                                              (__TEMPSENSOR_ADC_DATA__),\
                                              (__ADC_RESOLUTION__))
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2023-2-27 12:34:15 | 显示全部楼层
硬汉哥,这个意思是H7可以在不接外部温度传感器的条件下读取自身芯片温度吗?
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2023-2-27 12:35:34 | 显示全部楼层
硬汉哥,这个意思是H7可以在不接外部温度传感器的条件下读取自身芯片温度吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107034
QQ
 楼主| 发表于 2023-2-27 15:17:18 | 显示全部楼层
2BAM 发表于 2023-2-27 12:34
硬汉哥,这个意思是H7可以在不接外部温度传感器的条件下读取自身芯片温度吗?

对,这个可以作为芯片工作温度的参考。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-2-28 10:10:48 | 显示全部楼层
eric2013 发表于 2023-2-27 10:52
新版做函数了

[mw_shl_code=c,true]/**

image.png
外部参考电压是2.5v,就是说调用函数为:
__HAL_ADC_CALC_TEMPERATURE_TYP_PARAMS(2000        , 620,  30,  2500mv, ADC_DATA_RAW, ADC_RESOLUTION_16B);


我得到的返回温度大概是45℃~47℃,这个范围的值,应该是正常的一个取值吧(开发板在室内)?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 06:55 , Processed in 0.280930 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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