最近我搞了个项目,用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。如何减小设计误差(不可能选择高主频的芯片的)。