步進電機如何控制正反轉,步進電機如何控制正反轉

2021-03-11 19:07:03 字數 7478 閱讀 3802

1樓:tina淺絮

/*這是一個控制步進電機正反轉的實際應用程式*/

/*選用的是三相步進電機驅動器,p14口線用做步進電機的脈衝控制*/

/*p13口線用做步進電機的方向控制。p15,p16,p17是光耦開關量輸入*/

/*訊號端,p20,p21,p22,p23與x25045.html">x25045看門狗儲存器相連*/

/*k7,k8鍵是設定步進電機轉動速度引數的加減鍵*/

/*k9是啟動執行鍵,按一下k9,步進電機開始執行,直到p17口線有訊號輸入才停止*/

/*k10是停止鍵,任何時候按下k10都將停止步進電機當前的執行*/

/*k11是步進執行鍵,按一下,步進電機動一下*/

/*k12鍵是反向執行鍵,按一下,步進電機開始反向執行,知道p15口線有訊號才停止*/

/*如果p16口線有訊號輸入,則只有k12鍵才起作用,其它鍵都沒反應。*/

start:do;

$include(reg51.dcl)

declare (addrl,n,i,j,ok,ds) byte; /*定義變數*/

declare l(5) byte;

declare (dat,data) byte at (30h);

declare delay word;

declare aco(11) byte constant (05h,9fh,23h,0bh,99h,49h,/*定義led段碼錶*/

41h,1fh,01h,09h,00h);

declare si literally ''p21'',sck literally ''p20''; /*x25045囗線定義*/

declare so literally ''p22'',cs literally ''p23'';

dog:procedure; /* 初始化看門狗x25045.html">x25045 */

cs=1;

call time(1);

cs=0;

call time(1);

cs=1;

end dog;

run:procedure; /*步進電機執行脈衝輸出程式*/

if ok=1 then

call dog;

do;p14=0;

call time(1);

p14=1;

call time(1);

end;

end run;

display:procedure(l0,l10); /*顯示子程式*/

declare (l0,l10) byte; /*定義顯示二位*/

n=l10;

n=aco(n); /*十位數bcd碼譯成段碼*/

sbuf=n; /*十位數送164顯示*/

do while ti=0; /*等待傳送結束*/

call dog; /*看門狗定時器復位*/

end;

n=l0;

n=aco(n);

sbuf=n; /*個位數送164顯示*/

do while ti=0;

call dog;

end;

end display;

outbyt: procedure(da); /*向看門狗儲存器寫入一位元組*/

declare (i,da) byte;

j=da; /*將要寫入的位元組賦給臨時變數j */

do i=0 to 7; /*左移8位,送到口線si */

sck=0;

j=scl(j,1);

si=cy;

sck=1; /*每移一位資料,跟一個時鐘訊號*/

end;

end outbyt;

inbyt: procedure; /* 從看門狗儲存器讀出一位元組 */

declare (i,di) byte;

j=0;

do i=0 to 7;

sck=1;

sck=0;

cy=so;

j=scl(j,1); /*從看門狗儲存器讀出一位元組送入臨時變數j*/

end;

dat=j;

end inbyt;

wrenable: procedure; /* 置看門狗寫使能*/

sck=0;

cs=0;

; /* write enable ***mand */

>x25045 寫使能指令06h */

cs=1;

sck=0;

end wrenable;

wrdisable: procedure; /* 置看門狗寫禁止 */

sck=0;

cs=0;

; /* write disable ***mand */

call outbyt(04h);

sck=0;

cs=1;

end wrdisable;

wrregister: procedure; /* 寫狀態暫存器 */

sck=0;

cs=0;

dat=01h; /* write register ***mand */

call outbyt(dat);

; /* 00h——1.4s, 20h——200ms, 10h——600ms, 30h——disable wdog */

call outbyt(00h); /* 設定看門狗定時時間 */

;sck=0;

cs=1;

call time(200); /* wait to ***plete writting cycle */

end wrregister;

rdregister:procedure; /* 讀看門狗狀態暫存器 */

sck=0;

cs=0;

; /* register read ***mand */

call outbyt(05h);

call inbyt; /* status register read in */

sck=0;

cs=1;

end rdregister;

wbyte:procedure; /* 看門狗儲存器位元組寫入子程式 */

declare ***m byte;

sck=0;

cs=0;

***m=02h; /* 寫指令 02h */

call outbyt(***m);

call outbyt(addrl);

call outbyt(dat); /* send one byte data to x25043 */

cs=1;

sck=0;

call time(150);

end wbyte;

rbyte:procedure; /*看門狗儲存器位元組讀出子程式 */

declare ***m byte;

sck=0;

cs=0;

***m=03h; /* read ***mand */

call outbyt(***m);

call outbyt(addrl);

call inbyt; /* read one byte to */

sck=0;

cs=1;

end rbyte;

incdata: procedure; /* 引數修改——"加"鍵處理子程式 */

if p10=0 then /* 如果k7鍵按下*/

do;do while p10=0; /* 等待鍵鬆開有效 */

call dog; /* 此處必需呼叫看門狗復位子程式("喂狗"),否則程式將被看門狗復位*/

end;

data=data 1; /* 設定值 1 */

if data>99 then data=1; /* 規定設定值的上限*/

l(1)=data mod 10; /*將設定值的十位數拆出來送給十位數顯示變數l(1) */

l(2)=data/10; /*將設定值的個位數拆出來送給個位數顯示變數l(2) */

call display(l(1),l(2)); /* 將改變後的設定值送164顯示出來*/

