电池电压AD采样不稳定

还没想好写什么 2010-03-17 08:44:09
我的是手持机,需要AD 采样电池电压,现在发现我的 AD采样很不稳定,我是连续采了10次去掉最大最小求平均的~,结果值还是跳来跳去~~~~怎么回事啊
...全文
2450 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdlhh2008 2010-08-24
  • 打赏
  • 举报
回复
在AD中断中多次采样并带间隔的采样?好似同一电压采集多次平均值都不同的?不知道哪位大侠有没遇到过该类似问题?可否提供些解决资料的?我的邮箱:786961163@qq.com 先谢过啦
  • 打赏
  • 举报
回复
是不是采用速率太快的问题呢?
sunrain_hjb 2010-03-21
  • 打赏
  • 举报
回复
如果是触摸对电池电压的影响,那么在不点击触摸屏时电池电压应该还是稳定的。
如果电池电压一直不稳定,那说明跟触摸的关系不大。
如果怀疑采样速率过高,那可以降低一些看看。
sunrain_hjb 2010-03-18
  • 打赏
  • 举报
回复
如果用示波器看得很平稳,那大概能说明是驱动层的问题了。
  • 打赏
  • 举报
回复
用示波器看电池电压也很平稳
OneOnce 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lth93 的回复:]
参考电压很稳,AD和触摸屏共用,但是我加了互斥,现在不冲突了,莫非能造成不稳定??
[/Quote]


最好再仔细看看,之前2450、2440、6410都遇到过ADC和触摸有影响。
  • 打赏
  • 举报
回复
走线很长很细,不过个人认为不会影响,加了滤波电容
  • 打赏
  • 举报
回复
参考电压很稳,AD和触摸屏共用,但是我加了互斥,现在不冲突了,莫非能造成不稳定??
  • 打赏
  • 举报
回复

DWORD ReadAdc(unsigned char ch)
{
int i;
unsigned short rCON,rTSC;

ch = ch & 0x07; // 参数过滤



rCON = v_ADPregs->ADCCON;
rTSC = v_ADPregs->ADCTSC;

// PRSCEN=1,使能分频器
// PRSCVL=(PCLK/ADC_FREQ - 1),即ADC转换时钟为ADC_FREQ
// SEL_MUX=ch,设置ADC通道
// STDBM=0,标准转换模式
// READ_START=0,禁止读(操作后)启动ADC
// ENABLE_START=0,不启动ADC
v_ADPregs->ADCCON = (1<<14)|((25 - 1)<<6)|(ch<<3)|(0<<2)|(0<<1)|(0<<0);
v_ADPregs->ADCTSC = 0;//v_ADPregs->ADCTSC & (~0x03); // 普通ADC模式(非触摸屏)
for(i=0; i<100; i++);

v_ADPregs->ADCCON = v_ADPregs->ADCCON | (1<<0); // 启动ADC
while(v_ADPregs->ADCCON & 0x01); // 等待ADC启动
while(!(v_ADPregs->ADCCON & 0x8000)); // 等待ADC完成

v_ADPregs->ADCCON = rCON;
v_ADPregs->ADCTSC = rTSC;

return (v_ADPregs->ADCDAT0 & 0x3ff); // 返回转换结果
}

//////////////////////////
DWORD average(DWORD *p )
{
DWORD i,s=0;
DWORD MAX,MIN;
MAX = 0x0;
MIN = 0xffff;
for(i=0;i<10;i++)
{
if(MAX<p[i])
MAX = p[i];
if(MIN>p[i])
MIN = p[i];
}

for(i=0;i<10;i++)
{
s += p[i];
}

i = (s-MAX-MIN)/8;
return i;
}

