• 正文
  • 相关推荐
申请入驻 产业图谱

博途SCL编程—编码器转动圈数和单圈脉冲数计算算法

2小时前
28
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

引言

本次深入讲解了编码器转动圈数和单圈脉冲数的计算方法,强调了其与编码器转速测量、线速度测量以及高速计数器的紧密联系。详细分析了编码器分辨率和倍频系数对单圈脉冲数的影响,并通过积分求和算法确保了计算的准确性。同时,介绍了高速计数器的配置、输入输出接口和中断时间设置,并提供了通过代码实现这些功能的具体指导。

这篇文章我们介绍编码器转动圈数和单圈脉冲数计算FB这节课和我们之前的编码器转速测量、线速度测量都是和编码器相关,并且也都和高速计数器相关。

下面我们看一下我们所实现的这个功能,这里就是我们这样的转动圈数和单圈脉冲数计算的一个FB。我们转动一下我们这样的编码器,这里我们是在反转,正转之后大家可以看到我们的这个圈速它在不断的累积,单圈脉冲数它也在不断的累积。这里我们编码器分辨率是2000,我们开的倍频是四倍频。所以大家可以看到单圈脉冲数它不会上到8000,超过8000之后它就又变为这样的一个零。但是我们累积的圈数都会增加,这就是我们要实现的这个功能,这里我们要实现的这样的一个功能。

我们相关的参数就是编码器分辨率,倍频系数。这个就是我们功能块的它的一个作用。我们输入是这样的高速计数器的值,我们看一下我们的接口,这里的周期是指我们这样的 一个计算周期。下面还有一个中断时间,是我们这样的功能块,他在OB30里面去调用的,这个中断时间我们是10毫秒。

这边我们介绍一下我们这样的一个高速计数器它的一个配置。我们在之前的课程也给大家介绍了高速计数器。这边我们需要开启这样的一个高速计数器1,并且计数类型选择计数,工作模式我们选择四倍频,初始技术方向我们就选用这样的一个加计数,大家也可以选择减计数,无非就是一个转动方向不一样,它是加或者是减。

高速计数器配置好之后,我们对我们这样的一个输入输出,它的一个截止频率这边要设置一下默认。如果大家不设置的话,我们转动速度快,它是没有办法进行采集的。

最后这里的输入地址,大家在这边一定要选自动更新。如果你选无的话,这样的一个高速计数器的值它不会更新。你在调试的时候,你会发现你的这个ID1000,你在转动编码器的时候它并不会更新。因为我们刚刚这里的配置,这里的刷新,我们要选择自动刷新,自动更新。这里的高速接触器的配置就介绍完了。

下面我们看一下代码,介绍一下代码这部分代码是如何实现的,代码的一个算法。

接口部分我们先介绍一下,第一个是我们这样的一个外部输入的一个复位。我们复位引脚闭合之后,我们当前转动的圈数和当前脉冲数都变为零。

这边我们可以测试一下,这边都是零,但是我们编码器当前的这个脉冲数它并不会变,不会影响我们是一个增量式的。我们这时候再转的话,它还是会记录下来一个转动圈数和这样一个单圈卖整数。

这里我们是利用了这样的一个积分求和,积分求和我们累计相邻采用时间这边的一个脉冲上对它进行一个累加。这样的话我们就可以记录这样的一个从当前时刻的一个累积脉冲值。而且这样的一个累积脉冲值它和高速计数器的这个值没有什么关系。我们是累积这样的一个差值,实现这样的一个积分求和,对它进行一个求和。

输入参数介绍完了,我们输出参数,这里diMulti_Turns就是我们的转动圈数,下面diPulse是我们单圈脉冲数。这里是我们计算周期,它的单位是毫秒。

IF #Count >= #diCycle THEN

#Delta := #diHC - #LastHC;

这时候我们看一下代码,首先我们这样的一个中断计时,当我们的计算周期到达的时候,我们开始计算这样的一个脉冲差。当前时刻的高速计数器的值减去上一时刻

#diCountSum := #diCountSum + #Delta;

之后我们对它进行累加,累加求和得到我们总的脉冲数

#diMulti_Turns := #diCountSum / (#iEncoder * #iFactor);

这时候我们的转动圈数就利用这样的总的脉冲数除以我们单圈的一个脉冲量。我们编码器是2000分辨率,倍频系数是4,也就是8000转一圈产生8000个脉冲。我们利用总脉冲除以这个8000,也就是得到了我们这样的一个转动圈数

#diPulse := #diCountSum MOD (#iEncoder * #iFactor);//求余

下面我们要计算不足8000的时候,它这样那个单圈里面那个脉冲数这里我们是利用了这样的一个总的脉冲数除以这样的一个八千,然后我们对它进行求余。因为除以8000除不尽,我们的余数就是我们这样的一单圈所在的这个位置值。

#LastHC := #diHC;

#Count := 0;

END_IF;

#Count :=#Count + #diINT_Time;//中断计时

IF #bReset THEN

#diCountSum := 0;

END_IF;

计算完了这样的一个圈数和我们这样的一个单圈里面这样的一个脉冲数之后,我们需要更新我们这样的高速计数器的值之后,我们这个计时归零这样的一个计算周期,结束我们这样的一个中断计时。在中断程序里面对这样的一个中断时间进行累加,时间大于等于我们的计算周期之后,我们开始计算这样的一个编码器的一个旋转圈数和单圈脉冲数。当然了我们还增加了一个外部复位接口,这里的复位我们可以将我们的累计脉冲进行清0。这个就是我们知道那个编码器转动圈数和断圈脉冲数计算的这个方法。我们利用了这样的一个求和累加求和的一个方法。

这里关于我们这样的编码器转动圈数和单圈脉冲数的功能块就介绍到这里。最后我们再给大家看一下完整代码:

IF #Count >= #diCycle THEN    #Delta := #diHC - #LastHC;    #diCountSum := #diCountSum + #Delta;    #diMulti_Turns := #diCountSum / (#iEncoder * #iFactor);    #diPulse := #diCountSum MOD (#iEncoder * #iFactor);//求余    #LastHC := #diHC;    #Count := 0;END_IF;
#Count :=#Count + #diINT_Time;//中断计时IF #bReset THEN    #diCountSum := 0;END_IF;

 

相关推荐