首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

奇了怪,AD转换突然不能用了

奇了怪,AD转换突然不能用了

我用的是DG128B的最小系统开发板,前2天AD转换功能还能正常工作,今天突然不行了,程序应该没问题,用AD功能测量电压,通过与PC通讯,对于所有测量电平(0~5v),打印出来的AD值全都为0XFF,即全都是5V,硬件电路没有改动过,真是找不出问题所在,还望高手指点指点!!!
看看AD的电源和参考电压信号是否正常。
海纳百川  有容乃大
测量了一下电压 :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,才出现这种情况,可我以前用这个程序咋就没问题呢?
首先,VRH的值应该低于VDDA。另外,你可以在程序里设个断点看一下,CCF0是否一直为0。还有,CCF0为1才是转换完成标志。你这样判断肯定是有问题的。
海纳百川  有容乃大
我直接将系统板接到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); 这一句判断有问题,哪将如何判断,还请版主告诉我,谢谢!

改成while(ATD1STAT1_CCF0);
海纳百川  有容乃大
ATD1STAT1_CCF0:
1 = ATD10通道AD转换完成,结果存放在ATD1DR0;
0 = ATD10通道转换没有完成

我认为 while(!ATD1STAT1_CCF0); 没有错误
而且我刚刚照你说的改:while(ATD1STAT1_CCF0);只输出了一个0,也就是ATD1STAT1_CCF0的值,进行AD测量,没有AD值输出;
应该是硬件出问题了吧,我这里有3块系统板都出现了这种问题
你改成不用快速清零的方法试试。
海纳百川  有容乃大
改为手动清零:ATD1CTL2 = 0X80;

采集程序: { while(!ATD1STAT1_CCF0); //等待通道0转换结束
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data);
SCI0_OutString("\n\r");
ATD1STAT1_CCF0 = 0; }
还是老样子,就算不测量,AD转换值一直输出0XFF,测量0V时,AD值一直在跳变,
硬件电路重来没有改动过,是不是芯片坏了?
手动清零的方法是先读ATD1STAT1,紧接着读转换结果寄存器,并不是ATD1STAT1_CCF0 = 0指令。如果还是不行,有可能是芯片坏了。
海纳百川  有容乃大
程序改为: if(ATD1STAT1_CCF0 == 1 ){
AD_Data = ATD1DR0;
SCI0_OutUHex(AD_Data);
SCI0_OutString("\n\r");
ATD1STAT1_CCF0 = 0;
}
还是老样子,看来时芯片坏了,我这里有3块这样的板子了,飞思卡尔不是这么容易坏吧???
你是一共只有3块板子呢,还是有其他的板子是好的?如果没遇到特殊的情况,3块板子同时坏掉的可能性不大。把整个project贴处理看看吧。
海纳百川  有容乃大
#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 */
}
真是太让人莫明其妙了!!!
你是一共只有3块板子呢,还是有其他的板子是好的?如果没遇到特殊的情况,3块板子同时坏掉的可能性不大。把整个project贴处理看看吧。
海纳百川  有容乃大
返回列表