********************************LoongEmbedded************************
作者:LoongEmbedded(kandi)
时间:2011.02.25
类别:WINCE 驱动开发
********************************LoongEmbedded************************
1. ADC在电池驱动中的应用
1.1 电池检测端口和CPU的硬件接口
图1
1.2 电池驱动中需要使用ADC来转换电池的电压值
下面是电池驱动battif.c中Battery_sampleADC的函数体,这个函数用于对输出的电池电压这个模拟值转换为数字值
图2
下面就来学习这个函数对这些寄存器的设置
⑴ACDMUX
ACDMUX用于选择模拟输入通道,根据图1选择的是AIN0通道,见下图对ACDMUX寄存器的描述
图3
⑵ADCCON
ADCCON是ADC的控制寄存器
图4
我的系统中FCLK=533MHZ,PCLK=FCLK/8,根据下面的公式
图5
根据图2和5,可以算出A/D转换频率=PCLK/(49+1)=FCLK/(8*(49+1))=533/(8*50)=1.3325MHZ,从而计算出一次的A/D转换时间=5*(1/1.3325MHZ)=3.725us。
⑶ ADCDAT0
ADCDAT0是ADC转换数据寄存器,ADCDAT0[9:0]保存着电池电压值经过ADC转换之后的数字值,这里ADCDAT0要和0x3FF进行与运算就是为了取出ADCDAT0[9:0]的值
图6
1.3 KSPS
图7
KSPS(kilo samples per second)表示每秒采样千次,是转换速率的单位,而转换速率(conversion rate)是指完成一次从模拟量到数字量的AD转换所需要时间的倒数。我们知道S3C2443的ADC最大的A/D转换时钟频率是2.5MHZ,所以可以计算出一次A/D转换的时间=5*(1/2.5MHZ)=2us,所以1s中的采样次数=1s/2us=500KSPS,这就是500KSPS的由来。
2. 获取电池状态的函数BatteryPDDGetStatus
电池驱动mdd层的battapi.c下面的函数BatteryAPIGetSystemPowerStatusEx2会定时调用BatteryPDDGetStatus来获取电池的状态,包括是否在充电,电量的百分比等,这些信息就是功过pdd的BatteryPDDGetStatus函数来填充结构体SYSTEM_POWER_STATUS_EX2的成员来告诉mdd层的,这个结构体/WINCE600/PUBLIC/COMMON/SDK/INC/winbase.h中定义,如下:
图8
下面来学习这个结构体的主要的常用的成员的含义
ACLineStatus
用于指示AC电源状态,也就是电池是否在充电
图9
BatteryFlag
表示电池是否在充电以及充电的情况
图10
BatteryLifePercent
表示电池电量所剩的百分比,这个值可以是从0到100,也可以是BATTERY_PERCENTAGE_UNKNOWN的状态,我们的电池的驱动中就有这方面的应用,在充电的时候,如果计算出电池电量小于50%的时候,就不显示电池具体的电量显示,这时候只需要对BatteryLifePercent赋值为BATTERY_PERCENTAGE_UNKNOWN就可以了
图11
图12
图13
图14
S3C2440A的ADC和触摸屏接口
http://blog.sina.com.cn/s/blog_63f980240100kxjx.html
KSPS
http://www.baidu.com/s?wd=KSPS