论坛风格切换切换到宽版
  • 6655阅读
  • 24回复

虚心请教,锁相环锁定后,为什么频率会固定偏差12KHZ。 [复制链接]

上一主题 下一主题
 
发帖
24
只看楼主 倒序阅读 0楼 发表于: 2007-10-31
虚心请教各位前辈了。
  我用的是mb1504,12mhz晶振。在1504的1脚接有3-10p的可调电容,配合示波器,把频率调节到12.0000mhz(示波器的频率测量显示)。

  开始我把基准定在1khz,然后在13脚有1.00013khz(也是示波器显示的)的脉冲。我程序发出的分频数是n=1125,a=10,即要求频率是72.010mhz。但vco电路输出的频率是72.0220(示波器显示的),而且锁的挺稳的。换不同的n和a,都是固定的计算的频率和实际的差了12khz。
  我量了一下14脚,输出的居然是1.9****khz(记不清了),这里也应该是1khz吧?
  后来我把基准改为5khz,13脚有5.00083khz,14脚9.68370khz,vco输出的频率还是和我要的差了12khz。这里我算的n=225,a=2
  请各位前辈帮忙看看,这属于那方面的问题,是电路的还是程序的,我感觉我没算错啊。
  调晶振接的可调电容,可以把偏差减小,但是那样的话2脚的频率就不是12mhz了,而却调节的范围有限,不能把12khz完全的纠正过来。
  我vco电路用的是一级9018振荡,一级9018放大,最后经过一个5p的电容到mb1504的8脚后峰峰值有1v,是不是小了点?
 
  请大家帮忙了,谢谢。
发帖
24
只看该作者 1楼 发表于: 2007-10-31
忘了说了,预置分频我选64。
离线BG7YDO
发帖
3654
只看该作者 2楼 发表于: 2007-10-31
换一下频率,高低都试试。
离线1a2b3c
发帖
204
只看该作者 3楼 发表于: 2007-10-31
先校验一下工具吧,示波器的频率计功能只能用来参考,不能很准确,,先确定工具本身没有错,
然后就是你滩头接到晶体上测量后,如果你探头太抵挡,其阻抗太小或者电容值较大,那么都会在你接上滩头和不接探头其12m就不是一样的了,
1v足够了,看手册
离线bg6qbp
发帖
362
只看该作者 4楼 发表于: 2007-10-31
示波器的频率测量精度不好
你用什么型号的示波器?
用高档的频率计在晶体振荡器的输出脚测.
探头的输入电容可能会引响振荡器的频率.
在线BG2WAH
发帖
619
只看该作者 5楼 发表于: 2007-11-01
共同学习;仅供参考。
用频率计测vco的输出频率,调晶体协振电容;如果真接测晶体两端等于并联了一只电容。
发帖
24
只看该作者 6楼 发表于: 2007-11-01
谢谢大家的回复,问题还是没有找到。我现在把基准定在5khz,然后调晶振旁的可调电容,把偏差调在了+10khz,程序在发分频比的时候a的值减2,最后电路的频率就是我希望的频率了。
  示波器的频率显示基本没有问题,我上午用频谱仪看过了,挺准的。频率锁的也很块,我一按确认键,立刻就跳到我要的频率上了。现在就这样勉强先用着。
 
  因为参数的问题,我的电路频率范围不是很宽,但60m到90m我都试了下,始终是偏了+10khz。

  另外我对锁相环还有2点疑问:
1、锁相环芯片的晶振在选择上有什么讲究吗?我是指在频率上。都是10k的步进,有人用6.25m的,有人用8m的,有人用13m的,为什么啊?
2、锁相环的作用就是将频率“锁住”,可是如果要调制的话,肯定是有频偏的,比如是5khz,可锁相环是要“锁住”频率的啊!那5khz频偏反馈回锁相环芯片的话,肯定是要有反应的,芯片会改变输出电压把频率再拉回设定的值。请问我这样理解是否正确?该如何处理。
在线BG2WAH
发帖
619
只看该作者 7楼 发表于: 2007-11-01
共同学习,仅共参考。
锁相环锁定是需要时间的,如语音的低端约300hz既3.3ms,而锁相环的锁定时间远大于这个值,且频率是围绕中心变化的,也就是说锁相环还没来得急反应。
在线永远的FM
发帖
12119
只看该作者 8楼 发表于: 2007-11-01
你有没有考虑过pll芯片本身问题?
发帖
24
只看该作者 9楼 发表于: 2007-11-01
bg2wah,我用的单片机是16f628,pll控制的程序还是从你的例程改过来的,深表感谢。
    谢谢永远的fm ,考虑过,可手头上只有两片mb1504,都试了,偏差一样。如果是器件本身的问题倒也好,毕竟是固定的,就怕是其他的什么不确定因素,那就麻烦了。
  我是要用在数据传输上,如果遇到多个1(即较长的高电平),那是不是说就没法发了?我感觉我的电路频率变的很快的,从我按下确认键到锁定灯亮,时间不到一秒。
  还有,请问大家都是用什么方法测调制频偏的?因为整个电路是闭环控制,基本不可能靠施加固定的调制电压来测量调制频偏,而如果把pll芯片断开,用电位器,那频率又会慢慢的飘移,分不清那个是调制的频偏,那个是自身的飘移。