///////////////////////////////////////////////////////////////////////
BOOL WINAPI
BatteryPDDGetStatus(
//PSYSTEM_POWER_STATUS_EX2 pstatus,
PSYSTEM_POWER_STATUS_EX2 sps,
PBOOL pfBatteriesChangedSinceLastCall
)
{
DWORD i,BatVol,Bat[10]; // 电池电压
BOOL fOk = TRUE;
SETFNAME(_T("BatteryPDDGetStatus"));

DEBUGMSG(ZONE_PDD, (_T("%s: invoked w/ sps 0x%08x, pfChange 0x%08x\r\n"),
pszFname, sps, pfBatteriesChangedSinceLastCall));

PREFAST_DEBUGCHK(gpStatus != NULL);
PREFAST_DEBUGCHK(sps != NULL);
PREFAST_DEBUGCHK(pfBatteriesChangedSinceLastCall != NULL);



for(i=0;i<10;i++)
{
if(hMutex)
{
WaitForSingleObject(hMutex, INFINITE); //修改为永远等待
}

Bat[i] = ReadAdc(3); //电池采样通道

if(hMutex)
{
ReleaseMutex(hMutex);
}
}

BatVol = average(Bat);

sps->BatteryFlag = BATTERY_FLAG_HIGH;
sps->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN;

//sps->BatteryLifePercent = BatVol/100;//((BatVol-4096/2)*100)/(4096*(2.1/3.3-0.5));
if(BatVol<512)BatVol = 512;
sps->BatteryLifePercent = ((BatVol-512)*100)/140;


if(sps->BatteryLifePercent>=80)sps->BatteryFlag = BATTERY_FLAG_HIGH;
if(sps->BatteryLifePercent<=40)sps->BatteryFlag = BATTERY_FLAG_CRITICAL;
else sps->BatteryFlag = BATTERY_FLAG_LOW;


// get battery status information from the shared structure
LockBattery();
//memcpy(pstatus, &gpStatus->sps, sizeof(*pstatus));
memcpy(&gpStatus->sps, sps, sizeof(*sps));
*pfBatteriesChangedSinceLastCall = gpStatus->fChanged;
if(*pfBatteriesChangedSinceLastCall) {
gpStatus->fChanged = FALSE; // reset changed flag if it's set
}
UnlockBattery();

DEBUGMSG(ZONE_PDD, (_T("%s: returning %d\r\n"), pszFname, fOk));
return (fOk);
}


  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sunrain_hjb 的回复:]
如果用示波器看得很平稳,那大概能说明是驱动层的问题了。
[/Quote]驱动层就是一个AD采样,然后把计算结果送给BatteryLifePercent下面附上源代码
dding 2010-03-17
  • 打赏
  • 举报
回复
感觉是你的每次AD采样都不准导致你求平均值之后依然是不准的
1、参考电压是否干净
2、AD走线是不是有干涉
3、AD的资源是否被共用了
FrankBIBI 2010-03-17
  • 打赏
  • 举报
回复
MAKE,这个好~顶~
kyzf 2010-03-17
  • 打赏
  • 举报
回复
一般你首先得关注下你的ADC对应的参考电压;
然后看下对应的电池分压电路的电阻设置?最好用M级的1%误差的电阻;
再就是看下 你对应的算法,看你的采集数值 被放大多少倍?审核下自己的算法是否有问题吗?

最后注意你的电池如果被大电流放电(即有需要大电流的负载在工作),此时电池电压就会有点波动大。
如果不是这样,那就应该不会波动太大,
LaiQingXiong 2010-03-17
  • 打赏
  • 举报
回复
我的没有这个情况,我的也是2440 自带AD做的。呵呵。
很顺利,没有学到东西。
domworldjohn 2010-03-17
  • 打赏
  • 举报
回复
你看一下AD的电路接好没有,它的标准电压有没有对。AD取平均之后实际上还是有一定幅度波动的,但是波动的幅度不会太大。
lucasma.eth 2010-03-17
  • 打赏
  • 举报
回复
估计是硬件问题,测一下你的参考电压稳不稳.
老人参 2010-03-17
  • 打赏
  • 举报
回复
看一下波形,

一般都是电路设计上 产生谐振造成的,

加一个103 或者 104电容,看看效果吧,

不如果电路谐振了,说明你设计的问题,硬件上只能加一个电容,软件上可以用算法来滤掉,



sunrain_hjb 2010-03-17
  • 打赏
  • 举报
回复
你也可以用示波器测一下电池电压做一个比较。
sunrain_hjb 2010-03-17
  • 打赏
  • 举报
回复
建议你先把该AD引脚接至VCC上做一个测试,如果采样值也不准,说明可能是驱动有问题。如果没有问题的话,说明是AD电路有问题或者电池本身电压就不稳。
tcdzyq 2010-03-17
  • 打赏
  • 举报
回复
采样值跳变范围有多大。信号是否本身就是跳的。AD读取时序是否正确。

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