導航:首頁 > 操作系統 > 單片機編碼器測速程序

單片機編碼器測速程序

發布時間:2022-11-04 02:14:56

Ⅰ 在被動測速系統中,單片機(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顯示
}
}

閱讀全文

與單片機編碼器測速程序相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163