离线bg5in
发帖
6640
只看该作者 10楼 发表于: 2007-11-01
能不能给个图看看
在线BG2WAH
发帖
619
只看该作者 11楼 发表于: 2007-11-01
如果你用的是16f628单片机,我很高兴和你共同学习(汇编语言),请把初始化考参频率计数器(除r)及相关寄存器的程序贴出来,共同探讨。
离线ncradio
发帖
11345
只看该作者 12楼 发表于: 2007-11-01
'
能不能给个图看看
'

你想要啥子图?
发帖
24
只看该作者 13楼 发表于: 2007-11-01
list p=16f628a
#include <p16f628a.inc> ;fosc=4mhz
__config _cp_off&_boden_off&_mclre_off&_pwrte_on&_lvp_off&_wdt_off&_intrc_osc_noclkout

cblock 0x20
temp0     ;暂存器0  
temp1     ;暂存器1    
temp2     ;暂存器2  
temp3     ;暂存器3
number     ;频率号码
dis_num     ;要显示的数

h_send     ; 串行数据高8位
m_send     ; 中8位
l_send     ; 低8位
bits       ; 循环计数器
n_l       ; 分频比的低8位
a_cbit     ; 带有控制位的余数。
endc
;--------------------------------------  
#define clk   portb,4 ; 时钟线(mb1504-09)
#define ser   portb,5 ; 数据线(mb1504-10)
#define le   portb,6 ; 锁存线(mb1504-11)
#define r_h   0x2e   ;晶振12mhz,参考频率1khz,
#define r_l   0xe0   ;r=d�'(2ee0h),这里定义好了,以后好改
;*************************************************
  org     0x00
  goto   start
;********************************************************
  org     0x0014
;********************************************************
lookupa_cbit
    addwf pcl,f
    dt   14h,60h,50h
;--------------------------------------
lookupn_l
    addwf   pcl,f
    dt   01h,6dh,e2h
;********************************************************
start      
     banksel option_reg   ;bank1
     movlw      b�'   ;rb上拉,内部时钟,分频器给狗
     movwf      option_reg ;
;--------------------------------------
     movlw      b�'   ;a口4、5输入其余输出      
     movwf      trisa
;--------------------------------------
     movlw      00h       ;b全输出            
     movwf      trisb
;--------------------------------------
     banksel cmcon         ; bank0
     movlw      b�'     ;比较器关            
     movwf      cmcon
     clrf     porta
     clrf     portb
        movlw   dƆ'       ;取0是65.610mhz
                          ;取1是72.560mhz
                          ;取2是80.040mhz
        movwf   number
        call     pll
        goto   $
;*************************************************
pll
  movf   number,w
  call     lookupn_l
  movwf   n_l
  movf   number,w
  call     lookupa_cbit
  movwf   a_cbit
  call     send_r
  call     send_na
  return
;*************************************************
;参考频率固定,一次性的带控制位发送出去。
;晶振12mhz,参考频率1khz,r=d�'(2ee0h)
;选预置的64分频sw=0
;控制位cbit=1
;不直接赋值是为了以后好改r。
;*************************************************
send_r
  movlw     r_h
  movwf     h_send
  movlw     r_l
  movwf     m_send
;--------------------------------------  
  bcf   status,c   ;c清0
  rlf   m_send,f   ;从低位开始左移
  rlf   h_send,f   ;把首、 尾的2位让出来给sw和cbit
  bsf   m_send,0   ;cbit=1,
                  ;选64预分频,sw=0,数据中此位本身已经是0了,不动
  clrf l_send     ;不用的l_send清0
;--------------------------------------  
  movlw dཌ'     ;发16位
  movwf   bits
  call     start_send ;开始发
  nop         ;粗略预计共用时340us
  return
;*************************************************  
;发送分频比n和吞吐脉冲数a(就是余数)
;n的高位是固定的04h,低位查表(偷个懒,不想写计算程序了,反正也不多)
;低位在n_l里
;a_cbit里是对应的余数,已经把cbit含在里面,整好构成8位。
;
;*************************************************  
send_na
  movf     a_cbit,w
  movwf   l_send
  movf     n_l,w
  movwf   m_send
  movlw   0x04
  movwf   h_send
