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

[复制链接]
1425|5
 楼主| stb988 发表于 2024-11-17 23:21 | 显示全部楼层 |阅读模式
#申请原创#           
          STM32WB09KE芯片是自带芯片温度测量的,本交测试体验就来获取一下芯片温度,但不知道什么原因,计算出来的数据与实际误差很大,但我用热风枪吹芯片,采集到的adc值是有变化的,具体什么原因,暂时还不得清楚,下面先记录一下获取温度值的过程,望大侠指点一下。
          要获取温度,首先用stm32 cubemx生成初始化代码。adc采用dma方式获取。下面看配置图片。
屏幕截图 2024-11-17 231124.png
接下来就是打开工程,添加代码了,首先定义两个宏
  1. #define VDDA_APPLI           (3300UL) // mV
  2. #define ADC_BUFFER_SIZE      (1)      // Only temperature sensor data
再定义两个变量
  1. uint32_t adc_buffer[ADC_BUFFER_SIZE]; // DMA buffer
  2. float temperature_celsius = 0;
接着要做的就是开始DMA
  1.     // Start ADC with DMA
  2.     if (HAL_ADC_Start_DMA(&hadc1, adc_buffer, ADC_BUFFER_SIZE) != HAL_OK) {
  3.         printf("ADC DMA Start Error!\n");
  4.         Error_Handler();
  5.     }
再开始ADC转换
  1.       /* Start ADC group regular conversion */
  2.     if (HAL_ADC_Start(&hadc1) != HAL_OK)
  3.     {
  4.       /* Error: ADC conversion start could not be performed */
  5.       Error_Handler();
  6.     }

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

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

  7.         printf("Temperature: %d C\r\n", temperature);
但最打印出来是只有几度
屏幕截图 2024-11-17 231800.png
根据公式计算,也只有几度
屏幕截图 2024-11-17 231909.png
问题暂时没有找到,有请朋友们指点一下。
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
我看官方示例也是这个时间

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

另外,你直接采样时间改到最大试试。
 楼主| stb988 发表于 2024-11-19 11:08 | 显示全部楼层
Dick Hou 发表于 2024-11-19 08:56
哪个时间?你贴子里并没有体现出来。

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

  4.   /* USER CODE BEGIN ADC1_Init 0 */

  5.   /* USER CODE END ADC1_Init 0 */

  6.   ADC_ChannelConfTypeDef ConfigChannel = {0};

  7.   /* USER CODE BEGIN ADC1_Init 1 */

  8.   /* USER CODE END ADC1_Init 1 */

  9.   /** Common config
  10.   */
  11.   hadc1.Instance = ADC1;
  12.   hadc1.Init.ConversionType = ADC_CONVERSION_WITH_DS;
  13.   hadc1.Init.SequenceLength = 1;
  14.   hadc1.Init.SamplingMode = ADC_SAMPLING_AT_START;
  15.   hadc1.Init.SampleRate = ADC_SAMPLE_RATE_16;
  16.   hadc1.Init.InvertOutputMode = ADC_DATA_INVERT_NONE;
  17.   hadc1.Init.Overrun = ADC_NEW_DATA_IS_LOST;
  18.   hadc1.Init.ContinuousConvMode = DISABLE;
  19.   hadc1.Init.DownSamplerConfig.DataWidth = ADC_DS_DATA_WIDTH_12_BIT;
  20.   hadc1.Init.DownSamplerConfig.DataRatio = ADC_DS_RATIO_1;
  21.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  22.   {
  23.     Error_Handler();
  24.   }

  25.   /** Configure Regular Channel
  26.   */
  27.   ConfigChannel.Channel = ADC_CHANNEL_TEMPSENSOR;
  28.   ConfigChannel.Rank = ADC_RANK_1;
  29.   ConfigChannel.VoltRange = ADC_VIN_RANGE_1V2;
  30.   ConfigChannel.CalibrationPoint.Number = ADC_CALIB_POINT_1;
  31.   ConfigChannel.CalibrationPoint.Gain = 0x0;
  32.   ConfigChannel.CalibrationPoint.Offset = 0x0;
  33.   if (HAL_ADC_ConfigChannel(&hadc1, &ConfigChannel) != HAL_OK)
  34.   {
  35.     Error_Handler();
  36.   }
  37.   /* USER CODE BEGIN ADC1_Init 2 */

  38.   /* USER CODE END ADC1_Init 2 */

  39. }
ADC_SAMPLE_RATE_16从到ADC_SAMPLE_RATE_140都试了,都不行,而且采集也是做了等待的
  1.       /* Start ADC group regular conversion */
  2.     if (HAL_ADC_Start(&hadc1) != HAL_OK)
  3.     {
  4.       /* Error: ADC conversion start could not be performed */
  5.       Error_Handler();
  6.     }
  7.                 HAL_Delay(50);
包括还特意等待了一段时间再处理,也是一样。
Dick Hou 发表于 2024-11-21 11:34 | 显示全部楼层
等待没啥用,主要是sample rate要和信号源阻抗匹配。

另外,检查一下规格,温度传感器是否需要单独打开。我记得F0是要单独打开的,即使ADC选择了这个通道。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

402

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部