找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4742|回复: 1
打印 上一主题 下一主题
收起左侧

简易数字相位差计课程设计总结书

[复制链接]
跳转到指定楼层
楼主
ID:295503 发表于 2018-3-22 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是内容预览,附件中有完整版本下载:

简易数字相位差计
课程设计总结书

学院:   机电工程学院
专业: 电气工程及其自动化
班级:
小组:
姓名:
指导教师:
二〇一二年三月

目录
方案设计1
    11方案概述1
    12技术指标1
工作原理1
    21系统概述1
    22脉冲计数法相位差测量原理2
器件选择3
    31LM311P3
    32ARM开发板4
系统设计4
    41外部电路4
    42ARM开发板5
系统测试6
    51测试仪器6
    52测试方法6
    53测试结果6
    54测试出现问题及解决方法10
心得体会10
参考文献11
附录12


简易数字相位差计

一、方案设计

1.1方案概述

数字相位差计包括外部电路与ARM开发板两部分,外部电路主要利用电压比较器,将正弦波输入信号转化为方波;ARM开发板主要用到的模块为定时器模块、计数器模块、中断系统模块、CPU处理模块和数码管显示模块,系统框图如图1。

图1 系统框图

1.2技术指标

相位差测量范围:0 ~ 180°

数码显示:4位数码显示

相位差分辨率:0.1°

识别信号范围:电压3V,频率

工作方式:连续

二、工作原理

2.1系统概述

两个同频被测正弦信号分别经过相同型号的电压比较器与1.5V的固定电压比较后得到两个有相位差的方波,然后将两个方波输入到ARM开发板上,由中断系统实时监控电平变换,从而控制计数器对定时器晶振进行计数,经过算法运算后,在数码管上显示出相位差的数值。

2.2脉冲计数法相位差测量原理[1]

                   图2 相位差计原理图

设被测两信号的时间间隔为

                                (1)

式中,—在时间内晶振计数脉冲的个数;

      —晶振信号周期。

数字式相位计波形图如图2所示,由图可知

                                   (2)

式中,—两被测信号的相位差;

      —被测信号的周期。

将式(1)带入式(2)得

             (3)

式中,—被测信号频率;

      —晶振信号频率。

    若让计数器在1s内连续计数,即1s内有个门控信号,则其累计计数为:

                                                (4)

式中,—1s中晶振累计脉冲数量。

将式(4)代入式(3)得

                                             (5)

若取晶振频率,则

                                    (6)

三、器件选择

3.1 LM311P

LM311P电压比较器是单比较器可以将模拟信号转换成二值信号,即只有高电平和低电平两种状态的信号。该比较器有两个输入端和一个输出端。两个输入端一个称为同相输入端,用“+”表示,另一个称为反相输入端,用“-”表示。用作比较两个电压时,任意一个输入端加一个固定电压做参考电压,另一端加一个待比较的信号电压。在二者幅度相等时,输出电压将产生跃变,即:

当“+”端电压高于“-”端时,输出管截止,相当于输出端开路。

当“-”端电压高于“+”端时,输出管饱和,相当于输出端接低电位。

3.4 ARM开发板

ARM作为嵌入式系统的处理器,具有低电压,低功耗和高集成度等特点,并具有开放性和可扩充性,其能在电源电压为2.7V-3.6V的范围正常工作,其对外电路的供电电源为4V。开发板包括定时器(含晶振)、计数器、中断系统、CPU处理器、数码管显示器、A/D和D\A转换器等模块,该开发板可以应用到本设计中。

四、系统设计

4.1 外部电路


图3 外部电路图

    本项目外部电路由两个如图3所示的电路组成,其中为输入信号(正弦波),为经过电压比较器处理过后的输出信号(方波)。

4.2 ARM开发板

4.2.1工作过程简述

当ARM开发板接收到两个输入信号时,定时器的晶振启动,同时中断系统实时监控两个输入信号(其作用相当于“异或门”),控制计数器读出两信号在(0,1)或(1,0)时晶振产生的脉冲次数,并通过CPU进行算法运算,实时输出到数码管显示器上(框图如图1 ARM开发板模块)。

4.2.2模块介绍