;--------------------------------------
  ;数据整理,第19位顶到头,要左移5次
  bcf   status,c   ;c清0
  movlw dƋ'
  movwf bits
loop
  rlf   l_send,f   ;从低位开始左移
  rlf   m_send,f   ;
  rlf   h_send,f
  decfsz bits,f   ;结束
  goto   loop     ;否, 继续
;--------------------------------------  
  movlw dཏ'     ;发19位
  movwf bits
  call start_send ;开始发
  nop         ;粗略预计共用时400us
  return
;*************************************************
;mb1504数据发送子程序;串行输入,高位在前
;高位开始左移发送
;*************************************************
start_send
  bcf   ser ; 数据线=0
  bcf   status,c ; c=0
  rlf   l_send,f ;从低位开始左移
  rlf   m_send,f ;
  rlf   h_send,f ;最高位移到c里,输出1bit
  btfsc status,c ;查询, 数据为0?
  bsf   ser     ;否
  fill 0x0,7   ;延时7us
  bsf   clk     ;时钟线,上升沿clk=1
  fill 0x0,7   ;时钟脉冲维持7us
  bcf   clk     ;
;--------------------------------------
  decfsz bits,f     ;结束(已发送16/19bit)?
  goto   start_send   ;否, 继续
  fill   0x0,5   ;
  bsf   le     ;le=1,锁存
  fill   0x0,7   ;le脉宽维持7us
  bcf   le     ;
  return
;************************************************
end
发帖
24
只看该作者 14楼 发表于: 2007-11-01
这是我开始的时候用来检测电路的程序。因为我写程序习惯于以一个模板开始,将需要的功能逐渐的加进去(加子程序),程序有时不是一个时间写的(比如初始化程序是一年前写的,pll程序是刚写的),所以会同时出现大小写。考虑到汇编的可读性本来就差,而我也没想过要给别人看,所以在注释和大小写上没有太仔细。
 
  关于如何控制和测量调制的频偏还请大家多说说,谢谢。
在线BG2WAH
发帖
619
只看该作者 15楼 发表于: 2007-11-02
软件上未发现什么问题,还是从硬件着手吧;建议:mb1504第2脚对地接30p电容,第1脚对地接10/35p的微调电容;测量频偏要借助专用仪器。
本主题包含附件,请 登录 后查看, 或者 注册 成为会员
离线bg5kw
发帖
530
只看该作者 16楼 发表于: 2007-11-02
'
你想要啥子图?
'
电路图啊.mb1504的外部电路
离线1a2b3c
发帖
204
只看该作者 17楼 发表于: 2007-11-02
首先,参考晶体是个关键的不得了的东西,一是准确度二是稳定度,就是12m,就必须是12m,不要有误差,稳定就是随时都要是12m,这些当然都是理论和希望了。
现在简单计算一下,你晶体是12m,输出是60m的话,假如你晶体本身电容啊什么的没有调到12m,假如差了一khz,那么等效到60m上面就差了5k了,所以严重性不言而喻。

另外调制的话,你是切如点在什么地方,看你的估计想做fsk调制,那么几个办法,一是直接控制晶体,就是让晶体随着你的数据做12m左右的变化,这个变化可以较小,而在输出端就对应扩大了,假如你要5k频偏,那么你可以想办法让晶体变化1k,比如用变容管放来代替谐振电容,
还有就是可以在环路上调制,就是把你的信号叠加到vco的控制电压上去,那么就很显然的改变频率了是吧,
至于第一种方法,pll不会知道,他始终认为是12m的准确参考,第二种就是靠响应等
另外对于长1或0,就采用数学方法,比如进行满切撕特编码等就ok,
发帖
24
只看该作者 18楼 发表于: 2007-11-02
太有道理了,我怎么就没想到在晶振那调制呢?我做的就是fsk,只发1和0,这样做的话电路能省好多事的,还容易测量和调试频偏。
  下午我就试试。
  可是,这样做有成功的先例吗?我手头上的资料里没有看到有谁是这样做的啊!尤其是其中有两个是和我一样功能的电路,用的也是直接在vco电路里调?凡事总有个利弊的吧!
离线child@BY1QH
发帖
1303
只看该作者 19楼 发表于: 2007-11-02
[quote=飞行无极限]太有道理了,我怎么就没想到在晶振那调制呢?我做的就是fsk,只发1和0,这样做的话电路能省好多事的,还容易测量和调试频偏。
  下午我就试试。
  可是,这样做有成功的先例吗?我手头上的资料里没有看到有谁是这样做的啊!尤其是其中有两个是和我一样功能的电路,用的也是直接在vco电路里调?凡事总有个利弊的吧![/quote]

考虑环路滤波器的时间常数。
数据速率快,就直接在vco上调。
反之,直接控制晶振,或者控制分频比。