回复:如何准确的测量多个频率(或转速)?

已锁定

手机用户20230828277407

  • 帖子

    9
  • 精华

    0
  • 被关注

    0

论坛等级:新手

注册时间:2023-08-28

普通 普通 如何晋级?

发布于 2023-09-27 17:32:53

25楼

展开查看
以下是引用winter938在2023-09-26 19:50:22的发言 >24楼

以下是我的测试程序,硬件上Q0.0接线到I0.0,I0.0滤波选了最小的0.2us



ORGANIZATION_BLOCK MAIN:OB1

TITLE=程序注释

BEGIN

Network 1 

// Q0.0以20us周期10us脉宽输出脉冲(50KHz)

LD     SM0.1

MOVB   16#81, SMB67

MOVW   20, SMW68

MOVW   10, SMW70

PLS    0

Network 2 

// I0.0接收Q0.0输出脉冲进行计数,在计数到1000000进入中断0

LD     SM0.1

LPS

MOVB   16#F8, SMB37

MOVD   0, SMD38

MOVD   1000000, SMD42

HDEF   0, 0

ATCH   INT0, 12

AENO

ENI

LPP

HSC    0

Network 3 

// 以250ms为周期产生定时中断,每隔250ms进入中断1

LD     SM0.1

MOVB   250, SMB34

ATCH   INT1, 10

AENO

ENI

END_ORGANIZATION_BLOCK

SUBROUTINE_BLOCK SBR_0:SBR0

TITLE=子程序注释

BEGIN

Network 1 

// 程序段注释

END_SUBROUTINE_BLOCK

INTERRUPT_BLOCK INT_0:INT0

TITLE=中断例程注释

BEGIN

Network 1 

// 计数中断读HC0当前值获得中断响应延迟

LD     SM0.0

MOVD   HC0, VD0

END_INTERRUPT_BLOCK

INTERRUPT_BLOCK INT_1:INT1

TITLE=中断例程注释

BEGIN

Network 1 

// 250ms定时中断获取当前HC0值减去上次值从而计算出两次定时中断期间HC0的计数差

LD     SM0.0

MOVD   HC0, VD4

MOVD   VD4, VD12

-D     VD8, VD12

MOVD   VD4, VD8

Network 2 

// 程序段注释

END_INTERRUPT_BLOCK




从监控数据看高计中断响应延迟在60us 左右,250ms 的定时中断读得的高计差值在12500。当脉冲频率提升到100KHz时高计中断响应延迟仍在60us 左右,250ms 的定时中断读得的高计差值在25001.数据是符合预期的。

1、      谢谢分享代码。试过了,我这里的测试不理想,中断响应时间还是很长,而且定时中断读差值也跳得厉害。原因找到了,我第一次用PLC,找朋友拿来试的,现在说是一台没有绿标的,是一台国产的。

      你这个思路挺好的,用一次HSC0的比较中断,在中断中再读HC0值来得到中断响应时间。学习了。谢谢一起研究,也谢谢各位回复的朋友。

2、这台国产的,暴露了三个问题,一个是时基不准;另一个是中断里读HC0的值算差值跳变得历害(差很多);还有一个是HSC复位影响计数。最后一个问题,按网友说法,可能原装的也有。最终等我搞到原装的,这几方面再验证一下。

3、主帖是我第一次发帖,是一段一段粘上去的,现在看了winter938发的,质量比我的好。研究了一下,是通过导出.awl文件来的,winter938的程序我也是修改成这种文件导入的。所以,我是新手,要不断学习。

4、发一次贴,还是要有始有终,我也把最新程序全部帖上来。有需要的建一个文本文件,复制贴上去,改后缀为.awl,用STEP 7-MicroWIN SMART导入就好了。我用的是V2.7。

   硬件接线是:

           Q0.1接I0.0(Q0.0估计坏了,产生不了PWM了),产生和测量标准1khz

           Q0.3接I0.3和I0.6,频率自己去变,当作被测频率。

           Q0.5接随便哪个没用的输入,形成回路。比较中断中取反立即输出,用于仪器测真实周期。

  输入滤波是I0.0\I0.3\I0.6选0.2ms,后面打勾。

  调试时图表状态看的地址是:

         VD4            1000次比较中断后再读的HC0值,真实时间,这台PLC是1012/1013(次或ms)

        VD20           中间间所用的系统时间间隔。这台是864(ms)

        VD8 /VD24   被测脉冲差值。 这台是1012/1013(次)


ORGANIZATION_BLOCK MAIN:OB1

TITLE=PWM1用于产生标准频率,输出口Q0.1(不用PWM0,因为Q0.0坏了)

// PWM2用于产生被测频率,输出口Q0.1

// 用三个高速计数器,其中,HSC0脚位I0.0接Q0.1,并用比较1000次中断,用于获得准确时间

