硬汉嵌入式论坛

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

[ADC] 求助!mcu内部温度adc读数随温度上升而下降

[复制链接]

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2025-3-29 10:53:20 | 显示全部楼层 |阅读模式

太奇怪了,按照说明配置了,mcu内部温度adc读数随温度上升而下降
型号STM32H753XTH6
启动后温度:
temp 10 'INSIDE_NTC', 13416

拿热风枪吹mcu:
temp 10 'INSIDE_NTC', 13119
temp 10 'INSIDE_NTC', 12959
temp 10 'INSIDE_NTC', 12212
temp 10 'INSIDE_NTC', 11446
temp 10 'INSIDE_NTC', 11275
temp 10 'INSIDE_NTC', 10818
。。。
temp 10 'INSIDE_NTC', 9953

最后转换出来的温度成了负数,求大佬帮我看下配置和问题

配置函数:
[C] 纯文本查看 复制代码
static void MX_ADC3_Init(void)
{
/* USER CODE BEGIN ADC3_Init 0 */

/* USER CODE END ADC3_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC3_Init 1 */

/* USER CODE END ADC3_Init 1 */
/* Common config */
hadc3.Instance = ADC3;
hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV8;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc3.Init.LowPowerAutoWait = DISABLE;
hadc3.Init.ContinuousConvMode = DISABLE;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc3.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc3) != HAL_OK) {
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
sConfig.OffsetSignedSaturation = DISABLE;
if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) {
Error_Handler();
}
/* USER CODE BEGIN ADC3_Init 2 */

/* USER CODE END ADC3_Init 2 */
}

读取的函数,hadc3,ch是ADC_CHANNEL_18,sampling_time是ADC_SAMPLETIME_64CYCLES_5
[C] 纯文本查看 复制代码
static uint32_t read_stm32_adc_val(ADC_HandleTypeDef *adc_hdl, uint32_t ch, uint32_t sampling_time)
{
ADC_ChannelConfTypeDef adc_channel_cfg;
HAL_StatusTypeDef ret;

adc_channel_cfg.Channel = ch;
adc_channel_cfg.Rank = ADC_REGULAR_RANK_1;
adc_channel_cfg.SamplingTime = sampling_time;
adc_channel_cfg.SingleDiff = ADC_SINGLE_ENDED;
adc_channel_cfg.OffsetNumber = ADC_OFFSET_NONE;
adc_channel_cfg.Offset = 0;

ret = HAL_ADC_ConfigChannel(adc_hdl, &adc_channel_cfg);
if (ret != HAL_OK) {
slog_err("%s err ret:%x\n", __func__, ret);
return ADC_INVALID_VALUE;
}

HAL_ADCEx_Calibration_Start(adc_hdl, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

ret = HAL_ADC_Start(adc_hdl);
if (ret != HAL_OK) {
slog_err("%s %d err ret:%x\n", __func__, __LINE__, ret);
return ADC_INVALID_VALUE;
}

ret = HAL_ADC_PollForConversion(adc_hdl, ADC_POLL_CONVERSION_TIMEOUT);
if (ret != HAL_OK) {
slog_err("%s %d err ret:%x\n", __func__, __LINE__, ret);
return ADC_INVALID_VALUE;
}

return HAL_ADC_GetValue(adc_hdl);
}

回复

使用道具 举报

10

主题

53

回帖

83

积分

初级会员

积分
83
发表于 2025-3-29 14:13:17 | 显示全部楼层
内部MCU温度有个计算公式的,在参考手册中
屏幕截图 2025-03-29 141236.png
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-3-31 16:30:55 | 显示全部楼层
jet1999 发表于 2025-3-29 14:13
内部MCU温度有个计算公式的,在参考手册中

是按照这个公式实现的,而且这个问题和公式无关,问题是adc测出的电压本身是异常的
回复

使用道具 举报

9

主题

128

回帖

155

积分

初级会员

积分
155
发表于 2025-3-31 21:32:46 | 显示全部楼层
seatung 发表于 2025-3-31 16:30
是按照这个公式实现的,而且这个问题和公式无关,问题是adc测出的电压本身是异常的

这是NTC,温度和电压应该是负相关吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2025-4-1 09:35:58 | 显示全部楼层
这个我们有做过一个例子,使用的稳压基准是3.3V,测试是正常的。要不试试

https://forum.anfulai.cn/forum.p ... &extra=page%3D1

V7-021


回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
 楼主| 发表于 2025-4-8 10:52:53 | 显示全部楼层
596142041 发表于 2025-3-31 21:32
这是NTC,温度和电压应该是负相关吧

是负相关吗?我读取板子上标定的值:Tcal1:12404, Tcal2:16417,看起来是正相关?可以分享下你的Tcal1和Tcal2吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 16:15 , Processed in 0.046005 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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