标题:
A/D转换中的ATD0STAT1问题
[打印本页]
作者:
vincent85
时间:
2008-3-14 17:19
标题:
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是不是代表第一次的转换标志?
作者:
strongchen
时间:
2008-3-14 17:46
对,CCFx是一个序列中一个通道完成转换的标志,而SCF是整个序列完成转换的标志。
作者:
vincent85
时间:
2008-3-14 18:11
因为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的转换结果
作者:
vincent85
时间:
2008-3-14 18:17
上面发错了,应该是:
因为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次的转换结果
作者:
strongchen
时间:
2008-3-17 10:38
FIFO=0并不是说转换结果都放在结果寄存器0中。如果FIFO=0,那么对于一个序列的转换来说,每个转换通道有一个固定对应的结果寄存器;如果FIFO=1,那么所有的转换结果都是用8个结果寄存器循环放置的,转换通道和结果寄存器不一定是一一对应的。
作者:
vincent85
时间:
2008-3-17 23:32
"如果FIFO=0,那么对于一个序列的转换来说,每个转换通道有一个固定对应的结果寄存器"
能不能具体说一下每个转换通道所对应的结果寄存器??
作者:
vincent85
时间:
2008-3-18 01:05
FIFO=0时,通道0连续4次转换,那它的4次的采样结果放在那里??当它的第一序列完成后,开始下一转换序列的结果又放在那里??
作者:
strongchen
时间:
2008-3-18 11:31
依次放入结果寄存器0~结果寄存器3。一个序列转换完成后,再从结果寄存器0开始存放。
作者:
vincent85
时间:
2008-3-18 12:18
按你这样说,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次的转换结果
作者:
strongchen
时间:
2008-3-18 17:13
这样应该是可以的,但是你一定要等到读完一个寄存器后在去读另一个,也许会引起FIFO溢出的错误。
作者:
vincent85
时间:
2008-3-18 17:21
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次转换??
作者:
strongchen
时间:
2008-3-19 09:56
1)对,你这个程序是只读了一个序列的第一次转换结果。
作者:
strongchen
时间:
2008-3-19 10:01
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次的转换结果
}
作者:
vincent85
时间:
2008-3-19 10:04
对A/D的转换时间有点不理解,可以详解吗???
作者:
strongchen
时间:
2008-3-19 10:09
你可以到飞思卡尔网站下载AN2428看看。
作者:
roby18
时间:
2008-3-21 18:47
上面说的“FIFO=0并不是说转换结果都放在结果寄存器0中。如果FIFO=0,那么对于一个序列的转换来说,每个转换通道有一个固定对应的结果寄存器;如果FIFO=1,那么所有的转换结果都是用8个结果寄存器循环放置的,转换通道和结果寄存器不一定是一一对应的。”
是不是这个意思:FIFO=1的时候,第一个转换的结果由序列的第一个通道决定,即由CC CB CA 决定,之后就按结果寄存器递增存放?
能不能在FIFO=0和1的时候具体举个例子,谢谢
作者:
roby18
时间:
2008-3-24 20:01
请版主指教
作者:
strongchen
时间:
2008-3-25 10:59
对,FIFO=1时,第一个转换的结果保存在结果寄存器0中,而第一个转换的通道由CC CB CA决定,之后就按结果寄存器顺序递增存放,一直存放到结果寄存器7,然后再从0开始。而当前是哪个通道完成了转换,可由CCFx标志来查询;结果存入哪个寄存器,可由CC2 CC1 CC0来查询。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0