标题:
奇了怪,AD转换突然不能用了
[打印本页]
作者:
ikvc-7
时间:
2007-7-9 11:31
标题:
奇了怪,AD转换突然不能用了
我用的是DG128B的最小系统开发板,前2天AD转换功能还能正常工作,今天突然不行了,程序应该没问题,用AD功能测量电压,通过与PC通讯,对于所有测量电平(0~5v),打印出来的AD值全都为0XFF,即全都是5V,硬件电路没有改动过,真是找不出问题所在,还望高手指点指点!!!
作者:
strongchen
时间:
2007-7-9 11:44
看看AD的电源和参考电压信号是否正常。
作者:
ikvc-7
时间:
2007-7-9 15:43
测量了一下电压 :VRH=4.95V.VRL=0.03V,VDDA=4.1V,VSSA=0V以前也是在这种电压状况下工作的,都没问题,今年天就不行了.
我用的是查询方式显示转换值,只有测电压才能显示,现在是只要我一给单片机上电,没让它测电压,它不停的在PC上输出0XFF,附上程序:
void Init_AD(void){
ATD1CTL2 = 0XC0; //AD模块上电,快速清零,无等待模式,禁止外部触发,中断禁止
ATD1CTL3 = 0X20; //每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD1CTL4 = 0X83; //8位精度, 2个时钟, 时钟1.5MHZ
ATD1CTL5 = 0xA0; //右对齐无符号,单通道采样,通道0
ATD1DIEN = 0x00; // 禁止数字输入
}
查询方式采样:
if(ATD1CTL2_ASCIE == 0){
while(!ATD1STAT1_CCF0); //等待通道0转换结束
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data); //在PC上打印转换值
SCI0_OutString("\n\r");
}
感觉好像是ATD1STAT1_CCF0一直为0,才出现这种情况,可我以前用这个程序咋就没问题呢?
作者:
strongchen
时间:
2007-7-9 16:55
首先,VRH的值应该低于VDDA。另外,你可以在程序里设个断点看一下,CCF0是否一直为0。还有,CCF0为1才是转换完成标志。你这样判断肯定是有问题的。
作者:
ikvc-7
时间:
2007-7-9 17:55
我直接将系统板接到5V变压器上,VRH=VCCA=4.98V,然后,我的采样程序改为:
if(ATD1CTL2_ASCIE == 0){
SCI0_OutUHex(ATD1STAT1_CCF0); //打印出ATD1STAT1_CCF0的值
SCI0_OutString("\n\r");
while(!ATD1STAT1_CCF0); //等待通道0转换结束
AD_Data = ATD1DR0;
SCI0_OutUHex(ATD1STAT1_CCF0); //打印出ATD1STAT1_CCF0的值
SCI0_OutString("\n\r");
}
在 while(!ATD1STAT1_CCF0); //等待通道0转换结束 这一句前打印出的ATD1STAT1_CCF0的值为1,在这一句后ATD1STAT1_CCF0的值为0 ,但是AD转换值输出一直还是OXFF,还有,如果
while(!ATD1STAT1_CCF0); 这一句判断有问题,哪将如何判断,还请版主告诉我,谢谢!
作者:
strongchen
时间:
2007-7-10 10:53
改成while(ATD1STAT1_CCF0);
作者:
ikvc-7
时间:
2007-7-10 11:26
ATD1STAT1_CCF0:
1 = ATD10通道AD转换完成,结果存放在ATD1DR0;
0 = ATD10通道转换没有完成
我认为 while(!ATD1STAT1_CCF0); 没有错误
而且我刚刚照你说的改:while(ATD1STAT1_CCF0);只输出了一个0,也就是ATD1STAT1_CCF0的值,进行AD测量,没有AD值输出;
应该是硬件出问题了吧,我这里有3块系统板都出现了这种问题
作者:
strongchen
时间:
2007-7-10 13:46
你改成不用快速清零的方法试试。
作者:
ikvc-7
时间:
2007-7-10 15:07
改为手动清零:ATD1CTL2 = 0X80;
采集程序: { while(!ATD1STAT1_CCF0); //等待通道0转换结束
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data);
SCI0_OutString("\n\r");
ATD1STAT1_CCF0 = 0; }
还是老样子,就算不测量,AD转换值一直输出0XFF,测量0V时,AD值一直在跳变,
硬件电路重来没有改动过,是不是芯片坏了?
作者:
strongchen
时间:
2007-7-10 16:00
手动清零的方法是先读ATD1STAT1,紧接着读转换结果寄存器,并不是ATD1STAT1_CCF0 = 0指令。如果还是不行,有可能是芯片坏了。
作者:
ikvc-7
时间:
2007-7-10 16:46
程序改为: if(ATD1STAT1_CCF0 == 1 ){
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data);
SCI0_OutString("\n\r");
ATD1STAT1_CCF0 = 0;
}
还是老样子,看来时芯片坏了,我这里有3块这样的板子了,飞思卡尔不是这么容易坏吧???
作者:
strongchen
时间:
2007-7-10 17:33
你是一共只有3块板子呢,还是有其他的板子是好的?如果没遇到特殊的情况,3块板子同时坏掉的可能性不大。把整个project贴处理看看吧。
作者:
ikvc-7
时间:
2007-7-10 17:51
#include
/* common defines and macros */
#include
/* derivative information */
#include "sci.h"
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
unsigned short AD_Data=0;
void Init_AD(void){
ATD1CTL2 = 0X80; //AD模块上电,无快速清零,无等待模式,禁止外部触发,中断禁止
ATD1CTL3 = 0X20; //每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD1CTL4 = 0X83; //8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=3, divider=8
ATD1CTL5 = 0xA0; //右对齐无符号,单通道采样,通道0
ATD1DIEN = 0x00; // 禁止数字输入
}
void main(void) {
/* put your own code here */
DDRB = 0xBF;
PORTB = 0x0f;
Init_AD();
SCI0_Init(9600);
EnableInterrupts;
for(;;) {
if(ATD1CTL2_ASCIE == 0){
//while(!ATD1STAT1_CCF0); //等待通道0转换结束
if(ATD1STAT1_CCF0 == 1 ){
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data);
SCI0_OutString("\n\r");
ATD1STAT1_CCF0 = 0;
}
}
//SCI0_OutString("asdsfasdfsdf");
//SCI0_OutString("\n\r");
//读通道0的转换结果
//采用查询方式
} /* wait forever */
/* please make sure that you never leave this function */
}
真是太让人莫明其妙了!!!
作者:
strongchen
时间:
2007-7-11 10:49
你是一共只有3块板子呢,还是有其他的板子是好的?如果没遇到特殊的情况,3块板子同时坏掉的可能性不大。把整个project贴处理看看吧。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0