Ⅰ 在被动测速系统中,单片机(52/51)是如何完成速度计算的单片机高手近来求解!
偶知道了。楼主说的是这么一个东西。就是车辆经过一个传感器的时候,输出一个信号。这时开始计时。然后,车辆经过另外一个传感器的时候,停止计时。然后,由仪器显示车辆的速度。
这个东西在第一个传感器有输出的时候开定时,然后直到下一个传感器输出信号后就停止计时。因为两个传感器的距离是一定的。所以,速度就是距离除以用时了。比如,距离是10米。用时为10秒。那么,速度就是10米/10秒=1米每秒。在程序中,进行数学运算,一米一秒,那么1分钟就是60米。一小时就是3600米。最后,就会得到速度值为3.6千米每小时了。
所以,程序的运行就是这样的。接收到第一个传感器的信号后,开始计时。接收到下一个传感器的信号后,停止计时。然后调用数学运算的程序。将记得的时间值转化为速度值。最后显示到数码管上就可以了。
Ⅱ 西门子plcs7-200SMART SR20怎么编写测速程序
编写方式如下:
要是用的是测速电机的话,得用电压变换模块通过AD模块输入PLC,得测一下实际转速和测速电机的电压对应关系,然后根据测量的电压计算出电机转速。如用编码器,根据编码器一转的脉冲数,单位时间内(如1秒做为一个测量周期)测量所得的脉冲数计算出实际每分钟的转速。再用比较指令判定输出即可。
Ⅲ 编码器测速原理,要单片机实现,怎么通过脉冲数跟速度联系起来(转轴半径已知),请具体,最好有程序,谢谢
400表示转一圈来的脉冲数是4000 脉冲个数越多测量精度越高。
单片机主要是通过定时器定时1秒或1分钟,同时利用计数器对光电编码器的脉冲计数,
每当定时时间到,就读出计数器的脉冲个数,计数出单位时间的脉冲个数除以转一圈来的脉冲数,
就是电机的转数。
如:在单位时间1秒内,计数脉冲为 80000个 即80000个脉冲/每秒
可以推出: 20转/每秒 即 1200转/分
呵呵 满意 就选满意回答啊
Ⅳ 51单片机开发板和绝对式编码器连接测量角度的程序
#include <reg52.h>
#include "inc/delay.h"
#include "inc/hc595.h"
#define uchar unsigned char
#define uint unsigned int
sbit PIN_ROTARY_A = P2^0; //引脚1接口
sbit PIN_ROTARY_B = P2^1; //引脚2接口
sbit PIN_ROTARY_C = P2^2; //按下的接口
sbit PIN_ROTARY_D = P2^3; //按下的接口
//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 存储待发送的数据 */
/* 1->8的段码表 */
code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/* 位码表 */
code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d};
uchar count = 0;
uchar flag;
uchar Last_BMB_status;
uchar Current_BMB_status;
void display()
{
uchar i;
dis_XS[0] = ucDis_Segmentcode[count/100]; //百位
dis_XS[1] = ucDis_Segmentcode[count%100/10]; //十位
dis_XS[2] = ucDis_Segmentcode[count%10]; //个位
if(i < 2)
{
i++;
}
else
{
i = 0;
}
// for (i = 0; i < 3; i++ )
{
Send_Data(dis_XS[i], ucDis_Bitcode[i]);
//PIN_ROTARY_D = 0;
// Delay1ms(1);
}
}
//************************************************
void main()
{
TMOD=0x01; //定时器0,工作方式1
TH0=0xD8;
TL0=0xF0; //给定时器装上初值,10ms中断一次
ET0=1; //打开定时器中断
EA =1; //打开总中断
TR0=1; //启动定时器0
while(1)
{
//display();
Last_BMB_status=PIN_ROTARY_B;
while(!PIN_ROTARY_A) //BMA为低电平时
{
Current_BMB_status = PIN_ROTARY_B;
flag = 1; //标志位置为1说明编码开关被旋转了
}
if(flag == 1)
{
flag = 0; //时刻要注意这一点!给标志位清零
if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转
{
count++;
if(count == 255)
{
count = 0;
}
}
if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转
{
count--;
if(count == 0)
{
count = 255;
}
}
}
}
}
//***********************************************
void timer0() interrupt 1//定时器0的中断服务程序
{
TH0=0xF8; // TH0=0xD8;
TL0=0xF0; //再次装入初值
display(); //每隔10ms显示一次
if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零
{
count = 0;
}
PIN_ROTARY_D = !PIN_ROTARY_D;
}
Ⅳ STM32 TIM3 光电编码器 测速
编码器计算设定:
1、所需分辨率:测量轮:周长200mm,精度0.1mm 分辨率R=周长/精度=2000P/R
2、所需响应频率:速度=1000rpm,所需分辨率3600I/U(分辨率)响应频率Fmax=(速度*分辨率)/60=600KHZ
3、最大响应频率:(最大响应转速rpm)/60*(脉冲数/转)=输出频率HZ
4、最大响应转速:(最大响应频率HZ )/(脉冲数/转)*60=轴的转速rpm
Ⅵ 编码器测速原理,要单片机实现,怎么通过脉冲数跟速度联系起来(转轴半径已知),请具体,最好有程序,谢谢
400表示转一圈来的脉冲数是4000
脉冲个数越多测量精度越高。
单片机主要是通过定时器定时1秒或1分钟,同时利用计数器对光电编码器的脉冲计数,
每当定时时间到,就读出计数器的脉冲个数,计数出单位时间的脉冲个数除以转一圈来的脉冲数,
就是电机的转数。
如:在单位时间1秒内,计数脉冲为
80000个
即80000个脉冲/每秒
可以推出:
20转/每秒
即
1200转/分
呵呵
满意
就选满意回答啊
Ⅶ 谁给编个编码器测速的PLC程序,要用到A、B、Z三相急用
A
B可以用来测量长度,速度等等,Z的用处就是告诉PLC一圈走完又回到了0位
程序的编写要根据编程手册里关于高速计数器的使用,如三菱PLC中FX系列高速
计数器C251,用到的A和B信号是从X0
X1中输入,X0和X1有一个脉冲时,C251加1,
如反方向则C251减1,.程序:
LD
M8000
OUT
C251
K12345678
Z的信号就是一个普通的脉冲,没啥好讲的,你只要知道编码器每旋转一周它就产生一个脉冲
Ⅷ 51单片机怎么写编码器的程序
可以用T0或T1的计数器模式来处理编码器的脉冲信号。
Ⅸ 89C51单片机读取霍尔编码器的脉冲测速
400表示转一圈来的脉冲数是4000 脉冲个数越多测量精度越高。
单片机主要是通过定时器定时1秒或1分钟,同时利用计数器对光电编码器的脉冲计数,
每当定时时间到,就读出计数器的脉冲个数,计数出单位时间的脉冲个数除以转一圈来的脉冲数,
就是电机的转数。
如:在单位时间1秒内,计数脉冲为 80000个 即80000个脉冲/每秒
可以推出: 20转/每秒 即 1200转/分
Ⅹ 设计一个由单片机控制的电机转速检测系统,实时监测电机的转速,达到设定值,声音报警提示谢谢好心人啊!
LCD1602显示,如果转速达到5000R/MIN,蜂鸣器就会报警
#include <reg52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*-----------------------端口命名------------------------*/
sbit lcdrs=P2^7; //LCD的数据/命令选择端
sbit lcdrw=P2^6; //LCD的读写选择端
sbit lcden=P2^5; //LCD的使能信号端
sbit warning=P3^1; //蜂鸣器端
/*-------------------------------------------------------*/
/*-----------------------定义参数------------------------*/
uint i,j,z,count,zhuan,msec; //定义参数
uchar num,ge,shi,,qian; //变量声明
uchar code table0[]={"Velometer"}; //定义显示参数
uchar code table1[]={"Speed: r/min"};
/*-------------------------------------------------------*/
/*-----------------------毫秒延时------------------------*/
void delay0(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写命令--------------------*/
void write_com(uchar com)//写命令子函数--写指令
{
lcdrs=0;lcden=0;lcdrw=0; //此时命令
P0=com;//命令写入P0口
delay0(5);
lcden=1;
delay0(5);//出现下降沿
lcden=0;
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602写数据--------------------*/
void write_data(uchar date)//写命令子函数--写数据
{
lcdrs=1;lcden=0;lcdrw=0;
P0=date;//数据写入P0
delay0(5);
lcden=1;
delay0(5);//出现下降沿
lcden=0;
}
/*-------------------------------------------------------*/
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 0
{
EX0=0; //关外部中断0
count++;
if(count==4) //4次循环为电机转一圈
{
count=0; //初始化计数
z++; //转圈计数加1
} //计数+1
EX0=1; //开外部中断0
return;
}
/*-------------------------------------------------------*/
/*-----------------内部中断0计时计数程序-----------------*/
void Timer_0(void) interrupt 1
{
TH0=0x3C; //50ms定时
TL0=0xB0;
msec++;
if(msec==20) //50*20=1S
{
msec=0;
zhuan=z*60;
z=0;
}
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{
warning=0; //关蜂鸣器
z=0; //初始化z的值
count=0; //初始化count的值
zhuan=0; //初始化转的值
TMOD=0x01; //内部中断定时器选择
TH0=0x3C; //50ms定时
TL0=0xB0;
lcdrw=0; //选择LCD写数据指令
lcden=0; //使能信号开始为低
write_com(0x38); //16*2显示,5*7点阵,八位数据
delay0(15);
write_com(0x38);
delay0(15);
write_com(0x38);
write_com(0x08);//显示关、关光标,不闪烁
write_com(0x01);//清屏
delay0(15);
write_com(0x04);
delay0(15);
write_com(0x0c);
EA=1; //开中断总开关
ET0=1; //开内部中断0
TR0=1; //计时器开始工作
IT0=1; //外部中断0为下降沿触发
EX0=1; //开外部中断0
}
/*-------------------------------------------------------*/
/*------------------------LCD显示------------------------*/
void display ()
{
write_com(0x01); //清屏
write_com(0x06); //调用写命令函数,向右移动光标(增量)
write_com(0x80|0x03); //初始位置
for(num=0;table0[num] != '\0';num++) //第一行的字符
{
write_data(table0[num]);
delay0(1);
}
write_com(0x80|0x40); //换行
for(num=0;table1[num]!='\0';num++)
{
write_data(table1[num]);
delay0(1);
}
qian=(zhuan/1000+'0'); //转换转速的千位
=(zhuan/100%10+'0'); //转换转速的百位
shi=(zhuan/10%10+'0'); //转换转速的十位
ge=(zhuan%10+'0'); //转换转速的个位
write_com(0x80|0x46);
write_data(qian);
delay0(50);
write_com(0x80|0x47);
write_data();
delay0(50);
write_com(0x80|0x48);
write_data(shi);
delay0(50);
write_com(0x80|0x49);
write_data(ge);
delay0(5000);
}
/*-------------------------------------------------------*/
/*-------------------转速过高警告程序--------------------*/
void warning_speed()
{
if(zhuan>2400||zhuan<800) //高于5000转打开警告
{
warning=1;
}
if(zhuan<=2400&&zhuan>800) //低于5000转关闭警告
{
warning=0;
}
}
/*-------------------------------------------------------*/
/*------------------------主函数-------------------------*/
void main()
{
int_all(); //全局初始化
while(1)
{
warning_speed(); //转速警告
display (); //LCD显示
}
}