历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | ARM7 LPC2138数字频率计的设计源码与报告

2019-10-15 来源:eefocus

1.1、设计原理

频率就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数为N,则其频率可表示为f=N/T。其中f为被测信号的频率,N为计数器所累计的脉冲个数,T为N个脉冲所产生的时间。计数器所记录的结果就是被测信号的频率计数法又称测频法,是将被测信号通过一个定时闸门加到计数器进行计数的方法,如果闸门打开的时间为T,计数器得到的计数值为N1,则被测频率为f=N1/T。改变时间T,则可改变测量频率范围。设在T期间,计数器的精确计数值应为N,根据计数器的计数特性可知,N1的绝对误差是N1=N+1,N1的相对误差为ΔN1=(N1-N)/N=1/N。由N1的相对误差可知,N的数值愈大,相对误差愈小,成反比关系。因此,在f以确定的条件下,为减少N的相对误差,可通过增大T的方法来降低测量误差。当T为某确定值时(通常取1s),则有f1=N1,而f=N,故有f1的相对误差:Δf1=(f1-f)/f=1/f 从上式可知f1的相对误差f成反比关系,即信号频率越高,误差越小;而信号频率越低,则测量误差越大。因此测频法适合用于对高频信号的测量,频率越高,测量精度也越高。


1.2、方案选择

计时法又称为测周期法,测周期法使用被测信号来控制闸门的开闭,而将标准时基脉冲通过闸门加到计数器,闸门在外信号的一个周期内打开,这样计数器得到的计数值就是标准时基脉冲外信号的周期值,然后求周期值的倒数,就得到所测频率值。但由于用计时法所获得的信号周期数据,还需要求倒数运算才能得到信号频率,而求倒数运算用中小规模数字集成电路较难实现,因此,计时法不适合本实验要求。


计数法则适合于对较高频信号的测量。测频法的测量误差与信号频率成反比,信号频率越低,测量误差就越大,信号频率越高,其误差就越小。但用测频法所获得的测量数据,在闸门时间为一秒时,不需要进行任何换算,计数器所计数据就是信号频率。根据本设计要求的性能与技术指标,首先需要确定能满足这些指标的频率测量方法。因此,本实验所用的频率测量方法是测频法。


图1.1原理框图及其波形图


2.1原理图设计

图2.1 proteus电路图


2.2 程序设计

图2.2 程序流程图


3、仿真结果

利用proteus和Keil软件,将程序编译正确后,并且生成HEX文件,然后用protest仿真。修改发射频率,观察结果。

图3.1仿真结果


4、实物调试

4.1调试结果

当信号发射器输入的频率为2kHz方波时,LCD显示屏显示也为2k,发射频率为3kHz时,显示屏显示3k,由此可得,实物实现了功能,并且达到了相应的精度。


4.1实物调试

4.2调试中遇到的问题

由于我们需要将编译好的程序烧录进入我们的板子,所以当时不是很清楚烧录程序的用法,所以开始出现LCD没有任何显示,我们一直以为是板子和显示屏的问题,所以浪费了很多时间。后来在了解清楚程序的使用方法后,我们成功的烧录进去了程序,然后连接好我们之前焊接好的局部程序电路板,实行调试,取得了最后的成功。


5、设计总结

本次设计让我体会到设计程序,连接原理图,调试的苦与甜,设计是我们必须得技能,而这次实习恰恰给了我们一个很好的实际操作的机会,从图书馆找资料设计程序、连接原理图,在这个过程中我学到了很多新的知识,并且对keil和proteus的应用更加的娴熟,感受到了这些软件的强大功能,当调试成功的时候感觉很神奇,很不可思议,同时更加深了我对这些知识的印象。


在设计过程中,因为我们设置定时器为计数模式。所以最高计数频率为时钟频率(44.2368MHz)的1/4(11.0592MHz),但是我们又100分频了的,所以最终只能测得110kHz。由于显示器的问题,前面固定字符已经占了很多位,所以只能到9999Hz。


在设计过程中,不能急躁,设计和调试要一步一步来,这次在设计过程中,由于刚开始对LPC2138的管脚功能不熟,设计过程中老是混淆,经过查资料认真学习才辨别清楚,特别是程序修改的时候,一定不能马虎,一个字母不对都编译失败,在最后的调试过程中,因为仿真结果已经准确无误,所以调试不出结果让人特别心急,还耽搁了了时间,建议能多一些好的开发板,若不是因为开发板和显示器有问题,也许我们的进度能更快一些。


