如何实现输入X个脉冲,输出N个脉冲?
发布网友
发布时间:2022-04-30 04:59
我来回答
共3个回答
热心网友
时间:2023-10-14 18:24
如果N不大X,比较简单,如果N虽然大于X,但不要求输出的N个脉冲间隔均匀,也简单。
如果N大于X,又要求输出的N个脉冲比较均匀,就有点复杂。
先说较简单的情况吧。
设一个变量V,初值约X/2。
每收到一个脉冲,就令V ← V+N;
每当V > X,就输出一个脉冲,且令V ← V - X。
即可。
按上述算法,如果N大于X,有可能出现刚做完V ← V - X后,依然满足V > X,就会马上再输出一个脉冲。于是脉冲的间隔就不均匀了。
如果你要想均匀,就需要根据一般的脉冲间隔,来设法安排延迟时间。这要根据实际的输入脉冲频度来具体考虑,难以规定一般方法。
上述算法的道理不难理解:
按上述算法,每输入X个脉冲,累计给V增量X*N,每输出N个脉冲,累计给V减量X*N,正好平衡。抵消后V恰好恢复原值。
给V设置初值约X/2的道理是:
既然V中每个X相当于一个输出脉冲,那么预先令V初值约X/2,也就相当于给输出预置了半个脉冲。这个效果,相当于在计算输出时“四舍五入”了。
如果不要这种“四舍五入”,只要令初值V=0即可。连续运行的宏观效果一样,只是刚开始略微迟后约相当于半个周期的时间。
热心网友
时间:2023-10-14 18:24
如果N不大X,比较简单,如果N虽然大于X,但不要求输出的N个脉冲间隔均匀,也简单。
如果N大于X,又要求输出的N个脉冲比较均匀,就有点复杂。
先说较简单的情况吧。
设一个变量V,初值约X/2。
每收到一个脉冲,就令V ← V+N;
每当V > X,就输出一个脉冲,且令V ← V - X。
即可。
按上述算法,如果N大于X,有可能出现刚做完V ← V - X后,依然满足V > X,就会马上再输出一个脉冲。于是脉冲的间隔就不均匀了。
如果你要想均匀,就需要根据一般的脉冲间隔,来设法安排延迟时间。这要根据实际的输入脉冲频度来具体考虑,难以规定一般方法。
上述算法的道理不难理解:
按上述算法,每输入X个脉冲,累计给V增量X*N,每输出N个脉冲,累计给V减量X*N,正好平衡。抵消后V恰好恢复原值。
给V设置初值约X/2的道理是:
既然V中每个X相当于一个输出脉冲,那么预先令V初值约X/2,也就相当于给输出预置了半个脉冲。这个效果,相当于在计算输出时“四舍五入”了。
如果不要这种“四舍五入”,只要令初值V=0即可。连续运行的宏观效果一样,只是刚开始略微迟后约相当于半个周期的时间。
热心网友
时间:2023-10-14 18:25
这个简单 就拿你所举的例子来说 单片机的
输1出6
#include "reg52.h"
bit flag;
void pluse() //输1出6
{
int m,n;//m为输入脉冲n为输出脉冲
n=6*m;
while(n!=0)
{
n--;
}
}
void pluse1()//输3出1
{
int m,n;//m为输入脉冲n为输出脉冲
if(m%3==0)
{
n=m/3;
while(n!=0)
{
n--;
}
}
}
main()
{
while(1)
{
if(flag==0)
pluse();
else
pluse1();
}
如果是plc的话自己去看左移的指令
}
热心网友
时间:2023-10-14 18:25
这个简单 就拿你所举的例子来说 单片机的
输1出6
#include "reg52.h"
bit flag;
void pluse() //输1出6
{
int m,n;//m为输入脉冲n为输出脉冲
n=6*m;
while(n!=0)
{
n--;
}
}
void pluse1()//输3出1
{
int m,n;//m为输入脉冲n为输出脉冲
if(m%3==0)
{
n=m/3;
while(n!=0)
{
n--;
}
}
}
main()
{
while(1)
{
if(flag==0)
pluse();
else
pluse1();
}
如果是plc的话自己去看左移的指令
}
热心网友
时间:2023-10-14 18:25
如果是周期性的可以测得周期后倍频。
热心网友
时间:2023-10-14 18:25
如果是周期性的可以测得周期后倍频。