1. 对于电机的锁相控制,需要对相差进行PI性质的环路滤波,但现有的锁相环中鉴频鉴相器输出为相差脉冲而非数字量,难以直接进行PI特性的环路滤波。

通过对晶振的非整数分频获取准确的参考时钟,基于触发器机制实现了PFD相差脉冲的数字量化,且可以输出频差数字量。锁相环是频率和相位的同步控制系统,实现输入参考信号和反馈信号的频率相等,相位差恒定。利用锁相环技术可实现数字信号的同步,将这个思想引入电机的速度控制系统中,则能够实现稳态精度很高的转速控制。综合起来就是电机转速的控制反馈系统,因为要求相位差恒定,所以需要准确的检测相位差,而本次的设计就是检测相位差。锁相环和数字鉴相鉴频器是两个东西,前者是控制,后者是检测。

2. Pi性质的环路滤波?难道是PID控制,在反馈系统中,用输出的实际值和理论值的差值去反馈进系统的输入。PID就是反馈的比例,积分和微分。不过这里的滤波是什么?电机的锁相环控制中,电机加霍尔传感器是二阶系统。什么是二阶系统? y=ax^2+bx+c?

3. 做鉴相鉴频器的目的是为了稳速,不过现在还没明白,如何提高速度。这并不是我们关心的,假设电机转速500转每秒(霍尔传感器采样得到500MHz),晶振时钟是40MHz。

4.为了得到500 Hz的参考时钟,需要对40 MHz的晶振时钟进行两次分频操作。分频系数为N-0.5(N为整数)时,就是半整数分频。本次需要实现奇数分频,还有半整数分频。对40 MHz的晶振时钟先后进行等占空比125分频和2. 5半整数分频,得到320 kHz和128 kHz的时钟,经过时钟预分频器分频后的固定占空比128  kHz的时钟信号经过8位计数器,得到500  Hz的参考输入信号,反馈时钟输入并检测到其上升沿。

