历史上的今天

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

正在发生

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

发布者:梦回归处 来源: eefocus关键字:STM32  平衡小车  ADC  电池电压 手机看文章 扫描二维码
随时随地手机看文章

一、前言

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


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

关键字:STM32  平衡小车  ADC  电池电压 引用地址:【STM32平衡小车】通过ADC获取电池电压

上一篇:【STM32平衡小车】一篇快速上手MPU6050
下一篇:【STM32平衡小车】STM32定时器配置为编码器模式

推荐阅读

最近在最项目时遇到使用STM32写入SD卡数据时,刚开始数据写入正常,过一会就回出现错误,错误代码2,查阅FATFS的官方文档,给出如下:总共4种可能的情况,依次实验了上述问题的各种解决方法,都补管用,最后在写入数据前加入设备正常运行,替换成延时函数也正常运行由此推断可能是由于写入的速度过快造成。
近日,有海外媒体报道称,Alise项目组宣布已制造出能量密度达325Wh/kg的新一代锂硫电池测试原型。该项目组称,新一代的锂硫电池在量产状态下能量密度或将达到500Wh/kg,且有着体积更小、重量更轻的优势,制造成本也将比目前的三元锂电池更低。『Alise项目组研发的新一代锂硫电池原型』据外媒介绍,Alise项目组是欧盟资助,由来自5个不同国家的16个合作伙伴...
华为的这项发明专利提出了一种集边射和端射于一体的波束扫描天线阵列,可用于毫米波通信并应用于5G终端,获得高增益的同时,提供较宽的波束覆盖范围来克服空间的衰减。 随着5G商用逐步走向规模化,作为关键技术之一的毫米波通信凭借其高带宽、低时延等优势成为人们关注的焦点。毫米波通信可最大程度的释放5G的潜能,并推动各行各业的数字化转型,彻底改变...
什么药物可以击败癌症?用什么样的剂量可以获得理想疗效,而不会产生副作用?超过什么极限值之后,有效的药物会产生毒性?在今天,这些问题的解答都离不开采用细胞培养技术的批量检测。它们无疑是医疗研究的重要方法。 使用CYRIS ®FLOX自动检测系统,试验室的工作变得更加简单。在整个试验过程中,FAULHABER电机确保培养液获得足够的营养和药物供给,并...

史海拾趣

问答坊 | AI 解惑

置顶-FPGA基础入门教程之学习板/开发板电路图

@@MAX7132学习板电路图完整版 https://bbs.eeworld.com.cn/thread-50800-1-1.html@@ @@EP2C学习板原理图                  https://bbs.eeworld.com.cn/thread-72861-1-4.html@@ @@xc ...…

查看全部问答∨

【转】电子设计竞赛经验汇总(11楼以后更新获奖团队的成功感言)

本帖最后由 paulhyde 于 2014-9-15 03:22 编辑 竞赛时应该注意的问题: 1、软件与硬件电路最好是同时做,不要前几天都在搞软件,等到最后才来焊板,到时如果出问题都没时间改了,我参加时就是遇到了这种情况。要么也可以在面包板实践下,有人可 ...…

查看全部问答∨

关于BGA封装走线的问题!

再好几个论坛发帖,没人鸟窝 首先说明一下问题 我用的是ad 08 在画一个BGA封装的FPGA板子,看到别人在管脚中间放置焊盘,我也试着做,但是放置好以后,无法布线,老是连不上线,也不知道是什么问题,搜了半天,也没结果,就问问大家,谢谢…

查看全部问答∨

writing_testbenches_2rd 好书分析

replyreload += \',\' + 278416;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答∨

6410 OPEN GL ES 问题

各位, 我在6410上调试三星opengl es的例子。 1.1 和2.0的  exe文件都可以正常运行,但调试三星带的源码时,初始化全部成功,但一运行到glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);时串口就会输出如下错误信息: Exception \' ...…

查看全部问答∨

招聘嵌入式软件工程师

高级软件开发工程师/软件QA. 职位要求: 1、计算机或相关专业本科及以上学历; 2、必需精通C/C++编程; 3、熟悉嵌入式软件开发原则,设计模式及调试技巧; 4、掌握嵌入式操作系统(如Linux, WinCE)平台上的系统及应用程序开发; 5、3年以上嵌 ...…

查看全部问答∨

串口调试

我用串口调试助手 为什么显示的东西是乱码   谢谢…

查看全部问答∨

电容触摸感应原理与应用(3)

7.在有限的IO中扩展按键数量    前面我们讲到两种多按键的处理方法,仔细观察可以发现,这两种处理方法都是基于多个IO的,也就是说有多少个IO我们就能扩展出多少个按键。如果我只有6个可用的IO,那么能不能实现多于6个按键呢?答案是肯 ...…

查看全部问答∨

FPGA实现数据远距离高精度传输(1)

简单的多机间数据通信在我们的设计中很普遍,一般情况下数据传输距离很短,不会超过百十m,因此仅采用双绞线加RS232或RS485标准就可以有效传输。但有时多机之间的距离也会很远,如我们所设计的一个气象项目,就要求子站遍布在基站1km范围内。因此在 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved