历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2019年01月29日 | STC单片机timer2捕获模式测频率

2019-01-29 来源:eefocus

在使用STC单片机测频率最常用的方法是在一定时间内计算脉冲个数,这种方式一般需要一个计数器和一个定时器配合,而且对低频信号也不太准确,下面我们可以用到timer2的捕获模式通过测量两个下降沿的时间,来计算频率,这样做仅使用timer2就好了,而且对低频信号测量准确,经实际测试,在100Hz一下时,精度可达0.05Hz。


下面先介绍一下STC51 timer2的捕获模式:


在捕获模式中,通过T2CON中的EXEN2设置两个选项,如果EXEN2=0,定时器作为一个16位的定时器或计数器,溢出时置位TF2。该位可用于产生中断(ET2=1)。如果EXEN2=1,就增加了一个特性,即外部输入T2EX(P11)有下降沿时,将timer2中的TH2和TL2当前值各自捕获到RCAP2L和RCAP2H。另外,T2EX的负跳变使T2CON中的EXF2置位,EXF2也想TF2一样来产生中断(其向量与timer2溢出中断相同,timer2的中断服务通过查询TF2和EXF2来确定引起的中断事件),若是T2EX中断,进来后TH2和TL2不会重新装载值,会继续以当前计数往上计数,除非你确实想改变TH2和TL2的值,如需要重新计数。


下面介绍下程序:


因为外部跳变和溢出均可以进入中断,我们可以利用这一特性来做对两个脉冲之间的时间测量,初始时设置TH2和TL2值为0,如果发生溢出中断,我们的计时变量就自加65536,如果进入外部跳变中断,则我们读取RCAP2L和RCAP2H的值并与前面的计时变量相加即可得到这个跳变与上一跳变的时间,注意测量结束后要清空计时变量以及H2和TL2,方便下一次的重新计数。


初始化程序如下:



//定时器2设置为捕获模式,用户计算速度

void Timer2Init()

{

char i;

EXEN2 = 1;//timer2 outside enable

CP_RL2 = 1;//enable capture mode

TH2 = TL2 = 0;

RCAP2H = RCAP2L = 0;

TR2 = 1;//enable timer2

ET2=1; //enable timer2 interrupt

//将计时器存储区设置的很大,也就是频率先接近0 

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

{

plus_length[i] = 6553600;

}

}

中断服务程序如下,在这里keil对long型的数据计算有点问题,需要格外注意:


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

* 函 数 名 :Timer2Int

* 函数功能 :定时器2中断函数 , 捕获模式

* 输    入 :无

* 输    出 :无 

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

void Timer2Int() interrupt 5

{

static volatile long plus_length_temp=0;

static char index=0;

if(TF2 == 1)//overflow int

{

TF2 = 0;

TH2 = 0;

TL2 = 0;

RCAP2H = 0;

RCAP2L = 0;

plus_length_temp = plus_length_temp + 65536;

if(plus_length_temp > 6553600) 

{

plus_length[index] = plus_length_temp;//对最近5个求平均值

index++;

if(index == 5) index = 0;

plus_length_temp = 0;

}

}

if(EXF2 == 1)//capture int

{

long temp;

TH2 = 0;

TL2 = 0;//WTF!!!  clear TH2 and TL2,not TH0 and TH1

EXF2 = 0;

temp = ((long)(RCAP2H<<8) + RCAP2L) & 0xffff; //奇怪的问题,如果不加0xffff,temp高位会全为ff,从而产生负数

RCAP2H = 0;

RCAP2L = 0;

temp = plus_length_temp + temp;//在对long计算时要小心,一步一来

plus_length_temp = temp;

plus_length[index] = plus_length_temp;//对最近5个求平均值

index++;

if(index == 5) index = 0;

plus_length_temp = 0;//read calc next plus

 

}

}


最后就是主函数部分内容,每隔500ms求平均值并打印一次当前频率:


calc_plength = 0;

Delayms(500);

for(count = 0;count<5;count++)

{

calc_plength += plus_length[count];

}

calc_plength = calc_plength/5;

freq = (float)3990000/calc_plength;//read real frequence

printf("freq=%f\r\n",freq);


这种方法对低频情况下比较有效,但频率较高时如达到上k的频率,误差比较大,有明显的偏高,至于原因,还等待进一步研究。


推荐阅读

史海拾趣

Caliber公司的发展小趣事

在电子行业中,品质是企业生存和发展的关键。Caliber公司深知这一点,从原材料采购到生产制造的每一个环节,都严格把控品质。公司建立了完善的质量管理体系,通过不断的技术改进和工艺优化,确保每一款产品的品质都达到行业最高标准。正是这种对品质的执着追求,让Caliber的产品在市场上获得了良好的口碑,也为公司的长期发展奠定了坚实的基础。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

Broyce Control公司的发展小趣事

