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