热度 20
2015-1-16 10:11
3683 次阅读|
4 个评论
锁相环 由 鉴相 器、环路滤波器 和 压控振荡器 组成。 通常鉴相器 与辅助电路分频器一般集成在一起。想要改变 VCO 的输出频率,则是通过改变分频器的分频比实现。现已 MC145146 PLL 芯片为例,对各寄存器参数配置与输出频率之间的关系做一点总结: 1. 一般结构 如下图所示, PLL 内有三个分频寄存器分别是 R 寄存器 ( 对参考时钟进行分频 ) , N 和 A 寄存器(对输出端 VCO 的频率进行分频),两路分频后的频率 进鉴相 器进行鉴相。锁定时,两路频率应该相等。 通常,在 VCO 频率在进 PLL 芯片之前会先经过一个双模预分频器,有的也集成在 PLL 芯片内。如下图的 ML12034 ,一般可实现 8/9,16/17,32/33,64/65,128/129 等分频,控制分频系数改变的是 PLL 引脚的控制电平,如下图 14 脚 MC 。 2. 频率改变原理 假设 两个鉴相频率 分别为参考源 经过 分频后的 和输出 VCO 频率 经过 分频后的 ,则有 其中, 比较好理解,就是寄存器 R, 而 由下式确定: 其中, N,A 为对应寄存器, P 为预分频器 P/P+1 的分频比。 注意:此处分频可以按照下面的理解: 其工作过程是:首先预分频器工作在 P+1 分频模式下,预分频器输出后同时输入给计数分频器 N 与 A 分频,当 A 计数满后控制预分频器工作在 P 分频模式下, N 继续计数直到满后 N 与 A 同时重置,重新开始。 在图 1 中,可以看出,计数分频器 N 输出鉴相频率 。假设 的周期为 t , 而鉴相 的周期为 T ,可以得到: 因此,分频比 。 总结: 1. 通过 R 、 N 、 A 、 P 控制 VCO 输出频率; 2. 由上式还可以看出, 鉴相频率 VCO 决定了 VCO 输出的步进频率。 3.PLL配置举例 下面以MC145146为例,用TI的430MCU为控制器,对其寄存器进行配置。由于MC145146与MSP430工作电平不同,中间用的TI的4054进行TTL到CMOS的电平转换。 根据MC145146的工作时序以及寄存器的对应关系可以看出,由A2-A0三位地址将A、N、R寄存器分7次写入数据,数据的写入方式为在数据与地址稳定后,由ST引脚的脉冲控制写入。 通过实验验证,下列程序可以对其其寄存器进行正确配置,函数还可以优化,基本原理相同。 /****************************************************** 程序功能:UpFreq 引脚定义:D3-D0:P2.3-P2.0,A2-A0:P2.7-P2.5,ST:P2.4 使用: *******************************************************/ #define CLR_ST P2OUT=~BIT4 //ST #define SET_ST P2OUT|= BIT4 unsigned char A=0x22; // unsigned char N1=0xB2; // unsigned char N2=0x01; // unsigned char R1=0x2C; // unsigned char R2=0x01; // /***************************************************************** 函数名称: WriteReg 返回值 :无 *****************************************************************/ void WriteReg() { unsigned char temp; CLR_ST; temp = A 0x0f; //A取低4位 temp = temp + 0xe0; P2OUT = 0x0f temp; //地址000 SET_ST; CLR_ST; //写入 temp = A 0x70; //A取高3位 temp = temp4; temp = temp + 0xe0; P2OUT = 0x2f temp;//地址001 SET_ST; CLR_ST; //写入 temp = N1 0x0f; //N1取低4位 temp = temp + 0xe0; P2OUT = 0x4f temp; //地址002 SET_ST; CLR_ST; //写入 temp = N1 0xf0; temp = temp4; temp = temp + 0xe0; P2OUT = 0x6f temp;//地址003 SET_ST; CLR_ST; //写入 temp = N2 0x03; //N2取低2位 temp = temp + 0xe0; P2OUT = 0x8f temp; //地址004 SET_ST; CLR_ST; //写入 temp = R1 0x0f; //R1取低4位 temp = temp + 0xe0; P2OUT = 0xaf temp; //地址005 SET_ST; CLR_ST; //写入 temp = R1 0xf0; temp = temp4; temp = temp + 0xe0; P2OUT = 0xcf temp; //地址006 SET_ST; CLR_ST; //写入 temp = R2 0x0f; //R2取低2位 temp = temp + 0xe0; P2OUT = 0xef temp; //地址007 SET_ST; CLR_ST; //写入 }