LPC2138源程序:

#include"LPC213x.h"

#define uint unsigned int

#define uchar  unsigned char

int g_sample_cnt;

#define RS              1<<5

#define RW              1<<6

#define EN               1<<7

#define KEY_MC    (1<<31)

#define KEY_RST    (1<<30)

#define KEY_NIGHT    (1<<29)

uchar num,i;

uchar  table1[]={"frequency:    hz      "};

uchar  table2[]={"                      "};

uint HZ[]={                   0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00,           0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00,              

0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00};             

void DelayNs(uint NS)

{  uint i; 

   for(;NS>0;NS--)    

   for(i=0;i<500;i++);

}

void writecom(uint com)

{

  IO0CLR=RS;

  IO0PIN=(IO0PIN&0X00FF)+(com<<8);    

  DelayNs(1);

  IO0SET=EN;

  IO0CLR=EN;

}

void writedata( uint data)

{

  IO0SET=RS;

  IO0PIN=(IO0PIN&0X00FF)+(data<<8);     //P0=data;

  DelayNs(1);

  IO0SET=EN;

  IO0CLR=EN;

}

void init()

{

   PINSEL0=0X00000000;

   IO0DIR =0XFFFF;

IO0CLR=RW;

   IO0CLR=EN;

   writecom(0x38);

   writecom(0x0c);

   writecom(0x06);

   writecom(0x01);

}

int mile=0,premile=0;

int night=0;

int lowmode=0;

int price=0;

int lowmodefirsttime=0;

int price_low=0;

static int lowmodetime=0;

void __irq IRQ_Timr0(void)

{


              table1[10]=g_sample_cnt/1000%10+'0';              table1[11]=g_sample_cnt/100%10+'0';

table1[12]=g_sample_cnt/10%10+'0';

              table1[13]=g_sample_cnt%10+'0';

              writecom(0x80);

              for(num=0;num<21;num++)

              {

                            writedata(table1[num]);

                            DelayNs(1);

              }

              writecom(0x80+0x40);

              for(num=0;num<21;num++)

              {

                            writedata(table2[num]);

              }

    g_sample_cnt=0;

              T0IR = 0x01;    

              VICVectAddr = 0x00;  

}