定时器:定时器的内部晶振频率为...,可以通过分频的方法设置所需频率的晶振。本设计采用的是163.28Kz频率的晶振,当检测到输入信号时晶振便开始产生脉冲,计数器(计数定时器)溢出周期为0.4s。由此估测所能测得最低频率为3Hz。(输入波形周期不能超过定时器溢出周期)。

中断系统:本设计设置两个中断,采用上升沿中断,分别捕获输入IO口的两路波形的上升沿。在每个上升沿中断处实现:

    ①定时器计数读出;

    ②计数器清零;

    ③对累计的脉冲数进行均值算法。

计数器:由中断系统控制,进行清零和计数这两个任务。鉴于计数器在于累计计数时有上限,故程序设置计数器每次累计到程序设定值时自动清零。

CPU处理器:用于接收计数器输出的数字,根据脉冲计数法相位差测量原理进行算法运算(包括平均值运算),并将结果输出到数码管。

数码管显示:本项目数码管采用八段数码管作为输出显示器件。显示方式为动态实时显示,并且把小数点一直显示到最后一位,此时,LED 数码管的第一、二、三位是用来对相位差进行显示的,最后一位是用来进行小数显示的。

五、系统测试

5.1测试仪器

    信号发生器、数字式相位差计。

5.2测试方法

利用信号发生器产生两个同频信号,不断改变两个信号的相位差,并分别记录下信号发生器的相位差设设置数据与数字相位差即所测量出的数据,各7组。

5.3测试结果

5.3.1实验数据

频率: Hz   幅值:3V

组号

1

2

3

4

5

6

7

实际数据















测量数据

















                                       频率:  Hz   幅值:3V

组号

1

2

3

4

5

6

7

实际数据















测量数据















                                       频率:  Hz   幅值:3V                                                              

组号

1

2

3

4

5

6

7

实际数据















测量数据
















                                      频率:  Hz   幅值:3V

组号

1

2

3

4

5

6

7

实际数据















测量数据
















5.3.2数据处理

算数平均值:

标准差估计值:

算数平均值的标准误差估计值:

算数平均值的置信限:

当P=,时,查表得

测量结果:




5.3.3误差分析

系统误差:

(1)LM311P是高增益,宽频带器件,如果输出端到输入端有寄生电容而产生耦合,当比较器改变状态时,输出信号很容易产生振荡。这种现象出现在当比较器改变状态时,输出电压过渡的间隙,从而使得生成的方波产生误差。

改进方法:采用迟滞比较器代替单限比较器,即在单限比较器电路中引入正反馈,从而加快比较器的响应速度,免除由于电路寄生耦合而产生的自激振荡。但是反馈电阻阻值的选择也尤为重要,反馈电阻过大导致比较器的比较精度降低,反馈电阻过小导致比较器高低电平的变化速率降低,经过多次模拟仿真,我们选择43作为我们电路中的反馈电阻。

(2)本设计是将输入信号与1.5V的电压比较,大于1.5V为高电平,小于1.5V的为低电平。如图4所示虚线为信号通过比较器后的理想输出波形,但实际情况为图4的实线,由于导线和电阻的影响导致固定电压大于(或小于)1.5V,从而使得输出方波的高电平脉宽偏小(或偏大),从而产生误差。




图4实际输出方波比较图

(3)计数器在对晶振脉冲进行计数时,脉冲频率过高时,计数器对一个相位差脉宽脉冲过多,计数器计数准确率会降低,会产生误差。

脉冲频率过低时,计数器对一个相位差脉宽内的晶振脉冲计数更准确,但是脉冲数量过少不能完整表示整个相位差的脉宽,会产生误差。

图5 晶振脉冲示意图

改进方法:本设计将晶振的频率设置为163.28Kz,从而减小了由于频率过高或过低而产生的误差。

随机误差:






5.3.3结果分析






5.4测试出现问题及解决方法

  • 我们将输入信号频率分别设置为1kHz、100Hz、50Hz和10Hz四种情况,分别对其相位差从0°~180°,每隔30°进行测试,并记录下数据。由实验数据可以发现该设计的精度不高,每次测量均会偏大2°左右,产生误差。

解决方法:这种问题是由于硬件性能不够精准而产生的问题,我们对所测得的数组数据进行处理,即求测量数据的偏差均值,对软件算法进行修改来补偿硬件所造成的误差。

  • 当输入信号频率较低为10Hz时,数码管显示相位差数据会出现抖动的情况,该问题属于硬件问题,难以解决。

  • 心得体会

