SE-FCNTR
100兆赫频率计数器/脉冲计数器
本机为使用8051的8位100MHz的频率计数器。
使用Crossware 公司8051 ANSI C语言编译器(演示版)。
无数字逻辑电路计数误差,也无软件计算误差。
8051的时钟振荡器XTAL1频率为24MHZ
用作自校输入时,显示数字为24000000。
避免了1个数字的计数误差或16进制转换为十进制时的12~48个时钟周期的误差。
脉冲计数部分的数据被送往8位LED显示器
8051内部16比特计数器及外部12比特(其中74F161 4比特, 74HC393 8比特)共 28
比特计数器,8位数字显示100MHz频率计数器。
门控时间为1秒,显示至8位数99999999。
模拟100MHz前置放大器,2.4GHz高频分频的预分频器
已制作的最少零件方案的计数器。
所采用的TI公司的SN74F161为4比特计数器,最大工作频率达120MHz。(资料:
http://www.sample.co.kr/sefcntr/sn74f161a.pdf)
保持模式选择,MHz/GHz选择开关
LED显示器直角引线
高频性能良好的双面环氧树脂印刷电路板
整套计数器的元件均采用常用易购元件。
硬件组成:
SE-FCNTR是采用8051微处理器的仪器级别的频率计。
整套仪器分为三个部分:
100MHz数字式计数器,100MHz模拟前置放大器,2.4GHz前置级预分频器
数字式计数器中的微处理器采用ATMEL公司的ATC51。
ATMEL公司的ATC51与市面上Intel公司的标准8051系列相同,带有4k闪存。
是市面上最经济实惠的微处理器。
8051处理器有两个内部16位计数器,
定时器Timer0及外部计数器用作频率计数,定时器Timer1是用来产生1秒闸门时
间。
为了简化电路,数字LED显示部分,采用动态驱动电路。
每位数字2毫秒依次顺序点亮。
为了尽量减少频率计的组成元件数量,8051内部的16位计数器/定时器寄存器被用
作频率计的计数器的一部分。
8051定时器的最大输入频率为Xtal1频率的1/4。
例如,如果XTAL1的时钟频率为24MHz,则最高计数频率可达6MHz。
频率计数器,通常情况下5~6位显示已经足够了,但作为脉冲计数器,采用了8位
数字显示的设计。
为了保证8位计数的准确,必需要有一个27比特的高速计数器。
Timer0的16位计数器及其外部74HC393的8位计数器和74161的4位计数器共
同构成了一个28位计数器。
因为2的28次幂为268435456,故足以显示数字99999999( 8位)。
100MHz数字脉冲计数集成电路,74系列的产品为74F161。
各个不同的制造商所生产74F161其最高计数频率也略有不同。
全都可以用于100MHz计数,而TI公司的SN74F161N最高计数频率可达120MHz。
SN74F161是一个4位计数器,可用作16分频,100MHz进行16分频后为6.25MHz。
同样,这个频率必须依靠其它计数器进行计数。
大多数集成电路是可以工作在这样低的频率的。
74HC393有8位计数器,故适用于这个多位计数器。
通过74HC393的8位计数器后的频率为25KHz,这个频率非常低,所以ATC51
单片机的Timer0的工作不会有什么问题的。
如果只使用8051频率计数器作显示,为了门控ontime时基1秒的准确,8051必须
要注意指令的执行时间。
8051自1980年开始生产,是一种生产时间很长的处理器。
因此,指令的执行时间及运算时间都有着或大或小的差异。
时钟频率决定sjmp$指令的执行时间,必须确定是1微秒的1/2还是1/4。
8051的12个XTAL1脉冲周期是指令执行的基本时间单位。
单字节指令NOP和INC R0需耗时12个时钟周期,SJMP$指令耗时24个时钟周期。
如果使用的时钟频率为24MHz,其24个时钟周期则为1毫秒。
8051要产生1秒信号,则计数器的比特数不够。
因此,采用了每秒产生500次中断的方法,用以生成1秒的门控间期。
在任何情况下,中断发生的时间都必须以1微秒为标准时间单位。
8051时钟振荡使用24MHz,采用其24个时钟周期。
8051是采用12个机器时钟周期(指令执行的基本时间单位)。
指令执行时间最少需要12个时钟周期,即500纳秒。
软件构成:
开发软件采用C语言编译器。
英国Crossware公司的 8051 ANSI C语言编译器,具有丰富的数据类型,并且提供
IEEE695格式32位微处理器调试。
支持从0开始的4K字节编译器的Free版本,已经在韩国免费发布。
(其它公司的8051编译器演示版,支持顶部区域编译,因而需要外部ROM)
采用微处理器的计数器,产生精确的1秒间期的刷新时间是很重要的。
频率计数器产生1秒脉冲等一些参数,如果1秒间期的geotyimeu门限时间不准确,
将不能看到准确的计数。
1秒的门控时间供8051的内部定时器Timer1使用。
基自Xtal 1的标准时钟频率信号,定时器每秒产生500次中断。
与CISC(复杂指令集合)处理器相比,8051在指令语义及执行时间等方面都有所不
同。
因而,如果在计算过程中,发生中断,则会出现的误差,这并不完全1秒时间门控时
间。
10的28位二进制数据应该输出术的本质改变,所以通常只中断处理程序必须是分布
式处理。
中断循环时间2毫秒,因此这一变化的十进制数16至10十进制diseupeureyi处理
程序,必须加以计算。
但是,使用8051输出功能毫秒内是不可能转换为8位数字符号。
因此,每个中断周期又分为若干jarissik 8变换符号已被配置为运行。
HOLD键的功能是停止LED数字显示。
软件调试:
8051的 XTAL1提供一个频率为24MHz的振荡信号。
同时该XTAL1亦为74F161提供24MHz输入时钟信号。
(硬件连接)此时,通过软件校正,使LED显示器上的数字为24000000。
如果看见显示为2400000,则说明软件计算没有发生误差
(1秒门控基准时间,与测量基准时钟是相同的)
100MHz/100兆欧前置放大器:
这是整个计数器制作中最困难的一部分。
前置放大器将微弱的交流电压放大并转换为TTL电平。
测量高达100MHz的频率范围,须配置超级宽带放大器。
并且,还必须对正弦波进行整形。
用于此目的是施密特触发器。
74系列中是74LS14。
然而,要获得可以通过100MHz及更高频率的施密特触发器是很困难的。
被称作高速的74F14及74AS14,其实验的结果的上限频率也仅为65MHz左右。
(在该实验中)TI公司的SN74AHCT14输入频率可达120MHz以上,其施密特触发
器性能得到验证。
输入频率的最低电压有所不同。
总体来说,50MHz~100MHz输入电压需1.5V以上,50MHz以下则需0.5V左右方
可进行计数。
2.4GHz,50欧姆,分频 预分频器(prescaler):
预分频器的作用是提高频率计数器的测量频率上限。
比如,在30MHz计数器基础上右上一个高速10分频器,即可构成为一个300MHz
的计数器。
固然可以通过TTL集成电路计数器来组成的10分频预分频器。然而,现在可以通过
微型处理器进行十进制转换,因而采用/128/256预分频。
本机的预分频器采用富士通公司的MB506。
从10MHz至2.4GHz的可采用分频的预分频器。
输入信号的放大采用两片Mini Circuits(微型电路)公司的MAR-6。
能够对小至0.1V的信号进行计数。
输入阻抗为50欧姆。
在SE-FCNTR装置的开发,大量的高频资料收集,前置放大器/预分频器电路的设计,元器件选择及性能评价等方面,金社长均予以了大量的帮助,在此深表感谢!
续(源程序部分)
//
// 100MHz / 2.4GHz Universal Counter
// 100MHz/2.4GHz 通用计数器
// SAMPLE Electronics co. 25. Nov. 2003
// 韩国Sample电子公司 二○○三年十一月二十五日
// Crossware Embedded Development Studio V 3.3.1.2
// 克洛斯威尔 嵌入开发工作站 版本:3.3.1.2
//
//
// 74F161的4比特,74HC393的8比特及8051的16比特内部计数器,共同构成28比特计数器。
// 脉冲计数时间为1秒,8位数字显示100兆赫计数器。
// 采用分频的预分频器时,脉冲计数时间为0.秒。
//
//
// 8051初始源程序
//
#include #include #include #include _sfrbit P36_o_74f161_clr_n = _p3^6; //外部计数器F161复位 _sfrbit P35_o_74f161_enp = _p3^5; //外部计数器F161有效(Enable) _sfrbit P30_io_74hc393_clr_hold = _p3^0; //外部计数器HC393复位/HOLD输入 _sfrbit P37_i_prescaler = _p3^7; // 分频的预分频器 // //七段LED字形数据 // hgfedcba #define DIG0 0xC0 // 11000000b ; 0 P2.0 #define DIG1 0xF9 // 11111001b ; 1 +-----a-----+ #define DIG2 0xA4 // 10100100b ; 2 | | #define DIG3 0xB0 // 10110000b ; 3 P2.5 f b P2.1 #define DIG4 0x99 // 10011001b ; 4 | | #define DIG5 0x92 // 10010010b ; 5 | P2.6 | #define DIG6 0x82 // 10000010b ; 6 +-----g-----+ #define DIG7 0xD8 // 11011000b ; 7 | | #define DIG8 0x80 // 10000000b ; 8 P2.4 e c P2.2 #define DIG9 0x98 // 10011000b ; 9 | | // ; | P2.3 | #define DIGM 0xBF // 10111111b ; - +-----d-----+ * h P2.7 #define DIGP 0x7F // 01111111b ; . #define DIGB 0xFF // 11111111b ; \"Blank\"(“空白”) // const char segment_pattern[] = { DIG0, DIG1, DIG2,\\ DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 }; // const char segment_select[] = { 0xFE, 0xFD, 0xFB, \\ 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; // unsigned long trailer; unsigned long task; unsigned int trimer; unsigned char fnd[8]; unsigned char mfnd[8]; unsigned int int_state; unsigned char fnd_state; unsigned char boat; bit hold; // // void _interrupt IVN_TIMER1 time_base() { ////////////////////////////////////////////// _tl1 = 0x60; _th1 = 0xF0; // 4000 2 M Sec 500 Times ////////////////////////////////////////////// _p0 = 0xff; _p2 = segment_select[fnd_state]; _p0 = fnd[fnd_state++]; fnd_state &= 0x07; ////////////////////////////////////////////// if(int_state == 0) { // P35_o_74f161_enp = 0; //外部计数器F161计数禁止 P30_io_74hc393_clr_hold = 1; //外部计数器HC393复位 P36_o_74f161_clr_n = 0; //外部计数器F161复位 _tl0 = 0x00; _th0 = 0x00; //内部计数器复位 hold = P30_io_74hc393_clr_hold; // HOLD(保持)键状态输入 P36_o_74f161_clr_n = 1; // 外部计数器F161有效(Enable) P30_io_74hc393_clr_hold = 0; // 外部计数器HC393有效(Enable) P35_o_74f161_enp = 1; // 外部计数器F161进行计数 } ////////////////////////////////////////////// if(int_state == 316) { // 10GHz状态(分频的预分频器) if (!P37_i_prescaler) { // 门控时间为0.秒 for (trimer = 0; trimer<202; trimer++) ; // 15个机器周期单位 // 测试信号24MHz输入 boat++; // 15360000 用于显示,需调整 boat++; // 延迟1个机器周期(12个时钟周期) boat++; // 15359988 boat++; // 15360000 // boat++; // 15360012 P35_o_74f161_enp = 0; // 外部计数器停止 trailer = _th0; trailer = (trailer << 20) & 0x0ff00000; task = _tl0; task = (task << 12) & 0x000ff000; trailer |= task; task = _p3; task = (task << 7) & 0x00000f00; trailer |= task; task = _p1 & 0x000000ff; trailer |= task; P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여 // 电流消耗, // 外部计数器将重新开始。 } } ////////////////////////////////////////////// if(int_state == 494) { // 100 MHz Mode 1 Sec Gate Time if (P37_i_prescaler) { // 1 Sec Gate Time for (trimer = 0; trimer<248; trimer++) ; // 15个机器周期单位 // 测试24MHz信号源输入 boat++; // 24000000 用于显示,需调整 boat++; // boat++; // boat++; // boat++; // 延迟1个机器周期(12个时钟周期) boat++; // 23999988 boat++; // 24000000 // boat++; // 24000012 P35_o_74f161_enp = 0; // 外部计数器停止 trailer = _th0; trailer = (trailer << 20) & 0x0ff00000; task = _tl0; task = (task << 12) & 0x000ff000; trailer |= task; task = _p3; task = (task << 7) & 0x00000f00; trailer |= task; task = _p1 & 0x000000ff; trailer |= task; P35_o_74f161_enp = 1; // 소비 전류가 일정하게 하기위하여 // 电流消耗,以时间表 // 外部计数器重新开始。 } } ////////////////////////////////////////////// if(int_state == 506) { // 1Hz数字显示 boat = trailer % 10; mfnd[7] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 507) { boat = trailer % 10; mfnd[6] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 508) { boat = trailer % 10; mfnd[5] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 509) { boat = trailer % 10; mfnd[4] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 510) { boat = trailer % 10; mfnd[3] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 511) { boat = trailer % 10; mfnd[2] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 512) { boat = trailer % 10; mfnd[1] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// if(int_state == 513) { boat = trailer % 10; mfnd[0] = segment_pattern[boat & 0xf]; trailer /= 10; } ////////////////////////////////////////////// int_state++; ////////////////////////////////////////////// if(int_state >= 514) { int_state = 0; if (hold) { fnd[0] = mfnd[0]; fnd[1] = mfnd[1]; fnd[2] = mfnd[2]; fnd[3] = mfnd[3]; fnd[4] = mfnd[4]; fnd[5] = mfnd[5]; fnd[6] = mfnd[6]; fnd[7] = mfnd[7]; if (P37_i_prescaler) { fnd[1] &= 0x7F; // MHz点 } else { fnd[0] &= 0x7F; // GHz点 } } } ////////////////////////////////////////////// } main() { _tmod = 0x15; // 0b00010101 Timer0 = Mode1, Counter, use TR0 // Timer1 = Mode1, Timer, use TR1 _tl0 = 0X0; _th0 = 0X0; _tl1 = 0X0; _th1 = 0X0; _tr0 = 1; // Timer 0 计数开始 _tr1 = 1; // Timer 1 计数开始 _et1 = 1; // 设置定时器1中断状态 _ea = 1; // 设置全局中断状态 while(1) ; } 源程序可到http://www.sample.co.kr/sefcntr/sefcntr.zip网页下载。 (1) Crossware.公司8051 编译器(演示版)的安装 创建一个c:\\estudio_demo\\Projects\\fcntr4文件夹,将文件解压到这个文件夹内。 (2) 在Crossware的File(文件)菜单上,单击Project Open(打开项目),选择C:\\estudio_demo\\Projects\\fcntr4\\fcntr4.xmk。 (3) 在Crossware的Build(建立)菜单中,选择Rebuild All开始汇编的源程序并创建fcntr4.hex文件。 (5) 可以采用Sample电子公司编辑的ATC51的SE-516SP文本(http://www.sample.co.kr/se516/index.htm) fcntr4,在8051编程器上进行编程。 Crossware公司的 8051 C 编译器(演示版)可以下载。能以“.HEX”文件的格式输出从起始部位(0000H)开始的( http://www.sample.co.kr/sefcntr/fnctr4.hex )。 4K 十六进制代码 ATC51,ATS51及ATC1051/2051/4051均带有4k闪存。 Crossware 8051 C 编译器( http://www.crossware.co.kr/setup-demo.exe ),已被选定为韩国产业工人协会( http://www.hrdkorea.or.kr/ )进行工程师及技术工人考试的指定编译器。 Crossware 8051 C 编译器手册(韩文)( http://www.crossware.co.kr/crossb.pdf ) 续(前置放大器部分) SE-PAMP 100兆赫前置放大器 输入阻抗100欧姆 低频100mV的信号,50MHz 〜 100MHz的2V信号经前置放大器放大到TTL电平。 10Hz 〜 100MHz的频段的输入阻抗是1兆欧姆。 100兆赫正弦波经TTL施密特触发器SN74AHCT14( 资料:http://www.sample.co.kr/sefcntr/sn74ahct14.pdf )进行脉冲整形。 超高频场效应管 2SK241( 资料:http://www.sample.co.kr/sefcntr/2sk241.pdf ) NEC公司的 5 GHz带宽的高速晶体管 2SC2570 ( 资料:http://www.sample.co.kr/sefcntr/2sc2570.pdf ) 前置放大器的元器件 前置放大器的电路图 续(预分频器部分) SE-PRSC 2.4 GHz的预分频器 输入阻抗:50欧姆 测量范围达10MHz 〜 2.4GHz的分频的预分频器。 输入灵敏度:100mV 采用Mini circuits(微电路)公司的单片超级宽带高频放大器集成电路。 输入阻抗为50欧姆。 Mini circuits(微电路)公司的宽带高频放大器 MAR-6 ( 资料: http://www.minicircuits.com/cgi-bin/spec?cat=amplifier&model=MAR-6&pix=vv 105.gif&bv=4 ) 富士通公司的2.4GHz的预分频器(可选择,128,256分频)MB506 ( 资料: http://www.sample.co.kr/sefcntr/mb506.pdf ) 预分频器的元器件 预分频器的电路图 续(其它) 用栅倾表测试频率计 测试100MHz模拟前置放大器 感应传递计数操作 可进行非接触的方式测量 频率为80MHz(G级)振荡信号接入计数器。 2.4G 预分频器测试 栅倾表测试频率计时用的线圈 价格 产品 说 明 价格 SE-FCNTR 100MHzTTL输入数字式频率计数器(DC~100MHz) 三万三千韩元 SE-PAMP 100MHz,1MΩ前置放大器(10Hz~100MHz) 两万两千 韩元 SE-PRSCR 2.4GHz,50Ω 分频 预分频器(10MHz~2.4GHz) 两万七千五百 韩元 *** 注意 *** (1)SE-FCNTR的价格,不包括适配器。 (2)SE-FCNTR 包括24MHZ振荡晶体。 (3)LED显示屏为红色(RED)发光管。 (4)SE-FCNTR ,SE-PAMP,SE-PRSCR均为包装,可根据需要选择购买。 (5)本计数器中的集成电路及其它无源器件均不单独销售。 (6)频率计中CPU(ATC51)计数器中所使用的HEX文件,是十六进制格式文件。
因篇幅问题不能全部显示,请点此查看更多更全内容