/**********************************************************

void Timer0Init(void)

{

              //Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz

              //Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz

              T0PR = 99;                                                  // 设置定时器0分频为100分频,得110592Hz

              T0MCR = 0x03;                                                           // 匹配通道0匹配中断并复位T0TC

              T0MR0 = 150350;                                              // 比较值(1S定时值)

              T0TCR = 0x03;                                                           // 启动并复位T0TC

              T0TCR = 0x01;

VICIntSelect = 0x00;  

              VICVectCntl0 = 0x20|4;

              VICVectAddr0 = (unsigned long)IRQ_Timr0;

              VICIntEnable = 1<<4;      

}

void main()

{

  init();

  writecom(0x80);

  DelayNs(100);

  Timer0Init();

  for(num=0;num<19;num++)

  {

                writedata(table1[num]);

              DelayNs(1);

  }

  //writecom(0x40);

// for(num=0;num<24;num++)

// {

//   writedata(HZ[num]);

// }

  writecom(0x80+0x40);

  for(num=0;num<19;num++)

  {

                writedata(table2[num]);

  }


                PINSEL1 &=0x00ffffff;

              //IODIR  =0xe83fffff;

              IO1DIR  |=0xff000000;

  //writedata(0x00);

  //writedata('4');

  //writedata(0x01);

  //writedata('2');

  //writedata('6');

  //writedata(0x02);

              IO1DIR&=~KEY_MC;

              IO1DIR&=~KEY_RST;

              IO1DIR&=~KEY_NIGHT;

              mile=325400;

              lowmodetime=lowmodefirsttime=price=premile=mile=0;

                while(1)

                {

                            #if 1 

                            if((IO1PIN&KEY_MC)==0)

                            {

                                          g_sample_cnt+=1;

                                          //DelayNs(1);

                                          while((IO1PIN&KEY_MC)==0);

                            }

                            #endif

                }


}


推荐阅读

史海拾趣

迦美信芯(CanaanTek)公司的发展小趣事

迦美信芯一直致力于技术创新和产品升级。公司推出的面向手机终端和物联网的2G/3G/4G/5G全系列的射频开关、天线调谐器、低噪声放大器等产品,在行业内具有较高的知名度和美誉度。特别是在天线调谐器领域,迦美信芯已成为国内设计出天线调谐器芯片并大量量产的厂家之一。

Einfochips公司的发展小趣事

Einfochips公司一直致力于嵌入式系统的创新与发展。在某一时期,该公司推出了Eragon600,一款基于Qualcomm Snapdragon 600处理器的全新嵌入式开发平台。这一平台的推出,标志着Einfochips在嵌入式系统开发领域取得了重要突破。Eragon600不仅具备强大的处理能力,还适用于多种行业,包括工业、安全与监控、信息、娱乐等。在多个领域的广泛应用,进一步巩固了Einfochips在嵌入式系统开发领域的领先地位。

台湾晶豪(ESMT)公司的发展小趣事

晶豪科技一直将研发作为公司的核心竞争力。公司成功建立了各种容量及接口规格的特定型DRAM产品线,包括SDRAM、DDR I/II/III及PSRAM、低耗电的Mobile DRAM等。这些产品广泛应用于各种电子设备和系统,赢得了市场的广泛认可。此外,公司还针对系统级封装(SiP)的需求,成功开发了所需的“良品晶粒”(Known-Good-Die, KGD)产品及多芯片模块封装(MCP)的解决方案,满足了客户的多样化需求。

Bomar Interconnect公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Bomar Interconnect公司开始积极拓展国内外市场。公司通过参加各类行业展会、举办技术研讨会等方式,加强与客户的沟通与合作。同时,公司还注重品牌建设,通过提升产品质量、优化客户服务等举措,树立了良好的企业形象。这些努力不仅帮助公司赢得了更多客户的信任和支持,也为公司的长远发展奠定了坚实基础。

General Transistor Corp公司的发展小趣事

面对日益激烈的市场竞争,GTC及时调整市场策略,加强品牌建设。公司注重提升产品质量和服务水平,积极参与国内外各类电子产品展会和论坛,提高品牌知名度和影响力。同时,GTC还建立了完善的销售网络和售后服务体系,为客户提供更加便捷、高效的服务。这些举措有力地推动了公司业务的快速增长和市场份额的扩大。

Galil Motion Control Inc公司的发展小趣事

为了进一步巩固市场地位和提升竞争力,GTC开始实施并购整合战略。公司通过收购具有技术优势和市场潜力的企业,实现了技术、产品和市场的快速扩张。同时,GTC还积极寻求战略转型,从单一的电子元器件分销商和生产商向综合性电子解决方案提供商转变。这一战略转型为公司带来了新的增长点和发展机遇。

问答坊 | AI 解惑

想了解海尔单片机的请进

海尔单片机海尔单片机在华南区代理商,专门为客户开发设计各种单片机应用程序和电路板,目前拥有多种家电、工控、仪表成熟方案,欢迎广大用户合作。    开发过的大小家电类产品:电热水器、蒸汽清洁机、空调机控制板、洗衣机控制板、汽车 ...…

查看全部问答>

怎样写testbench(xilinx的)文章共享

怎样写testbench的资料贡献给大家!…

查看全部问答>

剖析切換式電源供應器的原理及常用元件規格

由於大部分電子器材(如電視機、音響、電腦…等)其內部元件所使用的電源均為直流電,故必須有電源供應器(或整流器)來把交流市電轉換成各種不同的直流電壓以使電器發揮功能。依其電路結構的不同,電源供應器可分為線性式和切換式電源供應器兩種, ...…

查看全部问答>

求助:一道Intel笔试题

题目:给出至少两种方法实现存储器管理,比如虚存。 题目中提到了虚存,那么答案应该不能再列举它。…

查看全部问答>

MSP430 的IO端口详细介绍。新手学习贴

       MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没 ...…

查看全部问答>

有谁用过r8c/38a? (瑞萨单片机)

有谁用过r8c/38a?(瑞萨单片机)…

查看全部问答>