历史上的今天
今天是:2025年03月22日(星期六)
2021年03月22日 | 飞思卡尔16位单片机(六)——锁相环测试
2021-03-22 来源:eefocus
一、锁相环介绍
在前面的几个实验中,我们没有涉及到单片机的总线时钟的设置。这是因为飞思卡尔16位单片机在不进行总线时钟设置的情况下默认的总线时钟为外部输入晶振频率的1/2。我们的实验电路中用的外部晶振的频率为16MHz,所以在不设置总线时钟的情况下,总线时钟频率为8MHz。在工程应用中,8MHz的总线频率比较低,XEP100单片机允许总线频率为40MHz,实际测试最高可以运行在80MHz的总线频率下。但不建议设置过高的总线频率,原因之一是频率越高稳定性越差;另外过高的总线频率会影响芯片的寿命。为了获得比较高的总线频率,就需要使用锁相环,通过锁相环(PLL)可以对晶振频率进行倍频,从而形成比较高的总线频率。锁相环模块的功能框图如下图所示

这里只介绍两个比较重要的参数SYNDIV和REFDIV,总线时钟通过这两个参数计算得到,计算公式如下:
其中,是晶振的频率
SYNDIV和REFDIV这两个参数通过设置REFDV和SYNR这两个寄存器中的SYNDIV和REFDIV位进行修改。
二、实例测试
我们通过一个简单的实验来了解锁相环的用法,在本文的资源中,可以下载例程的代码。
代码的主要部分是对锁相环的初始化,代码如下:
#define BUS_CLOCK 80000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
/*************************************************************/
/* 初始化锁相环 */
/*************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //设置OSCCLK作为系统时钟
PLLCTL &= 0x8F; //禁止锁相环
//PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1), fbus=PLLCLK/2
#if(BUS_CLOCK == 120000000)
SYNR = 0xcd;
#elif(BUS_CLOCK == 104000000)
SYNR = 0xcc;
#elif(BUS_CLOCK == 96000000)
SYNR = 0xcb;
#elif(BUS_CLOCK == 88000000)
SYNR = 0xca;
#elif(BUS_CLOCK == 80000000)
SYNR = 0xc9;
#elif(BUS_CLOCK == 72000000)
SYNR = 0xc8;
#elif(BUS_CLOCK == 64000000)
SYNR = 0xc7;
#elif(BUS_CLOCK == 56000000)
SYNR = 0xc6;
#elif(BUS_CLOCK == 48000000)
SYNR = 0xc5;
#elif(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#elif(BUS_CLOCK == 16000000)
SYNR = 0x01;
#endif
REFDV = 0x81;
PLLCTL |=0x70; //使能锁相环
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK锁定
CLKSEL |= 0x80; //设置PLLCLK为系统时钟
}
这段代码比较简单,主要是根据期望的总线频率BUS_CLOCK,对SYNR和REFDV寄存器进行设置,然后通过PLLCTL寄存器使能锁相环,然后等待锁相环工作稳定,最后把单片机的总线时钟源设置为锁相环时钟。
在上面的代码中,我们看到条件判断语句前边都带有“#”,这与不带“#”的条件有什么区别呢?
带“#”的代码称为预处理部分。所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。通俗一些说:预处理命令是由编程软件完成的,而不是有单片机完成的。例如:本实验的代码中定义了BUS_CLOCK为80000000,所以经过编程软件处理之后,最后这段代码等效于SYNR=0xc9;,而不是将这段代码都下载到单片机中。
预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
在程序的主函数中,也比较简单,就是一段闪灯的代码。
将程序下载到单片机中运行,可以看到LED灯快速闪烁。
将程序的主函数中的设置锁相环的语句打双斜线//INIT_PLL();,使此句隐去,即不对锁相环进行设置,此时总线频率为8MHz。然后将程序再次烧写到单片机中运行,可以看到LED灯的闪烁频率明显降低。
史海拾趣
|
Senior FAE Scope Responsible for providing advanced product and system level knowledge relevant for the applications ams are targeting. Working closely with the business units, sales teams, distributors and customers the ro ...… 查看全部问答> |
|
运算放大器在电路中发挥重要的作用,其应用已经延伸到汽车电子、通信、消费等各个领域,并将在支持未来技术方面扮演重要角色。在运算放大器的实际应用中,设计工程师经常遇到诸如选型、供电电路设计、偏置电路设计、PCB设计等方面的问题。在电子工 ...… 查看全部问答> |
|
EVC4.0\wince5下CEdit控件按回退键删除时,CEdit的内容没有更新 就是光标移过来了,但是字符串还有显示在那里,只有删到行头才更新一次,再输入就会和先前的字重叠在一起。 而且是设置多行模式才出现这个问题,单选模式删除显示正常。 我的程序里面有一部分控件是动态创建的,但是我在另外一个程序里面写又正常 ...… 查看全部问答> |
|
第一个程序是:单片机与PC进行通信,用MAX232实现电平转换,所实现功能是下载的功能,即从PC机上传递数据给单片机.这个程序应该怎么写啊? 第二个程序是:DAC0832的程序,所实现功能就是,输出电压..就OK. 我程序实在是 ...… 查看全部问答> |
|
void TIM2_INIT(void) { TIM2_PSCR = 2; /*2分频得到1MHZ的定时器时钟,定时器加1就是1us*/ TIM2_ARRH = 0x27; /*50ms中断一次*/ TIM2_ARRL = 0x10; TIM2_IER = 0x01; /*更新中断使能*/ TIM2_CR1 = 0x81; /*使能计数器*/ } ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:39 编辑 我在用TMS320F206这个芯片做电机控制,它要与PCI9054芯片相连接,但是F206没有HPI接口,这样互连怎样实现,希望得到大家的指点`~谢谢` … 查看全部问答> |