// HSC3和HSC4用于测试被测频率,输入口分别是I0.3和I0.6

// 中断里HSC3和HSC4不要重置。重置就测不准。主程序里算前后两次的差值

BEGIN

Network 1 

// 程序段注释,

LD     SM0.1

CALL   SBR0

CALL   SBR3


CALL   SBR1

CALL   SBR2

CALL   SBR4

BITIM  VD12

ENI

Network 2 

LD     SM0.5

DISI

MOVD   VD16, VD20

MOVD   VD4, VD4

MOVD   VD32, VD8

-D     VD28, VD8

MOVD   VD40, VD24

-D     VD36, VD24

ENI

END_ORGANIZATION_BLOCK

SUBROUTINE_BLOCK PWM1_gen:SBR0

TITLE=产生标准1kHz,由Q0.1输出,提供给I0.0主速计数。1000次产生中断INT12,实际时间间隔是1012/1013。

BEGIN

Network 1 

// PWM::时基1us,周期1000us,脉冲宽度500us。即50%占空比。高速脉冲0,Q0.1直接输出

LD     SM0.1

MOVB   16#80, SMB77

MOVW   1000, SMW78

MOVW   500, SMW80

PLS    1

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK HSC0_INIT:SBR1

TITLE=I0.0高速计数初始化。接输入源Q0.1,其是1kHz输出。目的是得到比较准确的时间。

// 初始化里后设置开中断(主程序里),1000次达到时中断,12号,中断子程序INT_12。

// 实际并不是1000次,中断里取数是1012/1013次。

// 

BEGIN

Network 1 

// 要在程序中启用该组态,请在MAIN主程序中使用SM0.1或者沿触发指令调用一次该子程序。

// 针对组态 HC1 模式 0;CV = 0; PV = 100; 加计数; 

// 启用中断并启动计数器.

// 

LD     SM0.0

MOVB   2#11111100, SMB37           //置位控制位: 加计数; 已启用; 

MOVD   +0, SMD38                   //装载 CV

MOVD   1000, SMD42                 //装载 PV

HDEF   0, 0

ATCH   INT0, 12

HSC    0

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK HSC3_INT:SBR2

TITLE=高速计数,PV无所谓,不开中断。I0.3,模式0,加计数

BEGIN

Network 1 

LD     SM0.0

MOVB   2#11111100, SMB137          //置位控制位: 加计数; 已启用; 

MOVD   +0, SMD138                  //装载 CV

MOVD   10000, SMD42                //装载 PV

HDEF   3, 0

HSC    3


END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK PWM2_gen:SBR3

TITLE=产生频率,用于模拟被测信号。可以改改频率多次试验

BEGIN

Network 1 

// PWM::时基1us,周期和脉宽为XXX。即50%占空比。高速脉冲2,Q0.3直接输出

LD     SM0.1

MOVB   16#80, SMB567

MOVW   500, SMW568

MOVW   150, SMW570

PLS    2

END_SUBROUTINE_BLOCK

SUBROUTINE_BLOCK HSC4_INT:SBR4

TITLE=高速计数,PV无所谓,不开中断。I0.6,模式0,加计数

BEGIN

Network 1 

LD     SM0.0

MOVB   2#11111100, SMB147          //置位控制位: 加计数; 已启用; 

MOVD   +0, SMD148                  //装载 CV

MOVD   10000, SMD152               //装载 PV

HDEF   4, 0

HSC    4

END_SUBROUTINE_BLOCK

INTERRUPT_BLOCK INT_12:INT0

TITLE=HSC0达到1000次产生中断。理论上是1s,实测是1012/1013,方法是一次中断完成一次输出Q0.5取反。频率计测量2026ms。

// 程序里同时获取系统ms值,只有864,说明系统标示1ms比实际慢。864/1000=1172,正好跟用中断0的方案高速计数1kHz得到1172相符。

// 每次中断复位HSC0.

// 千万不要HSC3/HSC4复位,它们用于外部转速脉冲次数测量,复位测不准,分别是971和985。

BEGIN

Network 1 

// 此段用于计算两次中断间的系统计时差(ms)

LD     SM0.0

CITIM  VD12, VD16

BITIM  VD12

Network 2 

// Q0.5输出,在每次中断里取反立即输出。可以用频率计实测实际采样时长,是1013的两倍。

LD     SM0.0

INCB   VB1

AB>=   VB1, 2

=I     Q0.5


MOVB   0, VB1



Network 3 

// 程序段注  释

LD     SM0.0

MOVD   HC0, VD4

MOVD   VD32, VD28

MOVD   VD40, VD36


MOVD   HC3, VD32

MOVD   HC4, VD40




MOVB   2#11001100, SMB37

MOVD   +0, SMD38

HSC    0




Network 4 

LD     SM0.0

CRETI

END_INTERRUPT_BLOCK




再次谢谢大家!

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有9465条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。