查看: 262|回复: 9
打印 上一主题 下一主题

89c52中断的怪问题

[复制链接] qrcode

65

主题

333

帖子

735

积分

高级会员

Rank: 4

积分
735
楼主
跳转到指定楼层
发表于 2013-2-8 11:34 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近我搞了个项目,用89C52测频(不能改变的),单片机工作频率为12MHz,测量范围15HZ~16000Hz(这是没法子的,重点型号,只能用52),要求测量精度大于0.56%,采用可变多周期测量法,并使测量精度不低开0.03%,测量的总周期数可变。采样用的是INT0口,下降沿触发。编程采用KEIL51 9.00版本。proteus7.8。

设计要求:

测量范围15HZ~16000Hz

测量精度全量程0.56%

主频12MHz

看门狗使用timer1

等精度测量使用timer0

电机驱动使用timer2

掉电检测INT1

掉电检测50ms,超过保护,使用timer1

硬件很简单,输入整形,经光偶输入89C52,如下图,因为硬件资源全部用完,串行用的是移位寄存器方式,方式0 1MHz。所以没有用处。proteus中省去了输入电路,我需要的验证软件问题








问题出现了:在7000Hz以下,用KEIL51的仿真测量结果与理论值相近,误差小于0.03%,在7000Hz以上误差可怕,如下图输入频率14109Hz:





可结果为14280,为正差,在装上产品后发现为负差,误差都很大,我日这不完了,硬件不是我搞的,一查光偶的输出变形。可下图中KEIL51仿真问题在哪?







脉冲不正常,在外部中断0的引脚上有太多的空白,导致多周期测周法失败,误差太大(1.2%)。

以前我用KEIL51基本上是在计算机上软件仿真搞定,这次问题大了,不管硬件如何,软件我自己都有问题。


与理论值相差太大了,项目基本玩蛋,想了个办法,用proteus仿真(版本7.8),电路如下图:





超级简单,频率设置为14.109KHz,上升及下降沿时间设置为0ns。






上图左边鼠标处2FCB与371D差距太大,右边图中是INT0引脚的波形,可是为什么少了脉冲,有哪么多空白?这其实与Keil51中仿真结果一样,在INT0(P3.2)引脚上丢失了脉冲。

边上有个小弟问:脉冲与正弦有什么区别,传感器输出是什么?头一热,传感器是正弦,试下设置如下:










正弦波输入时,输出正常了,鼠标处有连续的3718数值,为什么??可是传感器输出是要整形为方波的,用正弦没用!


想到了正弦波不就是上升下降沿是斜的么???设置中断信号如下图(上升下降沿1ns):






修改中断参数上升及下降沿时间设置为1ns,结果如下图,中断脉冲正常了,得到的数据误差为万分之几,完全满足要求。

采用KEIL51+Proteus联合调试,结果如下:






蓝色的脉冲是测试用的数INT0中断次数的输出(一次中断输出一个)用以观察是否出错,将中断与响应组合后如下图:






显然,响应非常正确,而KEIL51中结果如何呢?在Proteus中输入频率14109Hz时,在KEIL51中输出如下图:






结过联调测试,软件仿真的结果表示,软件设计的误差为0.00036,满足设计要求。

总结:KEIL51与Proteus应该比较真实的反应了89C52系列的时序问题:

1、在KEIL51 的logic analyzer分析中,上升及下降沿应是0ns,而89C52的引脚不能响应上升及下降沿是0ns的脉冲,我试了一下,换为其它引脚上升及下降沿是0ns时,问题相同。

2、我还需要在硬件改进后验证:

a、在测量频率时,整形为方波太好反而不利?

b、与低频测量的区别

c、整形波形的转换速率就是多少最好?

SM8952(军级)就量这特性?能有更好的东西吗?这只有DIP40的!

我日啊!何时可以让我能选择贴片的????????????????

3、在keil51中改变主频为24MHz时高频误差减小约为12MHz的1/3,看来经典的89C52是太慢了,可是在设计中,测频时我关了其它的中断,测完又关了测量中断,只做计算,相互没影响,在protues中程序正常,但产品中误差很大。无法解释。

4、高频下INT0引脚上脉冲为何会丢失!

5、最高主频只能达到24MHz,指令周期0.5us。如何减小设计误差(不可能选择高主频的芯片的)。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

65

主题

333

帖子

735

积分

高级会员

Rank: 4

积分
735
沙发
 楼主| 发表于 2013-2-22 07:17 AM | 只看该作者
