历史上的今天
今天是: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
}
}
史海拾趣
|
海尔单片机海尔单片机在华南区代理商,专门为客户开发设计各种单片机应用程序和电路板,目前拥有多种家电、工控、仪表成熟方案,欢迎广大用户合作。 开发过的大小家电类产品:电热水器、蒸汽清洁机、空调机控制板、洗衣机控制板、汽车 ...… 查看全部问答> |
|
由於大部分電子器材(如電視機、音響、電腦…等)其內部元件所使用的電源均為直流電,故必須有電源供應器(或整流器)來把交流市電轉換成各種不同的直流電壓以使電器發揮功能。依其電路結構的不同,電源供應器可分為線性式和切換式電源供應器兩種, ...… 查看全部问答> |
|
MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没 ...… 查看全部问答> |




