目录
概述
主控芯片:STM32L051C8T6
IDE: keil + STM32CubeMx
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