MTK平台ADC学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作者: Darren
完成日期: 2010-06-28 Page 1 of 14 e-mail:*******************
目录
1.基本概念 (2)
2.MT6225 ADC简介 (3)
3.MT6253 ADC简介 (3)
4.两种操作模式 (3)
5.用于电池电量显示的ADC检测 (4)
5.1.主要流程图 (4)
5.2.流程说明 (6)
5.3.创建步聚 (6)
6.充电时ADC的检测 (7)
6.1充电时ADC的调度流程 (7)
7.工程模式查看电池电压ADC (8)
8.MT6225平台区分USB和CHARGER的ADC通道 (8)
9.ADC校准 (10)
10.ADC检测的主要API (11)
11.ADC调度器的成员变量 (13)
作者: Darren
完成日期: 2010-06-28 Page 2 of 14 e-mail:*******************
1.基本概念
ADC ,即analog to digital converter,模拟信号至数字信号的转换器。主要的ADC
转换算法有逐次逼近法,双积分法。它们一般由芯片内部的硬件电路实现,但外
部的电路接法会有所不同。MTK平台ADC采样的可使用外部电路:
y=((a*x+b)/100)*factor(如adc_adc2vol()中的算式)
x为ADC采样值,y为测量点的实际电压
如图2所示,(a*x+b)为A点的电压值,((a*x+b)/100)*factor才是我们要测量的
Ui的电压值。由于ADC的量程有限,故需要进行分压才能测量比较大的电压,
之后再根据分压电阻的比值转换成要测量点的电压。
a为每单位表示的电压。MTK的ADC量程为2.8V,ADC为10位的,故
a=2800000/2^10=2734(uV)。通常为了扩大测量范围,需要把a扩大约一倍(记
为a1),之后再通过factor校正。比如变成5524,是原来的2.02倍
b是偏移量,需要测量确定。
每一个ADC都有一组a,b值,在chr_parameter.c bmt_custom_chr_def[]结构体中
的数组ADC_CALIDATA adc_cali_param[]给定
作者: Darren
完成日期: 2010-06-28 Page 3 of 14 e-mail:*******************
factor满足以下等式:factor*(R2+R1)/R1=100*a1/a
a1为adc_cali_param[]中的值,a为2734,R1,R2分压的两个电
2.MT6225 ADC简介
MT6225有7个ADC通道,主要有四个用途:
1.周期性地检测电池状态,vbat
2.充电时不断测量vbat,visense,vtmp,vcharger这四个ADC通道的值
b-charger插入时检测usb的ADC以区分是USB还是charger
4.进入工程模式下的ADC菜单时不断读取电池电压ADC和电流
有两种操作模式:定时触发模式(上述的1,2)和即时触发模式(3,4)
3.MT6253 ADC简介
MT6253有6个ADC通道,0~2通道用于内部:0-电池电压,1—电池电流,2—
充电电压;3~5通道可用于外部电压检测
主要有三个用途(区分usb还是charger不需要ADC):
1.周期性地检测电池状态(即电池电量显示)vbat
2.充电时不断测量vbat,visense,vtmp,vcharger这四个ADC通道的值
3.进入工程模式下的ADC菜单时不断读取电池电压ADC和电流
1和2属于定时触发模式;3为即时触发
4.两种操作模式
定时触发检测和即时触发检测(或称事件触发检测)。
定时触发检测:由AUXADC_CON0(0x8205_0000)寄存器设置,当对应位置
为1时,对应的通道即为定时触发检测模式。如AUXADC_CON0 设为0x3f,则
6个通道均为定时触发检测。定时的时间量在寄存器TDMA_AUXEV1中设置
即时触发检测:由AUXADC_CON1(0x8205_0008)寄存器设置,当对应位置
为1时,对应的通道即为定时检测模式。如AUXADC_CON1 设为0x3f,则6个
通道均为即时触发检测。
作者: Darren
完成日期: 2010-06-28 Page 4 of 14 e-mail:*******************
通道0~5 采样好的ADC值存储在寄存器AUXADC_DAT0(0x8205_0010)
~AUXADC_DAT5(0x8205_0024)中
5.用于电池电量显示的ADC检测
5.1.主要流程图
作者: Darren
完成日期: 2010-06-28 Page 5 of 14 e-mail:*******************
作者: Darren
完成日期: 2010-06-28 Page 6 of 14 e-mail:*******************
5.2.流程说明
在开机进行到一定阶段后,UEM接收到消息
ID(MSG_ID_MED_STARTUP_CNF),接着调度uemaud_startup_cnf_hdlr( ),最终通
过函数uem_init_hardware_data( ),创建用于检测电池电压ADC的通道。此时的
检测时间间隔和次数分别为ADC_BOOTUP_EV AL_PERIOD和
ADC_BOOTUP_EV AL_COUNT。第一次检测完成后,通过函数
uembmt_adc_measure_done_cnf_hdlr( )更新一次电池电量,并将检测时间间隔和
次数改为:ADC_IDLE_EV AL_COUNT,ADC_IDLE_EV AL_PERIOD。之后保持
ADC_IDLE_EV AL_COUNT* ADC_IDLE_EV AL_PERIOD的时间周期完成一次
电池电压ADC的检测并更新电池图标。如果有来电,则在函数
l4cuem_call_status_req_ind( )中将检测周期和次数更改为:
ADC_TALKING_EV AL_COUNT,ADC_TALKING_EV AL_PERIOD;在通话期间
保持这样的周期检测电池电压ADC和更新电池图标。通话结束结束后再把检测
周期和次数更改为ADC_IDLE_EV AL_COUNT,ADC_IDLE_EV AL_PERIOD。
5.3.创建步聚
5.3.1.创建ADC通道:
adc_sche_id = adc_sche_create_object( MOD_UEM, //创建该ADC所属模块
ADC_VBAT, //该ADC通道的物理ID
ADC_BOOTUP_EV AL_PERIOD, //检测时间间隔
(kal_uint8) ADC_BOOTUP_EV AL_COUNT, //检测次数
KAL_TRUE); //是否通过发送消息形式
uem_send_msg_to_bmt(MSG_ID_BMT_ADC_ADD_ITEM_REQ, //消息ID
g_uem_cntx_p->adc_sche_id); //逻辑ID
5.3.2.添加该ADC对应的完成回调函数和检测函数到ADC调度列表中: