Ⅰ 如何用電腦控制機械運動
電腦控制電路機械運動,那就要使使用編程來實現把編程的程序,然後嵌入。嵌入到機械中,然後電腦輸入指令機械就運動。
Ⅱ 電腦軟體運行過程中,如何將某變數數值的變化來控制外界硬體的機械運動
LZ,你的問題比較大,仔細說的話不知道可以寫多少本書了。
所以只能簡單的說一點,希望你能自己多多查閱相關的資料,機械和自動化行業的知識過於博大精深,要積累一定的基礎才能方便我們理解的。
首先你的問題集中在自動化領域,這個領域相比純機械領域來說更加的高深,因為不僅僅限於機械繫統的運動,還有大量的電子設備用於機械繫統的解算和伺服。要學習這個領域,是要靜下心,花費很多精力的,否則不可能學的精通。
對於你的問題~
1.機械設備的電控中心通俗來說也就是專用的電腦,它裡面的軟體都是小而精細的,編程效率和穩定性都相當的高,為了提高運算效率,降低硬體佔用(因為在工業PLC中,像我們家用電腦這樣動不動就2.4GHZ以上運算速度,2GB以上的物理內存這樣恐怖的容量是很少見到的,很多都是只有幾MHZ,十幾KB甚至更小的容量),所以程序要短小精悍。以前像我們熟悉的51單片機系列的PLC,很多都是直接以匯編語言進行編程的,當然現在隨著硬體容量的上升,為了減少從底層開始編程的負擔,用C進行編程的單片機也是非常的成熟了。
而由PLC解算出來的執行代碼,如何用於伺服作業機構,這就需要專門的設備。由於PLC輸出的執行代碼是數字的信號,這個信號很弱,無法用於驅動,更無法被工作裝置所識別。所以需要一些特定的設備,作為PLC和工作裝置中間的「翻譯官」,這個翻譯官用處就是把PCL輸出的數字信號轉換成工作機構能識別的伺服信號,並為工作機構提供動力。
由於這個東西說起來博大精深,我就從過程上簡單的說吧,可能你理解起來會更加的容易一些。整個系統的運轉過程就是:各種感測器(比如限位開關,壓力感測器,速度感測器,加速度感測器....等等)把設備實時的工作壓力,速度,加速度,溫度等等信號轉化為電信號(就是原始的電流的大小,壓降等最原始的模擬信號)傳給數模轉換電路,這個電路其實也就是一些專用用於轉換的電子電路和專用的單片機組成的(光這個就很復雜了,可以寫十幾本書了,但是你現在只需要有個印象就可以了),然後模擬信號就轉變成了PLC可以識別的也就是0和1編碼的數字信號,然後PLC對這些信號進行實時解算,或者有些流處理的單片機就把這些信號和單片機內存(COMS)裡面預先燒錄的資料庫控製表單進行對比,然後提取出最近似工況的數據作為伺服輸出(非流處理器的是通過控制函數和資料庫綜合分辨後輸出),比如編程中你要液壓缸在這個位置上快進,那麼PLC在收到限位開關傳輸來的液壓缸到達了那個位置的信號後,提取程序所需的在那個位置液壓缸所需要的壓力和流量信號,作為伺服信號輸出。輸出的伺服信號也是數字的,同樣也要通過數模轉換電路進行轉換,轉換成所需的可以直接被使用的原始信息(電流大小,電壓大小,持續時間等等),然後這些電流就去驅動相關的電機,或者電磁閥,實現所需要的控制。
上面所說的只是原始的,你先簡單的理解。實際的要比這個復雜的多。由於現在技術的進步,同時加工和各種精密機械對於穩定和精確控制需求。加上各種精密伺服設備比如步進電機,伺服電機,高精度和靈敏度的感測器和電磁閥,高精度滑軌的使用。使得現在使用數字直接控製成為主流,也就是輸出的電子信號通過專用的單片機,精細分割變成數字脈沖信號,然後輸送到步進電機驅動器上面去,由驅動器控制步進電機動力源按每一個小脈沖進行動作,使角度和速度都相當的精確。雖然復雜了,原理還是上面說說的那樣,就是把以前簡單的電路換成了專用的PLC和電路,把模擬控制變成細化分割的數字控制。
要學習的知識就太多了,如果你不是專門從事這個領域的,只需要了解就夠了,事實上我現在從事的基本是純機械領域為主,對於機電的了解還是很有限的,只停留在了稍微了解的水平上而已。
這方面相關的資料,要入門的大概有:自動化原理,控制原理,過程式控制制,電子技術,電機與電力拖動等等
然後要有點興趣,多網上查閱相關資料,把各種電機,感測器,開關,電磁閥等了解清楚,然後學一下匯編和C。但是首先提醒的是,如果不是專門從業的就算了,了解一下就可以了,如果是要靠這個吃飯的話,要戒驕戒躁,不要把毯子鋪大,看準一個方向學深入,因為機電的東西幾輩子都是學不完的。
2.至於你的第二個問題,其實上面的回答已經略微提到了。
對於PLC控制的方式,基本原理就是兩種,專業的名詞我也忘了,反正一種是查表,另一種是實時解算。
所謂查表的方式,我先打個比方,比如給你一塊三角形的蛋糕,讓你在一堆盤子裡面找出一個盤子來放,而你手中有一張詳細的哪個形狀的蛋糕應該放在哪種盤子裡面的一張表單,所以你需要做的,就是對號入座,把相應的盤子找出來就可以了。在PLC中,查表的方式就是,把系統每個工況下所需要的控制數據放在ROM裡面,然後在接收到感測器傳來的系統在當前工況下的運行數據,比如溫度,壓力,速度等後,在資料庫中查找相對於的此工況的表單,然後提取控制數據用於輸出。這樣的優點是對系統的要求比較低,因為PLC所作的工作其實就是匹配數據而已。另一個很明顯的優點就是可以做到變精度的控制,比如說要實現溫度1-100度的控制,對於控制精度要求不高的系統,可以每隔10度設立一個表單,只需要10個表單就夠了。而對於要求高的系統,可以每1度設立一個,更高要求的系統,可以繼續往下分割。還有一個明顯的優點就是擴充性能好,就是升級性能好,當需要更高的精度的時候,不用更換PLC系統,可以增加運算單元和存儲單元晶元的數目,如果有了更加准確的資料庫,只需要把原來在ROM裡面的數據擦除後重新燒錄就可以了。而那些數據哪裡來的呢?就是世界上N個牛X的專家和N個工程研究團隊經過大量經驗和實驗,標准化整理之後由專業的編程人員編入控製程序的資料庫之中的。
第二種就是解算,解算就是實時的運算控制。就是把感測器傳來的信號,通過綜合了系統定量和變數的函數庫進行解算,將算出的結果輸出進行控制。這對系統的運算速度要求比較高,而且需要一定的反饋機制,要不算出的結果和需要的可能不一致。而那些函數庫哪來的呢,同樣也是大量的牛X專家和教授多年的心血,別以為哈佛劍橋麻省理工的博士們天天就無聊了發表論文,他們的論文其中很多就用在這里了。
真正實際中應用的PLC控制方式,是上面兩種的綜合,並加上了反饋機制,就是查表+解算+反饋。因為單片機相對於大型的計算機系統來說是極為弱小的,甚至相對於LZ現在正在使用的微機來說都是相當弱小的,它不能提供如此高的解算速度。但是工業控制中,又要求單片機以如此弱小的身子骨來承擔精確的控制。所以綜合的控制方式不可避免。但是要實現綜合控制,PLC的數據表單裡面需要增加經過控制後系統應該運行在何種工況下的對應工況數據。過程是這樣的:PLC在接收到感測器傳來的系統工況數據之後,與表單數據進行匹配,選擇最近似控制數據進行輸出,輸出後再通過感測器接收系統在經過控制之後的工況數據,與表單中系統應該運行的理論數據進行對比,找出偏差值,然後將第二次匹配到的輸出值與此偏差值代入相應的修正函數庫進行解算,將數據經過函數修正後輸出,再重新監測系統在控制後的運行情況,再修正,再輸出,如此反復,直到系統工況與理論工況無法再繼續接近為止。
上面的東西只是簡單的描述,實際的東西比這個復雜多了,說這個僅用於留有印象也不過分。鑒於你現在對於自動化了解還不深,就不像一樓那樣子說的更專業了,當然他說的也是很實在的,只是怕你現在可能還無法了解,慢慢學,以後就好了。當然如果不是從事相關專業領域的話,也不需要了解的那麼深,因為從底層開始學習進入控制領域的話,這條路過於漫長了,因為像西門子,三菱等,他們上千人的團隊幾十年的經驗已經把單片機模塊化,標准化了,我們作為用戶只需要了解和使用就可以了。
3.你的第三個問題,我現在的工作就是與液壓相關的,雖然不是專業人士,但是和液壓實在是走的太近了,在這里可以略微回答你的問題。
你在問題補充裡面提到了可以不用液壓系統改用電機拖動,但是我可以說,液壓系統和電機系統使用領域的偏差還是比較大的,兩種在很多場合下,基本沒有互換使用的。液壓的精髓在於低速重載,以小功率輸出巨大的作用力;而電機在於精確,快速的運行和控制。如果只是一般的使用,電機系統就夠了,畢竟液壓系統不用則以,用起來過於復雜,成本也會高出很多,而且一般的設計也不太需要用到液壓。
看你是使用在那個東西上面的。一般的液壓系統,迴路結構都已經很成熟了,具體你可以查閱相關的資料,因為液壓系統的設計圖紙才是真正的語言,我在這里文字表達有限,實在是說不了很清楚。
至於你提到的需要哪些設備,就看你設計的東西了。高壓系統除了你提到的液壓泵,比例閥,液壓缸之外,還必須設計先導迴路。先導迴路也是標准液壓迴路的綜合,要用到的東西就多了,比如先導閥,油源閥,安全閥,平衡閥,電磁比例閥,蓄能器組件和濾清系統,分流集流塊;高壓工作系統就需要用到變數柱塞泵,背壓閥,由三向六通閥加上平衡閥組合的多路換向閥,制動閥,減壓閥,多級調速閥,液壓油缸等等。而標準的液壓迴路有基本換向迴路和卸載迴路,差動增速迴路,多缸順序控制迴路,減速增壓迴路,補油迴路,平衡保壓迴路等等,加上自動化的變數控制系統,太多了...說不完。每一種迴路的都可以使用上述的閥門進行組合實現,都各有優缺點,要根據實際情況擇優選用。希望你自己能多多查閱這方面的資料。
對於你的設計,步進電機的簡單系統就可以滿足需求,在有了一定的了解之後,相關的電路和設備可以查閱相關的機電設計手冊,完全可以解答你的問題,我在這里就不多說了。
最近頭腦比較混亂,先這樣吧...望對你多少有點幫助。
謝謝
Ⅲ 51單片機中如何用c語言控制直流電機正反轉
#include"reg52.h"
#include"intrins.h"
#define unint unsigned int
#define unchar unsigned char
#define PLAY_OUT P1
unchar sec=0;
unchar min=0;
unchar count=0;
bit gj=0; //光和遙控的切換
unchar r6,r7;
bit time0=1;
bit time1=1;
sbit PLAY_Q_Q=P3^0;
sbit PLAY_Z=P3^1;
sbit PLAY_Y=P3^4;
sbit PLAY_QH=P3^5;
sbit PLAY_Q_H=P3^6;
sbit PLAY_T=P3^7;
unchar r0,r1,r2=0x00,r3=0x00,r4=0x00,r5=0x00;
unchar code TAB_Q[4]={0xf9,0xf5,0xf6,0xfa};//前進
unchar code TAB_H[4]={0xfa,0xf6,0xf5,0xf9};//後退
unchar code TAB_Y[4]={0x9f,0x5f,0x6f,0xaf};//右轉
unchar code TAB_Z[4]={0xaf,0x6f,0x5f,0x9f};//左轉
/*************************/
void intiaton(void);
void int_time3(void);
void int_time0(void);
void fanzhuan_Y(void);
void fanzhuan_Z(void);
void zhenzhuan_Q(void);
void zhenzhuan_H(void);
void zhenzhuan_AQ(void);
void zhenzhuan_AH(void);
void cankey(void);
/*************************/
delay(unint t) //0.6ms
{unint i;
for(i=55;i>t;i--) ;
}
/**************************/
delayms(unint k) //k=1延遲0.884毫秒
{unint i;
for(i=80;i>k;i--)
;
}
/*************************/
void delay238(void) //2.38ms
{
unint i,j;
for(j=125;j>0;j--)
for(i=0;i<1;i++);
}
/************************/
void intiaton(void) //初始化
{
TMOD=0x11;
TH1=0XFA;
TL1=0X56;
ET1=1;
TR1=1;
EA=1;
}
/*********************/
void int_time3() interrupt 3 using 3
{
TH1=0XFA;
TL1=0X56;
sec++;
if(sec==2)
{
sec=0;
min++;
}
}
/*************************/ //光感與按鍵控制
void cankey()
{
if(gj)
{
if(!PLAY_Q_Q)
{
count=1;
}
if(!PLAY_T)
{
count=2;
}
if(!PLAY_Q_H)
{
count=3;
}
}
if((PLAY_Z==0)||(PLAY_Y==0))
{
delayms(1);
if(PLAY_Z==0)
{
fanzhuan_Z();count=1;
}
else
{
fanzhuan_Y();count=1;
}
}
if(PLAY_QH==0)
{
delayms(10);
if(PLAY_QH==0)
{
count++;
if(count==4)
{
count=0;
}
}
while(PLAY_QH==0);
}
switch(count)
{
case 0: PLAY_OUT=0xff;break;
case 1: zhenzhuan_AQ();break;
case 2: PLAY_OUT=0xff;break;
case 3: zhenzhuan_AH();break;
default :break;
}
}
/*******************************/ //按鍵前進
void zhenzhuan_AQ(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_Q[r6];
while(sec==0);
sec=0;
}
}
/*******************/ //按鍵後退
void zhenzhuan_AH(void)
{
for(r6=0;r6<4;r6++)
{
PLAY_OUT=TAB_H[r6];
while(sec==0);
sec=0;
}
}
/**********************/ //左轉
void fanzhuan_Z(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Z[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/**********************/ //右轉
void fanzhuan_Y(void)
{
unchar i;
for(i=0;i<22;i++)
{
for(r7=0;r7<4;r7++)
{
PLAY_OUT=TAB_Y[r7];
while(sec==0);
sec=0;
}
}
cankey();
}
/***************************/
void main()
{
intiaton();
while(1)
{
cankey();
}
這是加了感光跟按鍵控制的智能小車,是讀大一時候寫的,現在看起來呵呵。。。垃圾代碼一大堆,不過好象還可以用。
Ⅳ 如何用C語言控制步進電機 正轉後自動反轉
中斷2,啟動-停止切換(通過切換flag_status),顯示狀態。do-while是延時。
中斷1,計數器count增1,如果達到預設的數值tab[sp],計數器歸零,標志flag置1。這個好像與速度有關。通過調整延時時間來調整速度。
中斷0,讀鍵盤。沒有scan_key()的源代碼,不知道裡面有些什麼操作。
while(1){...}循環是電機運轉,flag_status是狀態,1轉動,0停止。
沒有看到與正轉反轉有關的代碼。也許在motor_cw_ccw();函數裡面,這個就是電機動一下的函數。
原程序不完整,沒有相應函數、變數的定義及意義說明。難以確切理解。
Ⅳ 用單片機控制直流電動機的正反轉、加減速的程序如何用C語言寫啊
參考一下這個例子吧。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit PW1=P2^0 ;
sbit PW2=P2^1 ; //控制電機的兩個輸入
sbit accelerate=P2^2 ; //調速按鍵
sbit stop=P2^3 ; //停止按鍵
sbit left=P2^4 ; //左轉按鍵
sbit right=P2^5 ; //右轉按鍵
#define right_turn PW1=0;PW2=1 //順時針轉動
#define left_turn PW1=1;PW2=0 //逆向轉動
#define end_turn PW1=1;PW2=1 //停轉
uint t0=25000,t1=25000; //初始時占空比為50%
uint a=25000; // 設置定時器裝載初值 25ms 設定頻率為20Hz
uchar flag=1; //此標志用於選擇不同的裝載初值
uchar dflag; //左右轉標志
uchar count; //用來標志速度檔位
void keyscan(); //鍵盤掃描
void delay(uchar z);
void time_init(); //定時器的初始化
void adjust_speed(); //通過 調整占空比來調整速度
//**********************************//
void main()
{
time_init(); //定時器的初始化
while(1)
{
keyscan(); //不斷掃描鍵盤程序,以便及時作出相應的響應
}
}
//*************************************//
void timer0() interrupt 1 using 0
{
if(flag)
{
flag=0;
end_turn;
a=t0; //t0的大小決定著低電平延續時間
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重裝載初值
}
else
{
flag=1; //這個標志起到交替輸出高低電平的作用
if(dflag==0)
{
right_turn; //右轉
}
else
{
left_turn; //左轉
}
a=t1; //t1的大小決定著高電平延續時間
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重裝載初值
}
}
void time_init()
{
TMOD=0x01; //工作方式寄存器 軟體起動定時器 定時器功能 方式1 定時器0
TH0=(65536-a)/256;
TL0=(65536-a)%256; //裝載初值
ET0=1; //開啟定時器中斷使能
EA=1; // 開啟總中斷
TR0=0;
}
//****************************************//
void delay(uchar z) //在12M下延時z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//******************************//
void keyscan()
{
if(stop==0)
{
TR0=0; //關閉定時器0 即可停止轉動
end_turn;
}
if(left==0)
{
TR0=1;
dflag=1; //轉向標志置位則左轉
}
if(right==0)
{
TR0=1;
dflag=0; //轉向標志復位則右轉
}
if(accelerate==0)
{
delay(5) ; //延時消抖
if(accelerate==0)
{
while(accelerate==0) ; //等待鬆手
count++;
if(count==1)
{
t0=20000;
t1=30000; //占空比為百分之60
}
if(count==2)
{
t0=15000;
t1=35000; //占空比為百分之70
}
if(count==3)
{
t0=10000;
t1=40000; //占空比為百分之80
}
if(count==4)
{
t0=5000;
t1=45000; //占空比為百分之90
}
if(count==5)
{
count=0;
}
}
}
}
Ⅵ 單片機C語言程序怎麼控制電動機
步進電機(5V)與在單片機之間要加個驅動晶元,如ULN2803等,單片機通過程序產生PWM輸出四拍或八拍控制波,( 四拍的驅動正轉順序為A-B-C-D-A,八拍的驅動正轉順序為A-AB-B-BC-C-CD-D-DA-A),步進電機就轉起來了。
單片機(Microcontrollers)是一種集成電路晶元,是採用超大規模集成電路技術把具有數據處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統、定時器/計數器等功能(可能還包括顯示驅動電路、脈寬調制電路、模擬多路轉換器、A/D轉換器等電路)集成到一塊矽片上構成的一個小而完善的微型計算機系統,在工業控制領域廣泛應用。從上世紀80年代,由當時的4位、8位單片機,發展到現在的300M的高速單片機。
Ⅶ 計算機程序如何控制機械運動的
1.人用高級語言(如JC語言)編寫控製程序,並編譯為計算機能識別的機器碼(由0和1組成)
2.將機器碼程序復制或者寫入機器人的存儲器中(存放數據的地方,比如硬碟)
3.機器人加電啟動後會自動運行服務程序。自帶的解釋程序將機器碼程序解釋成各種控制信號(它知道你這些0和1代表什麼,想要做什麼)
4.由機器人處理器將控制信號轉換成電信號
5.電信號被送到伺服系統(如四輪驅動系統、雙足系統、履帶驅動系統等)進行信號放大
6.放大的信號經驅動系統(如電動機)控制機器人運動。
7.當有感測器捕捉到信號後,傳送至處理器,會中斷服務程序要求處理,如果滿足你編寫的程序的條件,則會執行相應的程序,以實現相應的動作或者功能。
這裡面涉及到許多行業約定俗成的法則,不是想當然就可以的。
機器人目前並不具體人的思維的能力,你現在感覺像是人的思維的程序,實際上是一組邏輯和模糊判斷的集合,這就是演算法。(別問我演算法哈,我已經打了夠多字了)機器人只能根據給定的條件,做一些有限的已知的判斷和選擇,由不同的演算法決定機器人思維的模式和結果。如果允許做無限的推測,有可能死機,如果允許做未知的推測,行為結果將不可預料即失控。
OK,有興趣可自己查閱 自動控制理論 及 機器人學 微機原理等相關專業的資料
Ⅷ 怎麼用C語言編程來控制硬體如何寫啊
處理器對周邊硬體的操作,實際上就是讀取該硬體上寄存器的信息和向其寄存器寫入信息的操作。抽象的看,就是對硬體上寄存器對應的地址空間進行操作。當然由於硬體種類繁多,結構不一,一般情況下,硬體的生產廠商會為對應的操作系統提供一組控制函數,這些函數用以實現操作系統廠商為某一類硬體定義的一組規范的必須實現的介面,這就是驅動,通常廠商還會提供更多的函數以支持更高級的功能。
所以,對硬體的操作,方式方法是多種的,要怎麼做,取決於你要操作什麼樣的東西,達到什麼樣的效果。當有了目標,請查閱該硬體設備的SDK。記住一點就好,只要設備能夠被操作,我們也能對其狀態寄存器,控制寄存器進行讀寫操作,那麼就可以控制,至於怎麼弄,那不正是你去上學要學的、學完需要思考得么?
Ⅸ 數控立車C軸極坐標編舉個案例。謝謝各位。
c軸是將主軸的圓周作為一個軸(主軸作位置控制方式時),360等分,配合鎖緊裝置可以將被加工材料精確旋轉到一個所需要的度數(角度),如:c180.0或者c150.0等。