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

A/D转换中的ATD0STAT1问题

A/D转换中的ATD0STAT1问题

HS12中CCFx是不是对应于一个转换序列其中的一个转换的转换标志?它跟SCF的区别?
void AD_Init(void) //初始化
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x20; // 每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x83; // 8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=3, divider=8
ATD0CTL5=0xA0; //右对齐无符号,单通道采样,通道0
ATD0DIEN=0x00; // 禁止数字输入
}
void AD_GetValue(word *AD_wValue) //读取AD转换结果
{
*AD_wValue = ATD0DR0; //Read out the Result Register
}
word AD_wValue;
void main(void) {
word i;
AD_Init(); //AD初始化
DDRB = 0xFF;
PORTB = 0x00;
EnableInterrupts;
for(;;)
{
while(!ATD0STAT1_CCF0); //等待转换结束
AD_GetValue(&AD_wValue); //读取转换结果
PORTB = (byte)AD_wValue; //在B口显示转换值

我想问一下读出的转换结果是哪次的转换结果?ATD0STAT1_CCF0是不是代表第一次的转换标志?

对,CCFx是一个序列中一个通道完成转换的标志,而SCF是整个序列完成转换的标志。
海纳百川  有容乃大
因为FIFO=0,所以转换结果都是放在0结果寄存器,如果我要读取4次转换结果,以下设置对吗?
while(!ATD0STAT1_CCF0); //等待通道0转换结束
AD_wData[0] = ATD0DR0; //读通道0的转换结果
while(!ATD0STAT1_CCF1); //等待通道1转换结束
AD_wData[1] = ATD0DR0; //读通道1的转换结果
while(!ATD0STAT1_CCF2); //等待通道2转换结束
AD_wData[2] = ATD0DR0; //读通道2的转换结果
上面发错了,应该是:

因为FIFO=0,所以转换结果都是放在0结果寄存器,如果我要读取4次转换结果,以下设置对吗?
while(!ATD0STAT1_CCF0); //等待第1次转换结束
AD_wData[0] = ATD0DR0; //读第1次的转换结果
while(!ATD0STAT1_CCF1); //等待第2次转换结束
AD_wData[1] = ATD0DR0; //读第2次的转换结果
while(!ATD0STAT1_CCF2); //等待第3次转换结束
AD_wData[2] = ATD0DR0; //读第3次的转换结果
while(!ATD0STAT1_CCF3); //等待第4次转换结束
AD_wData[3] = ATD0DR0; //读第4次的转换结果


FIFO=0并不是说转换结果都放在结果寄存器0中。如果FIFO=0,那么对于一个序列的转换来说,每个转换通道有一个固定对应的结果寄存器;如果FIFO=1,那么所有的转换结果都是用8个结果寄存器循环放置的,转换通道和结果寄存器不一定是一一对应的。
海纳百川  有容乃大
"如果FIFO=0,那么对于一个序列的转换来说,每个转换通道有一个固定对应的结果寄存器"

能不能具体说一下每个转换通道所对应的结果寄存器??
FIFO=0时,通道0连续4次转换,那它的4次的采样结果放在那里??当它的第一序列完成后,开始下一转换序列的结果又放在那里??
依次放入结果寄存器0~结果寄存器3。一个序列转换完成后,再从结果寄存器0开始存放。
海纳百川  有容乃大
按你这样说,FIFO=0时,通道0连续4次转换,我要读取4次转换结果,那么应该设置如下,对吗?
while(!ATD0STAT1_CCF0); //等待第1次转换结束
AD_wData[0] = ATD0DR0; //读第1次的转换结果
while(!ATD0STAT1_CCF1); //等待第2次转换结束
AD_wData[1] = ATD0DR1; //读第2次的转换结果
while(!ATD0STAT1_CCF2); //等待第3次转换结束
AD_wData[2] = ATD0DR2; //读第3次的转换结果
while(!ATD0STAT1_CCF3); //等待第4次转换结束
AD_wData[3] = ATD0DR3; //读第4次的转换结果
这样应该是可以的,但是你一定要等到读完一个寄存器后在去读另一个,也许会引起FIFO溢出的错误。
海纳百川  有容乃大
void AD_Init(void) //初始化
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x20; // 每个序列4次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x83; // 8位精度, 2个时钟, ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=3, divider=8
ATD0CTL5=0xA0; //右对齐无符号,单通道采样,通道0
ATD0DIEN=0x00; // 禁止数字输入
}
void AD_GetValue(word *AD_wValue) //读取AD转换结果
{
*AD_wValue = ATD0DR0; //Read out the Result Register
}
word AD_wValue;
void main(void) {
word i;
AD_Init(); //AD初始化
DDRB = 0xFF;
PORTB = 0x00;
EnableInterrupts;
for(;;)
{
while(!ATD0STAT1_CCF0); //等待转换结束
AD_GetValue(&AD_wValue); //读取转换结果
PORTB = (byte)AD_wValue; //在B口显示转换值

(1)以上的程序是不是只读了一个序列的第一次转换的结果?

(2)“这样应该是可以的,但是你一定要等到读完一个寄存器后在去读另一个,也许会引起FIFO溢出的错误。”什么意思?那怎样读4次转换??
1)对,你这个程序是只读了一个序列的第一次转换结果。
海纳百川  有容乃大
2)程序改成这样也许会好一些:
while(){
if(ATD0STAT1_CCF0) AD_wData[0] = ATD0DR0; //读第1次的转换结果;
if(ATD0STAT1_CCF1) AD_wData[1] = ATD0DR1; //读第2次的转换结果
if(ATD0STAT1_CCF2) AD_wData[2] = ATD0DR2; //读第3次的转换结果
if(ATD0STAT1_CCF3) AD_wData[3] = ATD0DR3; //读第4次的转换结果
}
海纳百川  有容乃大
对A/D的转换时间有点不理解,可以详解吗???
你可以到飞思卡尔网站下载AN2428看看。
海纳百川  有容乃大
返回列表