二、软件方面:
1、思路:将内部高速计数器的上限值设得足够大,使设备运行到复位开关处复位前不至于由于达到计数上限而重新计数,引起不必要的麻烦。另外,对于测速,主要用于三菱plc的spd指令(测速),该指令的应用格式是:spd
d1
d2
d3,将d1(输入口x0或x1,假定为x0)在拿首d2(如k1000,指1000ms,即野敏做1s)时间内输入的脉冲数送入d3,因而d3内数值的意义就是在刚刚过去的1s内输入的脉冲数。另外你再算出电机旋转一周旋转编码器输出多少脉冲,电机旋转一周装置运行多少米,对应算出一个脉冲装置运行多少米,假定为k米,接下来,将d3中数值与k相乘,即为1s内装置运行的距离,也就是速度。颂衡
2.关键程序:spd
x0
k1000
d3
每过1秒钟,将x0输入的脉冲数送给d3
mul
d3
k
d4
d4内数值即为速度
另外,当运行到复位开关(常开)处时复位计数器
这个说白了就是测量脉冲的个数,也就是理想方波的频率。旅毁虚给你一个测频率的程序,仅供参考
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
float f=0
uchar LED0_data,LED1_data,LED2_data,LED3_data
uchar i=0
uchar code Segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
void display()
void delay(uint v)
void initime()
/*定时器初始化*/
void initime()
{
TMOD=0x51 //T1计数余郑器,T0定时器,方式1
TL0=(65536-10000)%256
TH0=(65536-10000)/256
TL1=0
TH1=0
ET0=1
EA=1
}
/拆燃*延时子函数*/
void delay(unsigned int c)
{
unsigned int i,j
for(i=0i<ci++)
for(j=0j<100j++)
}
/*将十进制数拆成送数码管的显示码*/
void dectobit(int dec)
{
LED3_data=dec/1000
dec=dec % 1000
LED2_data=dec/100
dec=dec % 100
LED1_data=dec/10
dec=dec % 10
LED0_data=dec
}
/*显示程序*/
void display()
{
P0=Segcode[LED3_data] //个位
P2&=~0x01
delay(10)
P2|=0x01
P0=Segcode[LED2_data] //十位
P2&=~0x02
delay(10)
P2|=0x02
P0=Segcode[LED1_data]
P2&=~0x04
delay(10)
P2|=0x04 //百位
P0=Segcode[LED0_data] //千位
P2&=~0x08
delay(10)
P2|=0x08
}
void main(void)
{
initime()
TR0=1
TR1=1
while(1)
{
dectobit(f)
display()
}
}
timer()interrupt 1 using 2
{
i=i+1
if(i==100)
{ i=0
f=TH1*256+TL1
TL1=0
TH1=0
}
TL0=(65536-10000)%256
TH0=(65536-10000)/256
}
编码器计算设定春薯
1.所需分辨率:测量轮:周长200mm,精度0.1mm 分辨率R=周长/精度=2000P/R
2.所需响应频率:速度=1000rpm,所需分辨率3600I/U(分辨率)响应频率Fmax=(速度*分辨率)/60=600KHZ
3.最大响应频率:(最大铅陪响应转速rpm)/60*
(脉冲数/转)=输出频率HZ
4.最大响应转速:(最大响应频率HZ )/(槐森蠢脉冲数/转)*60=轴的转速rpm
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)