打印
[STM32WB]

【STM32WB09KE测评】+ADC测试之获取芯片温度值

[复制链接]
651|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stb988|  楼主 | 2024-11-17 23:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创#           
          STM32WB09KE芯片是自带芯片温度测量的,本交测试体验就来获取一下芯片温度,但不知道什么原因,计算出来的数据与实际误差很大,但我用热风枪吹芯片,采集到的adc值是有变化的,具体什么原因,暂时还不得清楚,下面先记录一下获取温度值的过程,望大侠指点一下。
          要获取温度,首先用stm32 cubemx生成初始化代码。adc采用dma方式获取。下面看配置图片。

接下来就是打开工程,添加代码了,首先定义两个宏
#define VDDA_APPLI           (3300UL) // mV
#define ADC_BUFFER_SIZE      (1)      // Only temperature sensor data
再定义两个变量
uint32_t adc_buffer[ADC_BUFFER_SIZE]; // DMA buffer
float temperature_celsius = 0;
接着要做的就是开始DMA
    // Start ADC with DMA
    if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE) != HAL_OK) {
        printf("ADC DMA Start Error!\n");
        Error_Handler();
    }
再开始ADC转换
      /* Start ADC group regular conversion */
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
      /* Error: ADC conversion start could not be performed */
      Error_Handler();
    }

最后转换成温度值
        uint32_t raw_adc_value = adc_buffer[0];

      // 计算温度
                   printf("adc: %d C\r\n", raw_adc_value);
                   printf("c30: %d C\r\n", (int32_t)*TEMPSENSOR_C30_ADDR);
                   printf("tck: %d C\r\n", (int32_t)*TEMPSENSOR_TCK_ADDR);
         int temperature = __LL_ADC_CALC_TEMPERATURE(raw_adc_value, LL_ADC_DS_DATA_WIDTH_12_BIT);

        printf("Temperature: %d C\r\n", temperature);
但最打印出来是只有几度

根据公式计算,也只有几度

问题暂时没有找到,有请朋友们指点一下。

使用特权

评论回复
沙发
Dick Hou| | 2024-11-18 17:10 | 只看该作者
ADC的采样时间是多少周期?太快了不行。

使用特权

评论回复
板凳
stb988|  楼主 | 2024-11-18 18:22 | 只看该作者
Dick Hou 发表于 2024-11-18 17:10
ADC的采样时间是多少周期?太快了不行。

我看官方示例也是这个时间

使用特权

评论回复
地板
Dick Hou| | 2024-11-19 08:56 | 只看该作者
stb988 发表于 2024-11-18 18:22
我看官方示例也是这个时间

哪个时间?你贴子里并没有体现出来。

另外,你直接采样时间改到最大试试。

使用特权

评论回复
5
stb988|  楼主 | 2024-11-19 11:08 | 只看该作者
Dick Hou 发表于 2024-11-19 08:56
哪个时间?你贴子里并没有体现出来。

另外,你直接采样时间改到最大试试。 ...
/* ADC1 init function */
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef ConfigChannel = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ConversionType = ADC_CONVERSION_WITH_DS;
  hadc1.Init.SequenceLength = 1;
  hadc1.Init.SamplingMode = ADC_SAMPLING_AT_START;
  hadc1.Init.SampleRate = ADC_SAMPLE_RATE_16;
  hadc1.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
  hadc1.Init.Overrun = ADC_NEW_DATA_IS_LOST;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
  hadc1.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  ConfigChannel.Channel = ADC_CHANNEL_TEMPSENSOR;
  ConfigChannel.Rank = ADC_RANK_1;
  ConfigChannel.VoltRange = ADC_VIN_RANGE_1V2;
  ConfigChannel.CalibrationPoint.Number = ADC_CALIB_POINT_1;
  ConfigChannel.CalibrationPoint.Gain = 0x0;
  ConfigChannel.CalibrationPoint.Offset = 0x0;
  if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}
ADC_SAMPLE_RATE_16从到ADC_SAMPLE_RATE_140都试了,都不行,而且采集也是做了等待的
      /* Start ADC group regular conversion */
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
      /* Error: ADC conversion start could not be performed */
      Error_Handler();
    }
                HAL_Delay(50);
包括还特意等待了一段时间再处理,也是一样。

使用特权

评论回复
6
Dick Hou| | 2024-11-21 11:34 | 只看该作者
等待没啥用,主要是sample rate要和信号源阻抗匹配。

另外,检查一下规格,温度传感器是否需要单独打开。我记得F0是要单独打开的,即使ADC选择了这个通道。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

347

帖子

1

粉丝