STM32L051C8T6 使用ADC方式,檢測電壓值與自帶芯片溫度值

1、原理圖

分壓電阻計算公式:

BAT_ADC=R26/(R26+R27)

2、STM32CubeMx工具配置

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倍)。

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、運行結果

 

參考文章:https://blog.csdn.net/qq_38410730/article/details/80080660

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章