附录:

主程序

  1. LDD_TDeviceData* Timer;
  2. char segment_tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  3. char segment[4];
  4. extern unsigned int sum_low;
  5. extern unsigned int sum_high;
  6. extern unsigned int count_low;
  7. extern unsigned int count_high;
  8. extern double fai;
  9. extern unsigned int low_time;
  10. extern unsigned int high_time;
  11. double true_fai = 1234.5;

  12. void delay_ms(int ms)
  13. {for(int i=0;i<2000*ms;i++);}

  14. void display(int num)                            //赋值
  15. {
  16.               segment[3]=segment_tab[num%10];
  17.               segment[2]=segment_tab[num/10%10]&0x7f;
  18.               segment[1]=segment_tab[num/100%10];
  19.               segment[0]=segment_tab[num/1000%10];
  20. }
  21. void display_scan()                            //显示
  22. {
  23.               static int i=0;
  24.               DG1_PutVal(1);
  25.               DG2_PutVal(1);
  26.               DG3_PutVal(1);
  27.               DG4_PutVal(1);

  28.               segment_PutVal(segment[i]);
  29.               switch(i)
  30.               {
  31.               case 0:
  32.                             DG1_PutVal(0);
  33.                             break;
  34.               case 1:
  35.                                           DG2_PutVal(0);
  36.                                           break;
  37.               case 2:
  38.                                           DG3_PutVal(0);
  39.                                           break;
  40.               case 3:
  41.                                           DG4_PutVal(0);
  42.                                           break;

  43.               }
  44.               i=(i+1)%4;
  45. }
  46. /*lint -save  -e970 Disable MISRA rule (6.3) checking. */
  47. int main(void)
  48. /*lint -restore Enable MISRA rule (6.3) checking. */
  49. {
  50.   /* Write your local variable definition here */

  51.   /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  52.   PE_low_level_init();
  53.   Timer = TU1_Init(NULL);
  54.   /*** End of Processor Expert internal initialization.                    ***/

  55. while(1)
  56. {
  57.                             if(count_low==100&&count_high==100)
  58.               {
  59.                             fai=(double)sum_high/(sum_high+sum_low);
  60.                             if(fai<0.5)
  61.                                           true_fai=360*fai;
  62.                             else
  63.                                           true_fai=360*(1-fai);
  64.                             sum_high=0;
  65.                             sum_low=0;
  66.                             count_low=0;
  67.                             count_high=0;

  68.               }
  69.               display(sum_high);
  70.               display(true_fai*10);
  71.               display_scan();
  72.               delay_ms(1);
  73. }
  74. extern LDD_TDeviceData* Timer;
  75. unsigned int low_time;
  76. unsigned int high_time;
  77. unsigned int sum_low=0;
  78. unsigned int sum_high=0;
  79. unsigned int count_low=0;
  80. unsigned int count_high=0;
  81. double fai;

  82. 中断1程序:
  83. void EInt1_OnInterrupt(void){
  84.   /* Write your code here ... */
  85.               unsigned char edge1;

  86.               edge1=EInt1_GetVal();
  87.               if(edge1==1)
  88.               {
  89.                             low_time=TU1_GetCounterValue(Timer);
  90.                             TU1_ResetCounter(Timer);
  91.                             if(count_low<100)
  92.                             {
  93.                                           sum_low+=low_time;
  94.                                           count_low++;
  95.                             }


  96.               }


  97. }

  98. void TU1_OnCounterRestart(LDD_TUserData *UserDataPtr)
  99. {
  100.   /* Write your code here ... */
  101. }

  102. 中断2程序:
  103. void EInt2_OnInterrupt(void)
  104. {
  105.               unsigned char edge2;
  106.               edge2=EInt2_GetVal();
  107.               if(edge2==1)
  108.               {
  109.                             high_time=TU1_GetCounterValue(Timer);
  110.                             TU1_ResetCounter(Timer);
  111.                             if(count_high<100)
  112.                             {
  113.                                           sum_high+=high_time;
  114.                                           count_high++;
  115.                             }
  116.               }
  117. }
复制代码

完整的Word格式文档51黑下载地址:
相位差计.docx (260.3 KB, 下载次数: 49)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:872463 发表于 2021-1-3 10:33 | 只看该作者
您好,请问有完整的电路图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表