call time(200); /* 延時 */

call dog;

call time(200);

call dog;

call wrenable; /* 置儲存器寫使能 */

addrl=00h; /* 置儲存器地址 */

dat=l(1);

call wbyte; /* 將變數l(1)的值寫入儲存器00h位置 */

call wrenable;

addrl=01h;

dat=l(2);

call wbyte; /* 將變數l(2)的值寫入儲存器01h位置 */

end;

end incdata;

decdata: procedure; /* 引數修改——-"減"鍵處理子程式- */

if p11=0 then /* k8 鍵處理子程式 */

do;do while p11=0;

call dog;

end;

data=data-1; /* 設定值-1 */

if data=0 then data=99;

l(1)=data mod 10;

l(2)=data/10;

call display(l(1),l(2));

call dog;

call time(200);

call dog;

call time(200);

call dog;

call wrenable;

addrl=00h;

dat=l(1);

call wbyte;

call wrenable;

addrl=01h;

dat=l(2);

call wbyte;

end;

end decdata;

starton: procedure; /* start */

declare sd byte;

if p12=0 then /* k9鍵處理子程式 */

do;do while p12=0;

call dog;

end;

if p17=0 then ok=0; /* 如果p17 口線上有訊號輸入,則執行標誌置0 (停止執行)*/

p13=1; /* 置步進電機正向運轉 */

call time(200);

call dog;

do while ok=1; /* 當執行標誌為1時,執行速度延時操作 */

do sd= 0 to data; /* 根據設定值 data的數值延時來確定步進電機執行時的脈衝給定速度*/

call dog;

end;

end;

end starton;

step: procedure; /* step */

declare sd byte;

p13=1; /* 置步進電機正向運轉 */

call time(200);

call dog;

if p33=0 then /* k11鍵處理子程式 */

do;if p17=0 then ok=0; /* 如果p17上有訊號輸入,則停止執行*/

do while p33=0;

do sd= 0 to data; /* 呼叫延時,調整步進電機的執行速度 */

call dog;

call time(2);

end;

call run;

call dog;

end;

end;

ok=0;

end step;

back: procedure; /* 反向執行處理子程式 */

declare sd byte;

if p34=0 then

do;do while p34=0;

call dog;

end;

if p15=0 then ok=0; /* 反向執行時,如果遇到p15上有訊號輸入,則停止步進電機執行 */

p13=0; /* 置步進電機反向執行 */

call time(200);

call dog;

do while ok=1;

do sd=0 to data; /*根據設定值調節步進電機的執行速度 */

call dog;

call time(2);

end;

call run;

if (p15=0 or p32=0 ) then ok=0; /* p15 或 p32 口線任意一個有訊號輸入,停止執行 */

end;

end;

end back;

main$program: /* 初始化主程式 */

ea=0; /* 關中斷 */

scon=00h; /*置串列埠方式0 ,序列資料輸出模式*/

pcon=00h;

tmod=11h;

et0=1;

enable; /* 開中斷 (ea=1) */

sck=0;cs=1; /* 定義儲存器口線初始狀態 */

call wrenable;

call wrregister; /* 看門狗儲存器 初始化 */

call wrenable;

call dog;

p2=0ffh; /* 初始化各個口線的狀態 */

p1=0ffh;ok=0;

p14=1;p32=1;p33=1;p34=1;

p13=1;

addrl=00h; /* 上電覆位後從儲存器中讀出設定的速度值 */

call rbyte;

l(1)=dat;

addrl=01h;

call rbyte;

l(2)=dat;

data=l(1) l(2)*10; /*將讀出的值合併成十進位制,存入變數data中 */

/* 以下是主迴圈程式 */

loop:

if p10=0 then call incdata; /* 檢測各個按鍵是否有按下 */

if p11=0 then call decdata;

if p12=0 then

do;ok=1;

call starton;

end;

if p34=0 then

do;ok=1;

call back;

end;

if p33=0 then

do;ok=1;

call step;

end;

call dog;

call display(l(1),l(2)); /* 將設定值送164顯示 */

call dog;

call time(100);

call dog;

goto loop;

end start;

步進電機怎麼改成普通的電機?只需要正反轉控制就可以了,不要用驅動器

步進電機當普通電機用是可行的,電機本身不需要改動。但必須配上脈衝發生器和驅動器。也有兩者一體的賣。可以 搜尋 步進電機脈衝發生器 來回切換對ab相的供電,切換的速度直接決定馬達速度,還不如直接做一個驅動來的實際呢 有的可以改,你圖沒有,但驅動必須要的。你要多少轉速 要求不高而且你有空的話可以手動給它...

步進電機驅動器可以控制閉環步進電機嗎

步進電機是將 copy電脈衝訊號轉變bai為角位移或線位du移的開環控制元件。在非超載的情zhi況下,電機的轉速dao 停止的位置只取決於脈衝訊號的頻率和脈衝數,而不受負載變化的影響,即給電機加一個脈衝訊號,電機則轉過一個步距角。這一線性關係的存在,加上步進電機只有週期性的誤差而無累積誤差等特點。使...

怎樣用驅動器控制步進電機正反轉接線圖

首先步進電機驅copy動器是不能bai控制步進電機正反轉,但一般傳送的du 是模擬量訊號,控zhi制步進電機正反轉的主要是dao控制器的高低電平。伺服驅動器又稱為 伺服控制器 伺服放大器 是用來控制伺服電機的一種控制器,其作用類似於變頻器作用於普通交流馬達,屬於伺服系統的一部分,主要應用於高精度的定...