历史上的今天
返回首页

历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2021年09月22日 | 【STM32平衡小车】通过ADC获取电池电压

2021-09-22 来源:eefocus

一、前言

一般航模电池的电量是和电压相关的, 过放必然导致电池永久过放,所以我们有必要通过监控电池电压的变化, 近似表示电池的电量, 在电池电量比较低的情况下, 提醒我们充电。


3S 满电的时候是 12.6V, 过放时电压低于 9.6V。

2S 满电的时候是 8.4 V , 过放时电压低于 7.4V。


原理图如下

在这里插入图片描述

简单分析可知, 电池电压经过电阻分压, 衰竭为原来的 1/11 之后, 送单片机 ADC 检测, 以 12 位 ADC 的 STM32 举例, Get_Battery 为ADC 采集的变量, 那么很容易计算得到电池的电量为:


Battery_Voltage = Get_Battery * 3.3 * 11 / 4096(单位: V)


二、代码

adc.c


#include "adc.h"


void  Adc_Init(void)

{    

  ADC_InitTypeDef ADC_InitStructure; 

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC1通道时钟

RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

//PA4 作为模拟通道输入引脚                         

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚

GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目

ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1

ADC_ResetCalibration(ADC1); //使能复位校准   

while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

ADC_StartCalibration(ADC1); //开启AD校准

while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束

}


u16 Get_Adc(u8 ch)   

{

//设置指定ADC的规则组通道,一个序列,采样时间

ADC_RegularChannelConfig(ADC1, ch, 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规则组的转换结果

}


int Get_battery_volt(void)   

{  

int Volt;//电池电压

Volt=Get_Adc(Battery_Ch)*3.3*11*100/4096; //电阻分压,具体根据原理图简单分析可以得到

if(Volt>1260)Volt=1260;

return Volt;

}


adc.h


#ifndef _ADC_H

#define _ADC_H



#include "config.h"


#define Battery_Ch 4

void Adc_Init(void);

u16 Get_Adc(u8 ch);

int Get_battery_volt(void); 


#endif

推荐阅读

史海拾趣

Electric Imp Inc.公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Electric Imp Inc.公司始终保持着敏锐的市场洞察力和持续的创新精神。公司不断推出新产品、新技术,以满足不同客户的需求。同时,公司还加强了内部管理和团队建设,提高了员工的专业素质和工作效率。这些努力使得公司能够保持持续的发展态势,并在电子行业中保持领先地位。

捷茂微(GATEMODE)公司的发展小趣事

为了进一步提升品牌影响力和市场份额,Electric Imp Inc.公司开始实施国际化战略。公司先后在北美、欧洲、亚洲等地设立了研发中心和分支机构,以便更好地了解当地市场需求和技术趋势。同时,公司还积极参加国际展览、研讨会等活动,与全球同行交流经验、分享技术。这些努力使得公司的国际化水平不断提高。

Block USA Inc.公司的发展小趣事

Block USA Inc.最初以其线下支付业务Square在电子支付领域崭露头角。公司创始人杰克·多尔西洞察到小型商户在支付处理方面的需求,并推出了简单易用的磁条卡读卡器Square Reader。这一创新产品迅速受到市场欢迎,帮助无数小型企业和个体经营者实现了便捷、安全的电子支付。随着Square品牌的知名度不断提升,Block逐渐在支付领域建立了坚实的地位。

GE Solid State公司的发展小趣事
在摄影过程中,摄影师可以使用可听的曝光表电路来辅助判断曝光量,特别是在光线条件复杂或无法直接观察取景器时。
国产公司的发展小趣事
信号线路受到周围电磁场的干扰。可以通过使用屏蔽线缆、隔离电源等措施来减少电磁干扰。
Aavid Thermalloy公司的发展小趣事
对于功率较大的放大器,需要采用高效的散热措施来确保电路的稳定运行和长寿命。

问答坊 | AI 解惑

BOOTLOADER程序有高手能指点么?

把外部flash里的程序放到ARM内部ROM,谁有代码啊?…

查看全部问答>

Linus步入不惑之年

2009年12月28日是Linux创始人Linus的40岁生日。 19年前,在圣诞节后赫尔辛基商店开业的第一天“,Linus冲向电脑商店,用圣诞节和生日礼金购买了他的第一台PC:一台DX33 80386计算机,4 Megs RAM,40 Megabyte硬盘,没有协同处理器。Linus之所以选 ...…

查看全部问答>

心情沮丧啊。。。

刚刚了看,里面有句话很让我沮丧啊:卖包子的都比工程师强! 研发:产业链的源头,资金链的末尾; 销售:产业链的末尾,资金链的源头; 研发人员是那里面最累的,钱拿的是最少的(指回报率),在一个行业坚持下去的没几人,还劝说周围的年轻人除 ...…

查看全部问答>

BIOS设计是否可以跨硬件

在自学汇编的过程中,遇到一个问题: 我写的BIOS调用是否可以跨硬件平台 换句话说,就是不同的板子上的BIOS设计是否是一样的?…

查看全部问答>

在WinCE环境下对.txt文件的读写

编写一个基于MFC的应用程序,读取.txt文件 文件内容的结构如下 书名1;价格1 书名2;价格2 书名3;价格3 。。。。。。 要求分别提取出书名和价格,分别放到string类型变量中 要就用VC++实现 各位高手帮帮忙,最好能有代码…

查看全部问答>

一个USB设备二台电脑

一个USB扩展槽上插了一个U盘,用USB连接线插了二台电脑。这两台电脑不同时操作U盘的情况下(任何情况下只有一台电脑对U盘操作),这样使用会有问题吗?…

查看全部问答>

请教版主,为什么我的程序进不了硬中断(已解决)

问高手个问题,为什么我的程序进了不硬中断? BIOS设置: HWI_INT11属性: interrupt source: MCSP_0_Receiver function: _receiver use Dispatcher interrupt Mash: self 程序 void main() {} void receiver() {...} 用轮询方式可以收 ...…

查看全部问答>

基于高吞吐率WLR测试的 ACS集成测试系统(二)

多器件TDDB和NBTI 图4示出了多器件TDDB测试结构的共用 SMU和SMU-per-pin配置。在开关(共用SMU) 情况下,SMU1提供连续应力至测试序列的全 部结构,SMU2顺序测量每个器件。在顺序分 析结构的过程中,开关延时和有限的测量速 度合在一起会限制每 ...…

查看全部问答>

C2000 Launchpad发热很大??!!

今天刚拿到快递~~~好欢乐~~~(不得不吐槽的是,圆通就是慢,虽然路上不慢,但是总在终点站耽误一天!!尼玛啊!!) 迫不及待插上电,试试内置的例程. led闪了会,一摸芯片,明显有点烫啊!! 后来用ccs5少了个led boosterpack的程序进去..(虽然没达到演示效果 ...…

查看全部问答>

【Nucleo心得】+ (EX06) 旋转编码器使用

本帖最后由 slotg 于 2014-10-19 09:37 编辑 本次实验编写了一个旋转编码器的驱动,顺时钟旋转时计数器增加,逆时钟旋转时计数器减少,压下中间开关时计数器清除。 旋转编码器的接脚与输出波形: 旋转编码器是输出2个相位差90度的波形,由 ...…

查看全部问答>