太奇怪了,按照说明配置了,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);
}
|