📄 电池管理及监控设计.htm
字号:
BatteryPDDInitialize、BatteryPDDDeinitialize、BatteryPDDGetStatus、BatteryPDDGetLevels、BatteryPDDSupportsChangeNotification、BatteryPDDPowerHandler、BatteryPDDResume。</FONT></P>
<P><FONT face=宋体> 电池驱动初始化过程</FONT></P>
<P><FONT face=宋体>
在系统上电自检成功后,上层调用电池驱动入口函数,进行电池驱动初始化工作:</FONT></P>
<P><FONT face=宋体>
(1)判断是否已经进行中断事件初始化,如果没有初始化,则进行下面的操作,如果已经进行了一次初始化,则关闭事件句柄。</FONT></P>
<P><FONT face=宋体> (2)初始化电池全局变量。</FONT></P>
<P><FONT face=宋体>
(3)如果中断事件成功,则调用ResumeThreadProc
创建电池线程。在线程的主调函数中,设置电池线程的优先级,然后在循环中等待中断事件。</FONT></P>
<P><FONT face=宋体> (4)调用PDD
层的初始化函数BatteryPDDInitialize;在PDD 层中,为GPIO
寄存器和电源管理寄存器开辟两段虚拟内存。</FONT></P>
<P><FONT face=宋体> (5)初始化AC97
的寄存器。</FONT></P>
<P><FONT face=宋体>
(6)初始化存放电池电量值的环形缓冲区。<BR>
<BR> (7)调用BatteryAPIGetSystemPowerStatusEx2
函数更新电池电量结构体PSYSTEM POWERSTATUS_ EX2 中的数据。</FONT></P>
<P><BR><FONT face=宋体>4. BatteryAPIGetSystemPowerStatusEx
函数</FONT></P>
<P><FONT face=宋体>
BatteryAPIGetSystemPowerStatusEx
函数主要获取系统电源状态值。在执行过程中是通过调用BatteryAPIGetSystemPowerStatusEx2
函数来完成的。而BatteryAPIGetSystemPowerStatusEx2
函数调用BatteryPDDGetStatus 函数以获取电池状态信息,BatteryPDDGetStatus
函数通过调用GetMainBatteryVoltage 获取主电池电压值,通过调用GetPowerDevStatus
获取电池设备状态, 并获取剩余电量的比例值。下图3 为BatteryAPIGetSystemPowerStatusEx
函数调用关系图:</FONT></P>
<P><IMG src="电池管理及监控设计.files/200771013136293.jpg"
border=0><BR><FONT face=宋体>图3 BatteryAPIGetSystemPowerStatusEx
函数调用关系图</FONT></P>
<P><BR><FONT face=宋体>5. CalcMainBatteryVoltage
获取电池电压值</FONT></P>
<P><FONT face=宋体> Bq26220 通过BAT
端口检测电池电源,并且通过寄存器BATH-BATL 传递给上层。这个BATH(地址=0x72——从第0 比特到第2
比特)和BATL 低比特寄存器(地址=0x71——从第0 比特到第7 比特)包含电池电压经过ADC
转换后的结果。这个电压以11 比特、2.44mV 为步长、并带有LSB 的二进制形式表达出来。BATH 寄存器的第3
比特代表MSB,BATL 的第0 比特代表LSB。最大电压测量范围为5V。</FONT></P>
<P><FONT face=宋体> BATH寄存器的第3 比特到第7 比特存储电压ADC
后的偏移量信息,这个最重要的信息比特是在4 比特(第3 比特到第7 比特)偏移数据后的标记比特。</FONT></P>
<P><FONT face=宋体>
LSB获取修正因子,以μV为单位,主控制器负责通LSB获取修正因子和偏移量来测量ADC后的电压值。下面是计算公式:</FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
正确的</SPAN><FONT face=宋体><I><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><I><SPAN
lang=EN-US
style="FONT-SIZE: 7pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">
BAT</SPAN></I><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">=</SPAN><I><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><I><SPAN
lang=EN-US
style="FONT-SIZE: 7pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">
BAT</SPAN></I><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">×(</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">2.44</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">+</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">LSB</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">修正因子)-偏移量</SPAN><I><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt"><o:p></o:p></SPAN></I></FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
计算举例如下:<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
例如:如果真实的</SPAN><FONT face=宋体><SPAN lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">LSB</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">=+</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">2.45mV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">,偏移量=+</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">80mV<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
计算正确的:</SPAN><FONT face=宋体><I><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><I><SPAN
lang=EN-US
style="FONT-SIZE: 7pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">
BAT</SPAN></I><I><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt"><o:p></o:p></SPAN></I></FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><FONT face=宋体><SPAN lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">
LSB</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">修正因子=+</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">10</SPAN><SPAN
style="FONT-SIZE: 12.5pt; FONT-FAMILY: SymbolMT; mso-bidi-font-family: SymbolMT; mso-font-kerning: 0pt">μ</SPAN><I><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">=</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">0.001mV<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
偏移量=+</SPAN><FONT face=宋体><SPAN lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">10</SPAN><SPAN
style="FONT-SIZE: 12pt; FONT-FAMILY: SymbolMT; mso-bidi-font-family: SymbolMT; mso-font-kerning: 0pt">×</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">8mV</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">=</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">80mV<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal
style="TEXT-ALIGN: left; mso-layout-grid-align: none"
align=left><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
正确的</SPAN><FONT face=宋体><I><SPAN lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><I><SPAN
lang=EN-US
style="FONT-SIZE: 7pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">
BAT</SPAN></I><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">=</SPAN><I><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">V</SPAN></I><I><SPAN
lang=EN-US
style="FONT-SIZE: 7pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt">
BAT</SPAN></I><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">×(</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">2.44</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">+</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">0.01</SPAN><SPAN
style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">)-</SPAN><SPAN
lang=EN-US
style="mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt">80</SPAN><I><SPAN
lang=EN-US
style="FONT-SIZE: 12pt; FONT-FAMILY: TimesNewRomanPS-ItalicMT; mso-bidi-font-family: TimesNewRomanPS-ItalicMT; mso-font-kerning: 0pt"><o:p></o:p></SPAN></I></FONT></P>
<P><FONT face=宋体> 程序具体实现流程如下图4:</FONT></P>
<P><IMG src="电池管理及监控设计.files/2007710131324487.jpg"
border=0><BR><FONT face=宋体>图4 CalcMainBatteryVoltage
函数流程图</FONT></P>
<P><BR><FONT face=宋体>6. 电池电量计算方法</FONT></P>
<P><FONT face=宋体>
原来电池电量百分比显示的其实是电压百分比。可是硬件方面测试发现,电池电量和电池电压并非成简单的线性关系,因此需要分区间进行百分比的转换校正。常温下,我们设备获得的电池电压和电量曲线大致如下(图5):</FONT></P>
<P><IMG src="电池管理及监控设计.files/2007710131342353.gif"
border=0><BR><FONT face=宋体>图5 电池电压和电量的关系图</FONT></P>
<P><FONT face=宋体>
在驱动程序中创建了一个为16个字长度的环形缓冲区,采样点数增加为16个,这样可以增加对采样结果的可靠性。电池电压采样值even_samp为16个采样值的和去掉一个最大值和一个最小值后再取平均值。</FONT></P>
<P><FONT face=宋体>
在我们的移动终端设备中,电池的最大电压为559(4.10V),最小电压为455(3.30V),以图5
的两条虚线作为区间的分界线,可分为4.10V~3.80V,3.80V~3.60V,3.60V~3.30V
这三个区间,对电池电压值进行分区间的处理,三个区间上的曲线斜率近似为:</FONT></P>
<P><FONT face=宋体>
4.1V~3.80V:Kl=(100-70)/(4.10-3.80)</FONT></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -