STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值

1、原理图

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第1张图片

分压电阻计算公式:

BAT_ADC=R26/(R26+R27)

2、STM32CubeMx工具配置

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第2张图片

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第3张图片

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第4张图片

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第5张图片

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第6张图片

3、代码

1、串口(串口重映射打印配置)

usart.c文件

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */



/* USER CODE BEGIN 1 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}
/* USER CODE END 1 */

2、ADC

adc.c文件

/* USER CODE BEGIN 1 */
//读取ADC值
uint16_t ADC_GetValue(void)
{
	uint8_t i=0;
	float BAT=0,TEMP=0;
	int32_t AD_T=0,AD_BAT=0;
	
	//采样时间选择最长,更加准确
	//hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5;
	
	//开启ADC校准
	HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED);
	
	//开启ADC转换
	HAL_ADC_Start(&hadc);										//first conv
	//等待转换完成
	if(HAL_ADC_PollForConversion(&hadc, 200)== HAL_OK)
	{
		//获取在当前供电条件下的ADC采样值
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))
		{
			AD_BAT = HAL_ADC_GetValue(&hadc);
			BAT=(float)((3.3*AD_BAT/4096)*2.5);
		}
	}		
	
	//开启ADC转换
	HAL_ADC_Start(&hadc);										//second conv
	//等待转换完成
	if(HAL_ADC_PollForConversion(&hadc, 200)== HAL_OK)
	{
		//获取在当前供电条件下的ADC采样值
		if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc), HAL_ADC_STATE_REG_EOC))
		{
			AD_T = HAL_ADC_GetValue(&hadc);	//读取ADC通道值
			TEMP=(float)AD_T*(3.3/4096);		//电压值 
			TEMP=(1.43-TEMP)/0.0043+25;		  	//转换为温度值 
			if(TEMP<0)
				TEMP=-TEMP;				
		}
	}
	//停止ADC转换
	HAL_ADC_Stop(&hadc);										//stop conv
	
	printf("\r\nBat_Value=%lf \r\n",BAT);
	printf("**********************\r\n");
	printf("\r\ntemp=%.2f \r\n",TEMP);
	return BAT;
}


/* USER CODE END 1 */

BAT=(float)((3.3*AD_BAT/4096)*2.5);

这里说明一下,计算公式从官方手册找到的,网上很多资料都没怎么说明清楚,导致小白懵逼

先看一下,官方手册电压换算公式吧,^_^ 如下 : 请看下图

 我这里读取的ADC值为:AD_BAT为:1.64V(万用表实测的值),输入的电池电压为4.129V左右,通过上面的计算公式得出,还是可以接受的。(注:公式上有个*2.5V是通过原理图分压系数得出。也就是两个分压电阻的比例刚好是2.5倍)。
STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第7张图片
STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第8张图片

adc.h文件

/* USER CODE BEGIN Prototypes */
uint16_t ADC_GetValue(void);
/* USER CODE END Prototypes */

3、main

main.c文件

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

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

 

4、运行结果

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第9张图片

STM32L051C8T6 使用ADC方式,检测电压值与自带芯片温度值_第10张图片

 

参考文章:(一)https://blog.csdn.net/qq_38410730/article/details/80080660

                  (二)https://blog.51cto.com/5796396/2326418?source=dra

代码

你可能感兴趣的:(单片机开发)