5. 在每个反馈信号的上升沿保存8位寄存器的值,这个值就是频率差(非线性)和相位差(线性)。同时用一个标志位,为1说明有上升沿,为0说明无上升沿,代码如下

  1. module pfd(reset, clk_40mhz, clk_128k, clk_fb_500, phase_value, clk_ref_out);
  2.  
  3. input reset;
  4. input clk_128k; //两次分频得到的128Khz的时钟
  5. input clk_fb_500; //电机的反馈时钟500hz
  6. input clk_40mhz;
  7.  
  8. reg clk_ref_500;
  9. output [:] phase_value;
  10. reg [:] phase_reg;
  11. output clk_ref_out;
  12.  
  13. reg [:] cout_8bit; //8位计数器
  14. reg [:] ph_reg; //8位寄存器
  15. reg have_flag;
  16. reg clk_fb_prv;
  17. reg clk_ref_prv;
  18. reg [:] phase_value_1;
  19. reg [:] phase_value_tmp;
  20. parameter PHASE_MAX_VALUE = 'h7F;
  21.  
  22. wire cout_en;
  23.  
  24. //8位计数器,一个always里面可以写2个if语句吗?
  25. always @(posedge clk_128k or negedge reset) begin
  26. if(!reset)
  27. cout_8bit <= 'b0;
  28. else
  29. cout_8bit <= cout_8bit + 'b1;
  30. end
  31.  
  32. //产生参考时钟500HZ
  33. always @(posedge clk_40mhz) begin
  34.  
  35. if(cout_8bit == 'h0)
  36. clk_ref_500 <= ;
  37. else if(cout_8bit == 'h7f)
  38. clk_ref_500 <= ;
  39. else
  40. clk_ref_500 <= clk_ref_500;
  41. end
  42.  
  43. //D触发器,边沿检测反馈信号上升沿和参考信号下降沿
  44. /*
  45. always @(posedge clk_fb_500 or negedge clk_ref_500) begin
  46. if(clk_fb_500 == 1) begin
  47. have_flag = 1;
  48. clk_fb_prv = clk_fb_500;
  49. phase_value_1 = cout_8bit; end
  50. else if(clk_ref_500 == 0) begin
  51. have_flag = 0;
  52. phase_value = phase_value_tmp; end
  53. else
  54. have_flag = 0;
  55.  
  56. end
  57. */
  58.  
  59. always @(posedge clk_40mhz) begin
  60. clk_fb_prv <= clk_fb_500;
  61. clk_ref_prv <= clk_ref_500;
  62. if({clk_fb_prv,clk_fb_500} == 'b01) begin //判断反馈信号的上升沿
  63. have_flag <= ;
  64. phase_value_1 <= cout_8bit; end
  65. else if({clk_ref_prv,clk_ref_500} == 'b01) begin //判断参考信号的上升沿
  66. have_flag <= ;
  67. phase_reg <= phase_value_tmp; end
  68. else
  69. have_flag <= have_flag;
  70.  
  71. end
  72.  
  73. //怎么去解决一个周期内有2个反馈信号的上升沿的问题?
  74. //总线选通开关
  75. always @(posedge clk_40mhz)begin
  76. if(have_flag == )
  77. phase_value_tmp <= phase_value_1;
  78. else
  79. phase_value_tmp <= PHASE_MAX_VALUE;
  80.  
  81. end
  82. //PFD输出
  83. //always @(posedge clk_128k)
  84.  
  85. assign clk_ref_out = clk_ref_500;
  86. assign phase_value = phase_reg;
  87. endmodule

6. 实际仿真如下,当反馈信号滞后于参考信号1/4周期的时候,输出为0xc0,那么高位为1,说明是滞后(0xff-0xc0=0xff/4),不过波形都是相对的周期,换种说法说是超前0xc0也是对的,主要是看对比前一个参考上升沿还是下一个参考上升沿。两种定义都可以。

7. 当反馈信号超前于参考信号的时候,输出为0x4d,那么高位为0,说明是超前(0x4d)

8. 频率差,当反馈信号的频率高于参考信号时,在一个参考时钟周期内会有多个反馈时钟的上升沿出现,PFD的输出将会是最后一个反馈时钟沿对应的寄存的值,是一个负数,表明反馈信号超前参考信号。锁相环路将会降低VCO的输出降低反馈信号的频率。当反馈信号的频率低于参考信号时,在某个参考时钟周期内将不会有反馈信号的上升沿出现,此时PFD会复位触发器,输出对应于最大滞后量的7FH,此时锁相环路将会提高VCO的输出提高反馈信号的频率。下图是输出0X7FH的仿真。当然在下一个周期,仍然会检测到反馈信号的上升沿,所以0X7FH和0X66H间隔出现,证明了本次仿真是正确的。

FPGA数字鉴相鉴频器的开发记录的更多相关文章

  1. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  2. 你要的fpga&数字前端笔面试题都在这儿了

    转自http://ninghechuan.com 你要的FPGA&数字前端笔面试题来了 FPGA&ASIC基本开发流程 题目:简述ASIC设计流程,并列举出各部分用到的工具. 勘误:C ...

  3. CozyRSS开发记录22-界面退化

    CozyRSS开发记录22-界面退化 1.问题1-HtmlTextBlock 找的这个HtmlTextBlock有很严重的bug,有时候显示不完全,有时候直接就崩了.然后看了下代码,完全是学生仔水平写 ...

  4. CozyRSS开发记录21-默认RSS源列表

    CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...

  5. CozyRSS开发记录20-CanResizeWithGrip

    CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...

  6. CozyRSS开发记录19-窗口标题栏交互

    CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...

  7. CozyRSS开发记录18-番外之Atom1.0的支持

    CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...

  8. CozyRSS开发记录17-Html2Xaml

    CozyRSS开发记录17-Html2Xaml 1.RssContentView还需要优化 上回做了RssContentView的显示,但是对于rss返回的描述(摘要),连换行的没有,更别说里面还有h ...

  9. CozyRSS开发记录16-RssContentView显示

    CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...

随机推荐

  1. pthread_create & pthread_exit

    http://www.cppblog.com/saha/articles/189802.html 1.   pthread_create    #include <pthread.h>   ...

  2. Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired,

    Did not receive a reply. Possible causes include: the remote application did not send a reply, the m ...

  3. [USACO17FEB]Why Did the Cow Cross the Road III G

    嘟嘟嘟 首先看到这种序列的问题,我就想到了逆序对,然后就想如何把这道题转化. 首先要满足这个条件:ai <bi.那么我们把所有数按第一次出现的顺序重新赋值,那么对于新的数列,一定满足了ai &l ...

  4. 【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2939 本来说是双倍经验题,跟飞行路线一样的,结果我飞行路线拿deque优化SPFA过了这里过不了了. 所以多 ...

  5. 【luogu P3952 时间复杂度】 题解

    对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...

  6. vue进阶语法及生命周期函数

    1.calss和style绑定 操作元素的 class 列表和内联样式style是数据绑定的一个常见需求,它两都是属性,所以可以通过v-bind来绑定 1.1绑定HTML class 可以给v-bin ...

  7. Linux环境下利用句柄恢复Oracle误删除的数据文件

    在误删除Oracle的数据文件后,如果未关闭数据库,文件句柄还没有释放,且被删除的数据文件占用的磁盘块未被复写,则可以利用句柄的方式来恢复数据文件.下面模拟恢复过程. (一)环境 OS版本:redha ...

  8. 搭建一个java开发环境的步骤

    首先思考java开发环境需要些什么? 1.适用于我们开发环境的jdk 2.对应开发环境的IDE 3.如果是web应用,还需要web服务器,常用的有Tomcat 1) 下载对应组件 2) 安装 jdk安 ...

  9. #leetcode刷题之路3-无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...

  10. P1247 取火柴游戏

    题目描述 输入k及k个整数n1,n2,-,nk,表示有k堆火柴棒,第i堆火柴棒的根数为ni:接着便是你和计算机取火柴棒的对弈游戏.取的规则如下:每次可以从一堆中取走若干根火柴,也可以一堆全部取走,但不 ...