请做出实物,好调试,等精度频率测量                                                                                                                                                                       
回复 支持 反对

使用道具 举报

65

主题

333

帖子

735

积分

高级会员

Rank: 4

积分
735
板凳
 楼主| 发表于 2013-2-22 08:14 AM | 只看该作者
产品出了问题,找不到原因,所以用软件仿真。产品晶振为12MHz,用keil51 9.0版时,6000KHz以下误差正常,我的响应频率达要求20KHz,现在硬件响应带宽满足要求1Hz~16KHz,但高频测量误差太大,不知是软件还是硬件的问题。多周期测量时误差在实验室中应是负差,可产品的输出值在6000Hz以下为正差,以上为负差,当然6000Hz以下误差满足0.56%的要求,以上就不行了。
改变Keil51中主频为24KHz,误差会下降,与预期一样,但达不到protues中的效果。
回复 支持 反对

使用道具 举报

133

主题

393

帖子

923

积分

高级会员

Rank: 4

积分
923
地板
发表于 2013-2-25 01:34 AM | 只看该作者
频率测量,用单片机中断时有问题的,低频时无所谓,单当频率过高,会把CPU累死的!你可以CPU内部计数器与外部硬件计数器同步工作。采用T/M法,使用timer对外部频率进行计数,使用timer比较输出中断,当计数一定值时,使能外部引脚信号,启动外部计数器对固定参考频率计数,这样可以的!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

8

主题

102

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
5#
发表于 2013-2-27 01:02 AM | 只看该作者
我不能用T/M法的!现在的计算方法在低频和高频时精度很高,只是当输入频率高时,比如我只测量255个脉冲,在测量时其它子程序是关了的,测量完成,会关掉测量,只进行运算。 软件仿真中,这种方法是成功的,精度很高,但在产品中误差很大,找不到原因。
我说下吧:我测量后转换为步进电机的旋转角度,驱动指针,指示精度要求很高,0.56%,我软件的设计精度确实达到了0.05%,可产品在高频时就不行,还要搞个分段补偿,晕死了!!!
也就是就说线性测量,测量结果成了非线性。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
6#
发表于 2013-3-20 10:09 AM | 只看该作者
楼主还挺专业的啊! 又是仿真,又是理论算法!我设计可没这么认真,值得学习!但几个问题,1、你用的51架构的MCU主频12Mhz,要测量16Khz是不是有点难度啊?!除去指令周期也就2-6MHz,全部用于测量都好像有点勉强啊!2、好像你还有其他功能,不知道是否用到中断,51架构的中断好像并不是正真的中断,引发中断后要是有其他中断被引发,会打断前面的中断的,这样消耗的指令周期,有可能对测量产生影响;我有次做PWM控制时就出项这种现象;3、听说你用光耦接入的,不知道用的是那种光耦,光耦可是有延迟的,差的光耦延迟可是ms级的,超过10KHz频率都没信号了,不知道对测量有没影响。                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

9

帖子

22

积分

新手上路

Rank: 1

积分
22
7#
发表于 2013-3-20 11:25 AM | 只看该作者
89C52的效率太低了,换成ATMEGA16或者别的精简指令集的芯片效果会好很多,51系列的单片机主频虽然高但是指令周期太长,一次中断的响应时间太长.                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
8#
发表于 2013-3-20 12:32 PM | 只看该作者
以下是引用小可哥在2013-2-25 下午1:34的发言

主题:89C52的效率太低了,换成ATMEGA16或者别的精简指令集的芯片效果会好很多,51系列的单片机主频虽然高但是指令周期太长,一次中断的响应时间太长.

殿堂级ID出现,合影留念!

回复 支持 反对

使用道具 举报

65

主题

333

帖子

735

积分

高级会员

Rank: 4

积分
735
9#
 楼主| 发表于 2013-3-20 02:16 PM | 只看该作者
频率高时候的误差,其分布的规律如何呢?因为51的定时器没有捕捉的方式,中断处理上可能误差另外高频时+-1的计数误差在总误差中相对会更大                                                                                                                                                                       
回复 支持 反对

使用道具 举报

133

主题

393

帖子

923

积分

高级会员

Rank: 4

积分
923
10#
发表于 2013-3-20 03:45 PM | 只看该作者
51的频率是低了 毕业后直接改用AVR了 现在的ARM系列价位也高不到哪里为什么要指定单片机型号呢,还有你那个光耦是否考虑换一个型号,光耦有一个响应参数的,有低速光耦和高速光耦之分。                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表