硬汉嵌入式论坛

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

[ADC] H7 ADC3的温度传感器采集值转换后温度总是120多度

[复制链接]

8

主题

28

回帖

52

积分

初级会员

积分
52
发表于 2024-3-28 18:08:39 | 显示全部楼层 |阅读模式
本帖最后由 fendoushuai 于 2024-3-28 18:10 编辑

从H7的ADC3 19通道读取的温度值转换后总是120多度
是需要对它进行校准吗?还是有别的配置

printf打印的结果如下

TS_CAL1=12220, TS_CAL2=16301
ADC3_INP19 TEMP Value=17179, Voltage= 127.211 C,


[C] 纯文本查看 复制代码
  static void AppTaskADC(void *p_arg)
{
    float AdcValues[10];
    uint16_t TS_CAL1;
    uint16_t TS_CAL2;

    (void)p_arg;

    while(1) {
        BSP_vToggleLED(LED_YELLOW);

        TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);
        TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);    
        AdcValues[2] = (110.0 - 30.0) * ( aADC3ConvertedData[0] - TS_CAL1) / (TS_CAL2 - TS_CAL1) + 30;

        printf("TS_CAL1=%d, TS_CAL2=%d\r\n", TS_CAL1, TS_CAL2);
        printf("ADC3_INP19 TEMP Value=%d, Voltage= %5.3f C,\r\n", aADC3ConvertedData[0], AdcValues[2]);

        OSTimeDlyHMSM(0, 0, 2, 0);
    } 
}


 /* ### - 1 - Initialize ADC peripheral #################################### */
  hadc3.Instance          = ADC3;
  if (HAL_ADC_DeInit(&hadc3) != HAL_OK) {
    /* ADC de-initialization Error */
    Error_Handler(__FILE__, __LINE__); 
  }

  hadc3.Init.ClockPrescaler           = ADC_CLOCK_ASYNC_DIV1;            /* Asynchronous clock mode, input ADC clock divided by 1*/
  hadc3.Init.Resolution               = ADC_RESOLUTION_16B;              /* 16-bit resolution for converted data */
  hadc3.Init.ScanConvMode             = DISABLE;                         /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  hadc3.Init.EOCSelection             = ADC_EOC_SINGLE_CONV;             /* EOC flag picked-up to indicate conversion end */
  hadc3.Init.LowPowerAutoWait         = DISABLE;                         /* Auto-delayed conversion feature disabled */
  hadc3.Init.ContinuousConvMode       = ENABLE;                          /* Continuous mode enabled (automatic conversion restart after each conversion) */
  hadc3.Init.NbrOfConversion          = 1;                               /* Parameter discarded because sequencer is disabled */
  hadc3.Init.DiscontinuousConvMode    = DISABLE;                         /* Parameter discarded because sequencer is disabled */
  hadc3.Init.NbrOfDiscConversion      = 1;                               /* Parameter discarded because sequencer is disabled */
  hadc3.Init.ExternalTrigConv         = ADC_SOFTWARE_START;              /* Software start to trig the 1st conversion manually, without external event */
  hadc3.Init.ExternalTrigConvEdge     = ADC_EXTERNALTRIGCONVEDGE_NONE;   /* Parameter discarded because software trigger chosen */
  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* ADC DMA circular requested */
  hadc3.Init.Overrun                  = ADC_OVR_DATA_OVERWRITTEN;        /* DR register is overwritten with the last conversion result in case of overrun */
  hadc3.Init.OversamplingMode         = DISABLE;                         /* No oversampling */

  /* Initialize ADC peripheral according to the passed parameters */
  if (HAL_ADC_Init(&hadc3) != HAL_OK) {
    Error_Handler(__FILE__, __LINE__); 
  }
    
  /* ### - 2 - Start calibration ############################################ */
  if (HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK) {
    Error_Handler(__FILE__, __LINE__); 
  }  


      /* ### - 3 - Channel configuration ######################################## */
  sConfig.Channel      = ADC_CHANNEL_TEMPSENSOR;                /* Sampled channel number */
  sConfig.Rank         = ADC_REGULAR_RANK_1;          /* Rank of sampled channel number ADCx_CHANNEL */
  sConfig.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;   /* Sampling time (number of clock cycles unit) */
  sConfig.SingleDiff   = ADC_SINGLE_ENDED;            /* Single-ended input channel */
  sConfig.OffsetNumber = ADC_OFFSET_NONE;             /* No offset subtraction */ 
  sConfig.Offset = 0;                                 /* Parameter discarded because offset correction is disabled */
  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) {
    Error_Handler(__FILE__, __LINE__); 
  }


 

回复

使用道具 举报

4

主题

74

回帖

86

积分

初级会员

积分
86
发表于 2024-3-29 09:06:03 | 显示全部楼层
注意基准电压的范围,官方给的公式的基准电压和你的基准电压是否一致?如果不一致要改变公式的!我之前测试温度一直是120度,怎么也查不到问题,后面是发现是基准电压问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-3-29 09:15:08 | 显示全部楼层
1、注意你的稳压基准,我们之前做的那个例子是3.3V稳压下测量的。
2、使用ADC功能,板子最好是外置电源供电。
回复

使用道具 举报

8

主题

28

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2024-3-29 10:09:00 | 显示全部楼层
板子电压参考电压是2.5V,调整了计算公式,使用HAL库中的函数__HAL_ADC_CALC_TEMPERATURE_TYP_PARAMS可以得到温度了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-3-30 08:40:57 | 显示全部楼层
fendoushuai 发表于 2024-3-29 10:09
板子电压参考电压是2.5V,调整了计算公式,使用HAL库中的函数__HAL_ADC_CALC_TEMPERATURE_TYP_PARAMS可以得 ...

那确实方便了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 03:39 , Processed in 0.169389 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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