找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7053|回复: 1
收起左侧

TMS320F2812 DSP高精度数字频率计设计资料 含源码 原理图PCB 论文

  [复制链接]
ID:227470 发表于 2017-8-13 23:30 | 显示全部楼层 |阅读模式
数字频率计电路功能概述:   
       本设计采用TMS320F2812 DSP 芯片,制作了一台简易数字频率计。本设计综合了传统的多周期测量和等精度测量方法,实现了对被测信号频率、周期、脉宽和占空比宽范围、高精度的测量。提出了一种在无需任何外部硬件控制情况下,利用DSP 2812丰富的软件资源实现等精度测量的一种方法。它根据每个门闸时间内高频标准脉冲的个数与已知被测信号的个数,求得被测信号频率,最后再通过多次测量取平均值的方法得到最终结果。系统测试结果表明我们的设计是可行的。
硬件设计:
数字频率计系统硬件设计由四部分组成:整形电路、DSP选择与F2812最小系、通讯模块和电池管理模块。具体介绍说明,详见附件内容。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)

0.png 0.png 0.png

程序打包:
0.png

TMS320F2812 DSP源程序如下:

  1. void init_eva_timer1(void)//定时器1初始化
  2. {       

  3.     EvaRegs.GPTCONA.all= 0x6052;//将定时器1,2配置成递增计数模式
  4.    //没有事件启动ADC,定时器1,2的比较输出由各定时器比较逻辑独立驱动
  5.    //定时器1比较输出设为高有效
  6.     EvaRegs.T1PR = 2;       // 周期值
  7.     EvaRegs.T1CMPR = 1;     // 比较值
  8.     EvaRegs.EVAIFRA.bit.T1CINT= 1;//复位定时器1的比较中断标志
  9.     EvaRegs.EVAIFRC.bit.CAP1INT = 1;//复位捕获单元1的中断标志
  10.     EvaRegs.EVAIMRA.bit.PDPINTA= 0;//禁止功率驱动保护中断
  11.     EvaRegs.EVAIMRA.bit.T1CINT= 0;//禁止定时器1的比较中断使能
  12.     EvaRegs.EVAIMRC.bit.CAP1INT = 0;//禁止捕获单元1的中断使能
  13.     EvaRegs.T1CNT= 0x0000;//定时器1的计数值初始化为0
  14.     EvaRegs.T1CON.all = 0x1012;//将定时器1配置为仿真挂起时立即停止,
  15.     //连续增计数模式,禁止定时器1操作,用外部时钟,比较寄存器设为计数器值为0或等于周期寄存器的值时重载  
  16.     //使能定时器的比较操作
  17. }
  18. void init_eva_timer2(void)//定时器2的初始化
  19. {
  20.     EvaRegs.GPTCONA.all=0x6052;
  21.     EvaRegs.T2PR= 0xFFFF;       // 周期值
  22.     EvaRegs.T2CNT = 0x0000; //初始化计数值
  23.     EvaRegs.EVAIFRB.bit.T2OFINT= 1; //复位定时器2的上溢中断标志
  24.     EvaRegs.EVAIMRB.bit.T2OFINT = 1;//使能定时器2的上溢中断使能
  25.     EvaRegs.T2CON.all= 0x1502;//将定时器2配置为仿真挂起时立即停止,
  26.     //连续增计数模式,预分频设为32分频,使用自身使能位,禁止定时器2操作
  27.     //使用内部时钟,比较寄存器设为计数器值为0或等于周期寄存器的值时重载
  28.     //使用自身的周期寄存器
  29. }
  30. void frequence(void)//计算频率
  31. {    //计算捕获1捕获的定时器2的脉冲数
  32.     if(Ny2>Ny3)
  33.             Ny1=(65535-Ny2)+Ny3+65536*(EvaTimer2InterruptCount-1);
  34.             else
  35.             Ny1=Ny3-Ny2+65536*EvaTimer2InterruptCount;
  36.           if(flag3 == 0)   //判断被测信号频率范围   
  37.          {
  38.            if(Ny1>781250)
  39.             {
  40.             FR=7031250.0/Ny1;
  41.             TR=1000000.0/FR;
  42.             }
  43.            if(Ny1>=150000&&Ny1<=781250) //频率小于46.875Hz,直接计算
  44.             {     
  45.                FR1=7031250.0/Ny1;//FR1=1000000.0/Ny1/64*150*3;
  46.                FR0[FRCount++]=FR1;
  47.                    if(FRCount==7)//如果已计算了5个值,即数组已满,则禁止定时器1的比较操作
  48.                    {
  49.                     flag6=1;
  50.                   //  EvaRegs.EVAIFRA.bit.T1CINT=0;
  51.                    }
  52.                    else
  53.                      flag6=0;
  54.                   }            
  55.                   else if( Ny1>=3&&Ny1<150000)//被测频率小于150/64MH,大于150M/64/50000=46。875Hz
  56.                  {
  57.                                 if(flag1 == 0)//大于46.875H小于150M/64频率
  58.                                 {
  59.                                     flag3 = 1;
  60.                                         flag1 = 1;                                  
  61.                            N=150000.0/ Ny1;
  62.                    if(N<16383)         //重新配置定时器1
  63.                    {   EvaRegs.T1PR=4*N+3;// N=15384.6,T1PR最大为61542
  64.                                       EvaRegs.T1CMPR=2*N+1;
  65.                                       EvaRegs.T2CON.bit.TPS=3;//定时器2输入时钟预定标设为8分频
  66.                             }
  67.                    else if(flag5==0) //大于767953.125H(150M/64/200000*65532)小于150M/64 频率
  68.                    {
  69.                        flag5=1;
  70.                        EvaRegs.T1PR=65529;
  71.                        EvaRegs.T1CMPR=32764;
  72.                            EvaRegs.T2CON.bit.TPS=0;
  73.                                  }
  74.                 }
  75.            }
  76.              else
  77.              {
  78.                                    if(flag2==0)//大于150M/64 频率
  79.                                  {   
  80.                                        flag3 = 1;
  81.                                            flag2 = 1;         
  82.                               EvaRegs.T1PR=65529;
  83.                        EvaRegs.T1CMPR=32764;
  84.                            EvaRegs.T2CON.bit.TPS=0;
  85.                  }
  86.              }
  87.        }   
  88.     else            
  89.            if(flag3==1) //重新配置中频和高频之后重新计算
  90.              {
  91.                 if(flag1 == 1)
  92.               {
  93.                  if(flag5==1)
  94.                       {
  95.                         FR1=4914750.0/Ny1*1000000;//FR1=150.0/2*65530/Ny1*1000000;
  96.                         FR0[FRCount++]=FR1;
  97.                         if(FRCount==7)
  98.                         {
  99.                          flag6=1;
  100.                    //      EvaRegs.EVAIFRA.bit.T1CINT=0;
  101.                         }
  102.                         else
  103.                         flag6=0;
  104.                      }            
  105.                  else
  106.                  {
  107.                   FR1=9375000.0/Ny1*(EvaRegs.T1PR+1);//FR1=1000000.0/Ny1/16*150*4*(N+1);
  108.                   FR0[FRCount++]=FR1;
  109.                       if(FRCount==7)
  110.                        {
  111.                         flag6=1;
  112.                   //      EvaRegs.EVAIFRA.bit.T1CINT=0;
  113.                        }
  114.                       else
  115.                         flag6=0;
  116.                  }
  117.              }   
  118.          else
  119.             if(flag2 == 1)  
  120.              {   
  121.                     FR1=4914750.0/Ny1*1000000;//FR1=150.0/2*65530/Ny1*1000000;
  122.                         FR0[FRCount++]=FR1;
  123.                         if(FRCount==7)
  124.                         {
  125.                         flag6=1;
  126.                //         EvaRegs.EVAIFRA.bit.T1CINT=0;
  127.                         }
  128.                         else
  129.                         flag6=0;
  130.                  }
  131.              }
  132. }
  133. interrupt void eva_timer2_isr(void)//定时器2溢出中断程序
  134.    {
  135.      if((EvaTimer2InterruptCount>98)&&(flag3 ==1)&&((flag2 ==1)|(flag5==1)))
  136.        {
  137.           EvaRegs.T1PR = 2; //   75M*65530/65536/767953.125H,由767953.125H以上变低频处理,复位EV模块
  138.           flag3 = 0;
  139.           flag2 = 0;
  140.           flag1 = 0;
  141.           flag4 = 0;
  142.           flag5 = 0;
  143.           EvaRegs.T1CNT = 65525;
  144.           EvaRegs.T1CMPR = 1;
  145.           EvaRegs.T1CON.bit.TCLD10=2;
  146.           EvaRegs.T1CON.bit.TCLD10=0;
  147.           EvaRegs.T2CON.bit.TPS=5;
  148.           EvaTimer2InterruptCount=0;
  149.        }
  150. else
  151.    if((EvaTimer2InterruptCount>=25)&&(flag3 ==1)&&(flag1 ==1)&&(flag5==0))
  152.     {
  153.       EvaRegs.T1PR = 2; // 150M/16*8/65536/46.875,由中频变低频处理
  154.       flag3 = 0;
  155.       flag1 = 0;
  156.       flag4 = 0;
  157.       EvaRegs.T1CNT = 4*N;
  158.       EvaRegs.T1CMPR = 1;
  159.       EvaRegs.T1CON.bit.TCLD10=2;
  160.       EvaRegs.T1CON.bit.TCLD10=0;
  161.       EvaRegs.T2CON.bit.TPS=5;
  162.       EvaTimer2InterruptCount=0;
  163.     }
  164.   else   
  165.    {
  166.    EvaTimer2InterruptCount++;
  167.    }
  168.    EvaRegs.EVAIFRB.bit.T2OFINT= 1;//复位定时器2的上溢中断标志
  169.    PieCtrlRegs.PIEACK.all= PIEACK_GROUP3;//清除PIE分组3械牡闹卸舷煊ξ?
  170. }
复制代码

所有资料51hei提供下载:

pcb和原理图: 硬件设计.zip (230.99 KB, 下载次数: 133)

评分

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

查看全部评分

回复

使用道具 举报

ID:854348 发表于 2020-12-13 20:22 来自手机 | 显示全部楼层
有没有文档
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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