- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
终于完成电子系统综合设计了。选的题目是数字频率计,使用了MSP430单片机和Cyclone的EP1C3T144 FPGA。单片机系统板用的是创新院ZM的EZ430,FPGA用的是Smoking Fish的开发板,还用了LCD1602液晶显示器。 本数字频率计的频率范围是1Hz - 1MHz,还具有显示周期和脉宽功能。频率测量原理采用等精度法。等精度法的优点是相对误差与被测频率无关,在预置门控信号持续时间不变的情况下,无论被测频率是否变化,测量精度是不变的。 下面分两部分介绍Donald制作的数字频率计。第一部分,FPGA部分 本设计FPGA测量原理图如下: 其中计数器模块由两个32位高速计数器组成。计数器的实现比较简单,主要问题是需要一个32位-8位的输出缓冲器,因为单片机的数据总线只有8位。这里,Donald的缓冲器输出仿真图如下: 另外,为了实现测量频率与测量占空比同时进行,Donald多加了一个32位计数器和输出缓冲器,此计数器的预置门控信号由被测频率信号的高电平和原预置门控信号共同控制,并对标准频率进行计数。第二部分,单片机部分 本等精度数字频率计由于采用MSP430,片内资源丰富,对浮点数和长整型数据运算都比较容易。 根据等精度测量原理,被测频率为 fx = (fs / Ns) * Nx 式子中,fs为标准频率,Ns为预置时间内标准频率计数值,Nx为被测频率计数值,这些值均为已知,被测频率fx即可求出。Ns和Nx均为从FPGA部分读出。所以单片机的任务就是从FPGA部分正确读出Ns和Nx,然后计算出fx,最后显示出来。当然,为了测量占空比,还要读出相应计数值Np。占空比的等精度测量原理参考相应书籍。 读数时,按照Donald自己设计的32位-8位输出缓冲器的时序,经过简单调试,便正确读出。计算更是简单,直接按公式进行,便可得到被测频率和占空比。在Donald的程序里,频率和占空比均以float类型存储,分别定义为g_fFx,g_fDty。于是,剩下的问题就是如何将浮点数显示在LCD1602上,即浮点数如何以字符数组的形式显示出来。 这个问题困扰了Donald很久,为了显示,还专门查了浮点的数的存储结构。这里简单复述下:C51里用4字节存储一个浮点数,格式遵循IEEE-754标准(详见c51.pdf第179页说明)。一 个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指 数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个 范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常是1,因此不保存。一个符号位表示浮点数是正或负。 浮点数保存的字节格式如下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 较高的有效位数,提高了精度。 零是一个特定值,幂是0 尾数也是0。 考虑了很久,都不知道如何将浮点数以字符形式存到数组。于是上网一顿找,只有一个程序能实现将浮点数以科学计数法的形式显示出来,而且在float范围内精确显示。是个好程序,但需进行相当多的浮点运算,如其作者所说,“花在显示上的时间比计算的耗时都要多得多。”于是苦苦寻了段时间,最后从21ic上搜到一篇提问:浮点数怎么显示用数码管。一位网友zyg的回答是:
要是固定的,那就容易了,要是保留小数后两位,你就将浮点数乘以100然后赋值给整形或者长整形,之后送显示。要是你要求LED显示的数字的小数点位置是浮动的,那么就麻烦了,先判断数值落入的区域,然后再相应的乘以一个10的几次方数据再赋值显示。比如最大可以显示6个数码,要显示数字120.246,你发现数据在100-200之间,于是你定小数位置在第3,乘以1000送显;对于数字30.7899,你发现在10-100之间,小数位置就定在第二,乘以10000送显示。。。。一般情况别用sprintf,一下子就耗费你2.7k代码空间,2051这样的芯片连一条都装不下,肯定死
一段话顿时令Donald茅塞顿开。Donald的程序不用精确地将float类型显示出来,只需显示出需要的部分即可。况且如zyg这样实现速度相当快。拍拍脑门,解决问题了。Donald专门找了下zyg资料,无果。只找到无数的回帖,是个人品极好的大牛呀。 Donald根据本频率计的精度要求
文档评论(0)