[讨论]请教一个关于MC9S12DG128的AD采样的问题
 
- UID
- 344045
- 性别
- 男
|
[讨论]请教一个关于MC9S12DG128的AD采样的问题
数据书上说,一旦对ATDCTL5赋值以后,ATD模块将重新开始采样,采样结束后,ATD0STAT0_SCF标志位置1。
我的程序是这样的:
main()
{
……
ADInit();//AD初始化
……
while(1) //死循环
{
程序1;
程序2;
……
ATD0CTL5 = 0X90;
while(ATD0STAT0_SCF == 0)
{
asm nop; //*
}
//存储采样数据
Data[i++] = ATD0DR0;
…………
程序n;
}//end of while(1)
}
现在在用P&E仿真器调试时候发现,先让程序全速运行,然后在任意时候让程序停止一段时间(大概也就几秒钟吧),再次全速运行,就会出现程序一直死在 * 位置,也就是这时候ATD0STAT0_SCF一直是0。不明白为什么会这样,因为程序再次运行以后肯定要先执行ATD0CTL5 = 0x90;这句话,重新启动AD采样并且采样完成后,ATD0STAT0_SCF不是会自动置1吗?还是P&E仿真器问题? |
|
|
|
|
|
 
- UID
- 344045
- 性别
- 男
|
void AdInit(void)
{
ATD0CTL2_ADPU = 1 ;//ATD0启动
delay_100us();
ATD0CTL3 = 0x40 ;//ATD0: 8个采样通道
ATD0CTL4 = 0X61 ;//SRES8=0 : 10位转换模式
//SMP1=SMP0= 1 : 16个采样时钟周期
//PRS[4:1] = 00001 : ATD0CLOCK = 2MHz
} |
|
|
|
|
|
 
- UID
- 344045
- 性别
- 男
|
我的系统时钟是 10MHz,ATD时钟设置成 2M,属于临界状态吧,这样会使 ATD 不稳定吗? |
|
|
|
|
|
 
- UID
- 344045
- 性别
- 男
|
void AdInit(void)
{
ATD0CTL2_ADPU = 1 ; //ATD0启动
Delay_100us(); //延时100us
ATD0CTL3 = 0x40 ; //ATD0: 8个采样通道
ATD0CTL4 = 0x62 ; //SRES8=0 : 10位转换模式 //SMP1=SMP0= 1 : 16个采样时钟周期
//PRS[4:1] = 00001 : ATD0CLOCK = 2MHz
ATD0DIEN = 0x00; //禁止数字信号输入到ATD0中
ATD0CTL2_AFFC = 1; //设置当访问AD结果寄存器时,自动清除CCF标志位(AD完成标志位)
}
对不起,刚才的AD初始化程序发错了,应该是这个~ |
|
|
|
|
|
 
- UID
- 344045
- 性别
- 男
|
是总线时钟,我用4Mhz晶振,然后将频率提升到20M,总线时钟 = 20 / 2 = 10MHz
用示波器测过,总线时钟是10MHz没错~ |
|
|
|
|
|