STM32+ESP8266水墨屏天气时钟:利用STM32的ADC功能计算锂电池电量

项目背景

在水墨屏天气时钟的项目中,需要显示电池的剩余电量,本次使用STM32自带的12位ADC功能检测电池电压并且计算锂电池的剩余电池电量。

设计思路

1.锂电池电压先经过两个电阻分压。
2.ADC采集分压电阻的电压。
3.根据关系计算电池剩余电量。
4.在水墨屏上显示。

硬件方案

在这里插入图片描述
电路设计其实很简单,就是用两个大电阻去分压电池的电压,注意电阻的电阻值要大一点,并且最好是1%精度以下的电阻。分压后的BAT_ADC直接输入到单片机的ADC脚位。

电池电压和电池剩余电量的关系

根据锂电池放电特性(电池容量与电池电压的关系,具体还要看电池厂家给的资料,这里的数据只作为参考):

电池电量电池电压
100 %4.2V
90%4.08V
80%4.0V
70%3.93V
60%3.87V
50%3.83V
40%3.79V
30%3.77V
20%3.73V
10%3.68V
5%3.5V
0%2.5V

代码设计

软件设计就没什么好讲的了,就是开启STM32的ADC功能,然后得出BAT_ADC的电压,最后算出电池电压,根据关系得出电池电量。

//电池电压ADC采集初始化,ADC12_IN9,PB1
void BAT_ADC_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	ADC_DeInit(ADC1);
	
	ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转化模式设置
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据左对齐
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
	ADC_InitStructure.ADC_NbrOfChannel=1;//通道数
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式设置
	ADC_Init(ADC1,&ADC_InitStructure);
	
	ADC_Cmd(ADC1,ENABLE);//使能指定ADC外设
	
	ADC_ResetCalibration(ADC1);//使能复位校准
	while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
	ADC_StartCalibration(ADC1);//开启AD校准
	ADC_GetCalibrationStatus(ADC1);//等待AD校准结束

}

//获得ADC值
//通道9采样值
uint16_t Get_Adc(void)
{	
   ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道,采样时间为239.5周期	  			    
	 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能	
	 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
	 return ADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
}

//计算电池的电压
float Get_BAT_Voltage()
{
  u16 BAT_ADC=0;
	float BAT_Voltage=0;//电池的电压
    int i=0;
	for(i=0;i<5;i++)
	{
		BAT_ADC=BAT_ADC+Get_Adc();
		delay_ms(10);
	}
    BAT_ADC=BAT_ADC/5;
	BAT_Voltage=(float)BAT_ADC*(3.3/4096);
	//这里乘以2是因为两个电阻分压了
	BAT_Voltage=BAT_Voltage*2;
    return BAT_Voltage;
}
  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于STM32ESP8266的桌面型网络天气时钟系统设计如下:该系统主要由STM32单片机ESP8266无线模块、RTC实时时钟模块、LCD显示和温湿度传感器等组成。 首先,STM32作为主控单元,负责整个系统的控制和协调。它通过串口与ESP8266进行通信,将获取到的天气数据发送给ESP8266进行处理和联网。 其次,ESP8266无线模块实现了系统的网络连接功能。它能够通过WiFi无线网络连接到互联网,从而获取天气数据。ESP8266利用HTTP协议与已有的天气API进行通信,获取实时的天气数据,并将其返回给STM32。 RTC实时时钟模块用于实时记录当前时间,并在断电后能够继续保持时间的准确性。它提供了精确的时钟信号以及日期显示功能,确保系统能够准确显示当前时间和日期。 LCD显示用于显示系统中的各种信息,包括时间、日期、天气预报等。通过与STM32进行通信,LCD幕能够根据接收到的数据更新显示内容。 最后,温湿度传感器用于实时监测环境的温度和湿度。它通过与STM32的连接,将监测到的数据传输给STM32进行处理和显示,并可以根据数据判断是否需要提醒用户进行调整。 总之,基于STM32ESP8266的桌面型网络天气时钟系统能够通过连接到互联网获取实时的天气数据,并将其显示在LCD幕上。同时,它还能够显示当前时间、日期和环境温湿度等信息,为用户提供了一种实用的功能,并能够根据实时数据进行提醒和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的王大胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值