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

[求助]采用PLL提速后,A/D转换时间是怎样变化的规律

[求助]采用PLL提速后,A/D转换时间是怎样变化的规律

有两个问题:
1、我采用MC9S12DG128B的片子,晶振是16M的,内部总线频率为8M。通过PLL内部总线频率提升到24M,请问A/D转换时间是否会变为以前的1/3,由于不知道片子上A/D的具体工作原理所以提此问题

2、说明书上写RTI中断可以在固定的周期产硬件中断,请问如果用定时器不是也可以达到此种目的么,为什么又出来个RTI?或者说RTI中断是为了看门狗服务的?请问RTI的主要作用是什么

第二个问题很愚蠢,望高手海涵
第一个问题:ATD模块的时钟源是总线频率,当总线频率提高,AD的转换时间自然会加快。但要注意ATD的最高工作频率不能超过2MHz。
海纳百川  有容乃大
第二个问题:RTI与定时器有很大的差别。首先,RTI功能和结构简单,所以功耗较低,可以用于低功耗状态的定时和唤醒;其次,RTI采用外部时钟作时钟源,所以可以不受总线频率变化的影响,产生固定周期的定时中断;最后,RTI具有很大的分频比,可以很容易产生很长的定时周期。
海纳百川  有容乃大
谢谢版主指教
版主说可以产生很长的定时周期,那么它最长能有多长呢?

#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

static int i;
void DelayNS(int dly)
{ int i;
for(;dly>0;dly--)
for(i=0;i<100;i++);
}

void MCU_init(void)
{
DDRB = 0xFF;
PORTB = 0x0F;

CRGINT =0X00;
RTICTL = 0X7F;
CRGFLG = 0X80;
CRGINT = 0X80;
}


void main(void) {
/* put your own code here */

MCU_init();

EnableInterrupts;

for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTIs1_Interrupt(void)
{

PORTB=i;
i++;
CRGFLG = 0X80;; /* Reset interrupt request flag */
}


以上程序是我根据你的那个程序改的,其中RTICTL寄存器设的值为0x7f,按照说明书上的说明,应该是晶振的16*2^16分频,我采用的是16M晶振,我算了算,中断周期大概在65ms左右,请问版主这是不是最大的中断周期了?还能更大么?
请看《S12CRGV4.pdf》的36页,它前面还有一个1024倍的分频,所以最大中断周期为1024*16*2^16/16=67.108864s。
海纳百川  有容乃大
谢谢版主,但还是有问题,下面是我的程序,我定义了一个变量i,每次进入到RTI中断子程序中都加1,并且在PORTB口输出(我用的是清华的开发工具,PORTB口连着8个LED灯,可以清楚地看到PORTB寄存器的状态);我掐着秒表看了看,当i从0一直累加到255大概是用了17秒,也就是说进入了255次中断有了17秒,平均下来RTI的中断周期也就是66ms左右,但是RTICTL寄存器我设的值为0X7F,已经是最大了,可是也没有达到67.108864s,这是为什么呢?


#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

static int i;

void MCU_init(void)
{
DDRB = 0xFF;
PORTB = 0x0F;

CRGINT =0X00;
RTICTL = 0X7F;
CRGFLG = 0X80;
CRGINT = 0X80;
}


void main(void) {
/* put your own code here */

MCU_init();

EnableInterrupts;

for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTIs1_Interrupt(void)
{

PORTB=i;
i++;
CRGFLG = 0X80;; /* Reset interrupt request flag */
}
你是对的。前面1024倍的分频应该包含在预分频计算值里面了,所以最大分频倍数就是16*2^16。如果你要得到比较大的定时周期,要么用软件实现,要么采用比较低的外部时钟频率,而内部总线频率可采用PLL倍频,得到较高的频率。
海纳百川  有容乃大
谢谢版主指教
没有版主无私的奉献就没有我们这些菜鸟的进步:)
共同进步:))
海纳百川  有容乃大
请问liwei727:你是用BDM下载程序吗?还是用监控程序?
我用的是BDM下载,板子买回来后就把监控程序给擦了,没用监控程序下过
哦,谢谢,我也是刚学DG128,互相学习。
相互学习,共同进步:)
返回列表