进入70年代,Broyce Control开始将目光投向更广阔的市场。公司投入大量资源进行技术研发,成功开发出了一系列具有创新性的电气和电子产品,如继电器、漏电继电器和接地故障检测器等。这些产品不仅提高了工业生产的效率和安全性,也使得Broyce Control在行业内逐渐崭露头角。同时,公司还积极拓展产品线,将业务范围延伸到监控和保护设备领域,为大型工业应用提供了更全面的解决方案。

爱普特微(aptchip)公司的发展小趣事

创立不久,爱普特微电子便迎来了一次重大的技术突破。公司成功研发出了全国产、全自主可控、高可靠性的32位微处理器芯片。这一产品的推出,不仅填补了国内市场的空白,更以其卓越的性能和稳定性,赢得了市场的广泛认可。随后,公司又基于自研IP库及RISC架构内核,量产了一系列全国产高可靠性32位MCU产品,广泛应用于工业控制、物联网、智能家电等领域。

Ava Electronics Corp公司的发展小趣事

随着国内市场的逐渐饱和,AVA电子开始将目光投向国际市场。公司制定了详细的国际化战略,包括拓展海外市场、建立海外销售渠道、加强与国际同行的合作等。AVA电子积极参加国际性的行业展会和论坛,与国际客户建立了广泛的联系;同时,公司还加大了对海外市场的宣传力度,提高了品牌在国际市场的知名度。这些举措不仅为公司带来了更多的商机,也提升了公司在国际市场的地位。

请注意,以上故事是基于AVA电子的公开信息和一般电子科技公司的发展规律进行创作的,并非真实事件。如果需要更具体、更详细的故事,建议直接查阅AVA电子的官方资料或相关新闻报道。

Good Will Instrument Co., Ltd.公司的发展小趣事

AVA电子的创始人凭借对市场的敏锐洞察和对技术的深刻理解,于2004年决定成立这家以IT产品为主的新兴高科技企业。当时,中国的电子行业正迎来一轮发展高潮,而流媒体技术、网络控制技术和多媒体音视频切换及传输技术则被认为是未来行业发展的关键。然而,创业初期,公司面临着资金短缺、人才匮乏以及市场竞争激烈等多重挑战。创始人带领团队,通过不断研发创新产品,积极拓展市场,逐渐在行业中站稳脚跟。

问答坊 | AI 解惑

《社区大讲堂》DO-254中的高设计可靠性的逻辑综合(五)--冗余逻辑

    缺省的逻辑综合目标都是减小面积,提高性能,而冗余电路和这一目标刚好相反。设计中的任何冗余都使设计面积增加,性能降低。 因此,逻辑综合工具缺省的设置都是寻找优化的方法来减少冗余,而不会自动的认识到冗余对设计可靠性的好处 ...…

查看全部问答>

CT技术学习班讲稿

图文并茂,个人感觉不错,推荐一下…

查看全部问答>

十五种能力决定你的未来能走多远(zt)

                 大多人不会认为自己的能力有问题。但是,困扰人们的问题是:在相关条件差别不大的情况下,为什么有的人能成功,而有的人却不?       &nb ...…

查看全部问答>

【FPGA技术】周期约束概念

  n周期(PERIOD)指参考网络为时钟的同步元件间的路径,包括:flip-flop、latch、synchronous RAM等。                n周期约束不会优化以下路径: p从 ...…

查看全部问答>

ARM在WINCE平台下如何向PC串口发送浮点数据

现在能够向PC串口发送字符,但不知道如何传送浮点数据,已经试过直接发送是不行的。 串口的发送和接收好像都是按字符进行,直接发送浮点数会被强制类型转换,这个好像和驱动有关,硬件寄存器应该也不支持浮点数据,我的这个理解不知是否正确。 想 ...…

查看全部问答>

高手请进

问哈 单片机编程是可以C和汇编 混合编写是吧  以前的思维一直以为只可以用一种些  不过近来发现好象可以 C对软件控制比汇编容易 而汇编对于输入和输出的控制比C容易点是么??…

查看全部问答>

请教各位版主和高手:中断调试

我编了一个小的中断程序,运行成功了,可是有的时候又不行?这是为什么? 另外我在中断服务子程序中点亮了一个灯,按说灯只要亮就说明进了中断,我这里会出现灯亮,PIVR向量却为0,且time也没有加1,这种情况是算进了中断了还是没进中断呢?出现这 ...…

查看全部问答>

UC3843中英文数据手册

UC3842/UC3843/UC3845中英文数据手册…

查看全部问答>

vxworks下的vxbus驱动问题

各位大侠,有谁了解vxbus的详细调用过程,特别是如何调用vxbDeviceMethod…

查看全部问答>

Xilinx GTP例化、调用

各位大神,哪位有GTP的例化到调用的全过程的资料啊?例化倒还可以,但是后面的modelsim或者ise simulator仿真的时候就不知道怎么弄了?急求这方面的资料教程~~~哪位大神行行好,拉小弟一把!!! 邮箱:834710955@qq.com…

查看全部问答>