我是靠谱客的博主 标致蓝天,最近开发中收集的这篇文章主要介绍STM32CubeMx配置HAL库ADCSTM32CubeMx配置HAL库ADC,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • STM32CubeMx配置HAL库ADC
    • ADC
    • 内部温度传感器
    • 软件配置
    • 代码编写

STM32CubeMx配置HAL库ADC

ADC

ADC是(Analog-to-DigitalConverter)的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

STM32的ADC精度是12位,它有18个通道,可以测量16路外部和2个内部信号源,各通道的A/D转换可以单次、连续、扫描或间断模式执行,ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。

image-20220721215640945

本章选取stm32的内部温度传感器为例,说明stm32cubemx配置ADC的整个过程。

内部温度传感器

STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器 在内部和 ADCx_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感 器模拟输入推荐采样时间是 17.1μs。 STM32 的内部温度传感器支持的温度范围为:-40~125 度,精度为±1.5℃左右(实际效果不咋地)。

STM32 的内部温度传感器固定的连接在 ADC 的通道 16 上,所以,我们在设 置好 ADC 之后只要读取通道 16 的值,就是温度传感器返回来的电压值了。根据这个值,我们 就可以计算出当前温度。计算公式如下:

T(℃)={(V25-Vsense)/Avg_Slope}+25

上式中: V25=Vsense 在 25 度时的数值(典型值为:1.43)。 Avg_Slope=温度与Vsense曲线的平均斜率(单位:mv/℃或uv/℃)(典型值:4.3mv/℃)。 利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。

软件配置

  • SYS->Debug->Serial Wire
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • RCC->HSE->Crystal/Ceramic Resonator
  • 时钟树,时钟设置为72M,ADC预分频因子设置为6,ADC_CLK为12MHz

image-20220721220414964

  • 激活ADC1温度传感器通道,设置右对齐,关闭扫描、连续及间断模式,使能regular conversion,设置软件触发、设置采样时间239.5个周期(19.96us)

image-20220721220826063

代码编写

adc.c中的初始化程序

ADC_HandleTypeDef hadc1;

/* ADC1 init function */
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

main.c

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint16_t adc_value;
  float vol_value,temp;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_ADC_Start(&hadc1); //启动ADC转换
    HAL_ADC_PollForConversion(&hadc1,10); //等待转换完成,10ms表示超时时间
    adc_value= HAL_ADC_GetValue(&hadc1);
    printf("ADC转换数据:%drn", adc_value);
    vol_value=adc_value*(3.3/4096);//AD值乘以分辨率为电压值
    printf("电压值为%.2frn",vol_value);
    temp=(1.43 - vol_value)/0.0043 + 25;//根据公式算出温度值
    printf("MCU内部温度为%.2frn",temp);
    printf("rn");
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

image-20220721215358949

最后

以上就是标致蓝天为你收集整理的STM32CubeMx配置HAL库ADCSTM32CubeMx配置HAL库ADC的全部内容,希望文章能够帮你解决STM32CubeMx配置HAL库ADCSTM32CubeMx配置HAL库ADC所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部