導航:首頁 > 操作系統 > 51單片機步進電機調速程序

51單片機步進電機調速程序

發布時間:2023-01-04 07:24:16

Ⅰ 51單片機步進電機正反轉程序

單片機控制步進電機,我想你說的是兩相步進電機,一般是控制其相序分配的順逆從而控制正反轉,一般而言,步進電機相序分配你可以做成一個數組比如step[]={0x03,0x06,0x0c,0x09},這樣來說可以假設P0口是步進電機控制口,那麼可以按如下方式來控制: while(1) { for(i=0;i<4;i++) { if(fx==1)P0=step[i]; //正向 else P0=step[3-i]; //反向 delay(x); //x大小決定電機速度。
根據電機相數買個驅動器。然後用單片機產生脈沖來控制電機的轉動以及正反轉。單片機產生脈沖的方法和單片機控制流水燈是一樣的。ULN2003D 是驅動步進電機的驅動晶元,主要是匹配電機所需的電流。 由於是四相電機,步進電機之所以可以轉動就需要給相繞組提供連續的脈沖,所以需要4個埠來控制四相繞組的工作狀態(P15應該是不需要的),具體的編碼要看電機的拍數; 一旦明白這些,你就可以很容易編寫代碼來控制電機的轉動了,還有在脈沖間你可以設置不同的延時時間來調節電機的轉速。

Ⅱ 關於51單片機控制步進電機編程(c語言),求助

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharkey_l,key,i;

ucharcodetemp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};

ucharcodetemp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

ucharcodeaa[16]=":";

ucharcodesmg[]="";

sbite=P2^6;

sbitrs=P2^4;

sbitrw=P2^5;

voiddelay(inttt)

{

while(tt--);

}

voidw_cmd(uchardd)

{

rs=0;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

delay(50);

}

voidw_dat(uchardd)

{

rs=1;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

}

voidinit(ucharsmg4[],uchartime[])

{

w_cmd(0x38);

delay(2000);

w_cmd(0x38);

delay(500);

w_cmd(0x38);//注意順序,設置工作方式,顯示模式設置

delay(500);

w_cmd(0x08);//注意順序,關閉顯示

w_cmd(0x01);//清屏

w_cmd(0x07);//游標·畫面滾動模式設置

w_cmd(0x0c);//顯示及游標模式設置

w_cmd(0x80);//

for(i=0;i<16;i++)

w_dat(time[i]);

w_cmd(0x80+0X40);

for(i=0;i<16;i++)

w_dat(smg4[i]);

}

voidTb(ucharsmg[],ucharn,uchars,ucharl,uchard)

{

unsignedcharm;

w_cmd(0x82);

for(m=n;m<s;m++)

w_dat(smg[m]);

w_cmd(0x80+0X42);

for(m=l;m<d;m++)

w_dat(smg[m]);

}

voidmain()

{

init(aa,aa);

while(1)

{

P1=0xf0;

key_l=P1;

if(key_l!=0xf0)

{

delay(100);

if(key_l!=0xf0)

{

P1=key_l|0x0f;

key=P1;

}

}

switch(key)

{

case0xee:Tb(smg,0,10,11,21);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(500);

}

break;

case0xde:Tb(smg,0,10,19,29);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(300);

}

break;

case0xbe:Tb(smg,0,10,30,40);

for(i=0;i<8;i++)

{

P2=temp1[i];

delay(100);

}

break;

case0x7e:P2=0xff;Tb(smg,0,10,39,49);break;

case0xed:Tb(smg,50,60,11,21);

for(i=0;i<8;i++)

{

P2=temp2[i];

delay(200);

}

break;

case0xdd:Tb(smg,50,60,19,29);

for(i=0;i<8;i++)

{

P2=temp2[i];

delay(120);

}

break;

case0xbd:P2=0xff;Tb(smg,50,60,40,50);break;

}

}

}

Ⅲ 51單片機驅動步進電機調速 有大神能教教我么

假設步進電機有4個繞組,接單片機P0的低4位,
則只要單片機順序輸出8 4 2 1即可

改變速度,改變延時時間即可
while(1)
{
P0=8,
delayms(n);
P0=4,
delayms(n);
P0=2,
delayms(n);
P0=1,
delayms(n);
}
另外可用 2個中斷,接2 個按鈕,中斷程序里調節n 的值即可實現調速
一個增加,一個減小

Ⅳ 51單片機C語言程序按鍵控制步進電機轉速

sbit K1=P1^0;
sbit K2=P1^1;
char y=0;
while(1)
{
pangan();
for(i=0;i<4;i++) //4相
{
/*P1=F_Rotation[i]; //輸出對應的相 可以自行換成反轉表格
Delay(500); //改變這個參數可以調整電機轉速
Delay(5000);*/
P1=B_Rotation[i];
Delay(265+y);
P1=F_Rotation[i];
Delay(265+y);

}
}
void pangan()
{
if(K1==0)
{ y++; //加
while(~k1)
}
if(K2==0)
{ y--;
while(~k2); //減
}
}
}
沒有下上限 要是調的話 需要判斷顯示延時時間

Ⅳ 51單片機, 編一個控制步進電機轉動的程序。

#include <reg51.h> //51晶元管腳定義頭文件
#include <intrins.h>//內部包含延時函數 _nop_();

#define uchar unsigned char
#define uint unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

/********************************************************/
/*
/* 延時t毫秒
/* 11.0592MHz時鍾,延時約1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/********************************************************/
/*
/*步進電機正轉
/*
/********************************************************/
void motor_ffw(uint n)
{
uchar i;
uint j;
for (j=0; j<12*n; j++) //轉1×n圈
{
for (i=0; i<8; i++) //一個周期轉30度
{
P1 = FFW[i]; //取數據
delay(15); //調節轉速
}
}
}
/********************************************************/
/*
/*步進電機反轉
/*
/********************************************************/
void motor_rev(uint n)
{
uchar i;
uint j;
for (j=0; j<12*n; j++) //轉1×n圈
{
for (i=0; i<8; i++) //一個周期轉30度
{
P1 = REV[i]; //取數據
delay(15); //調節轉速
}
}
}
/********************************************************
*
* 主程序
*
*********************************************************/

main()
{
while(1)
{
motor_ffw(5); //電機正轉
delay(5000); //換向延時
//motor_rev(5); //電機反轉
//delay(1000); //換向延時
}
}

/********************************************************/

Ⅵ 求51單片機控制步進電機程序

;//****************************************************************
;//*文件名: StepM FOR 51MCU
;功能: 開關控制步進電機的正轉、反轉和停止。
;接線: 用導線對應連接步進電機模塊的SMA~SMD到CPU模塊的P10~P13,
; 八位邏輯電平輸出的K0~K2對應連接CPU模塊的P15~P17。
;//****************************************************************
;K0——停止
;K1——正轉
;K2——反轉
ORG 0000
LJMP START
ORG 0100H
START:
LOOP: MOV P1,#00H ; 步進電機停止
ORL P1,#0E0H
MOV A,P1
JNB ACC.5,STOP ; 停止
JNB ACC.6,FOR ; 正轉
JNB ACC.7,rev ; 反轉
JMP LOOP ;

FOR: MOV R0, #00H ; 正轉到tab取碼指針初值
for1: MOV A,R0 ; 取碼
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR
JZ LOOP ; 是否到了結束碼00h
CPL A ;把acc反向
MOV P1,A ;輸出到p1開始正轉
CALL DELAY ;轉動的速度
INC R0 ;取下一個碼
JMP FOR1 ;繼續正轉

rev: MOV R0,#0AH ;反轉到tab取碼指針初值
rev1: MOV A,R0
MOV DPTR,#TABLE ;取碼
MOVC A,@A+DPTR
JZ LOOP ;是否到了結束碼00h
CPL A ;把acc反向
MOV P1,A ;輸出到p1開始反轉
CALL DELAY ;轉動的速度
INC R0 ;取下一個碼
JMP REV1 ;繼續反轉

stop:
MOV P1, #00H
JMP LOOP

DELAY: MOV R1,#150 ;步進電機的轉速20ms
D1: MOV R2,#248
DJNZ R2,$
DJNZ R1,D1
RET
TABLE:
db 01h,03h,02h,06h,04h,0ch,08h,09h ;正轉表
db 00 ;正轉結束
db 01h,09h,08h,0ch,04h,06h,02h,03h ;反轉
db 00 ;反轉結束
END

Ⅶ 我有一51單片機控制步進電機調速程序,轉速太慢,22轉/分鍾,提到100轉/分鍾怎麼編程

脈沖間隔只靠delay(Y)來控制,把Y的值變為原來的1/5即可。

Ⅷ 誰能幫我寫一個51單片機控制制步進電機的程序

#include "reg52.h"
#include "INTRINS.H"
#include <absacc.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char

void check_addr(void); /*
地址核對
*/

uchar code slave_addr[4]={00, 01, 02, 255};

/*
從機地址
*/
uchar idata T0low, T0high,common_count,input_order,cmd_in_permit,interval;
uchar sent_ok,speed_change,start_up,start_end,address_true,i;

uint y1;

uint
code
add[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,651
11,65141,65167,65190,65211,65229,65245,65260,65273,65285,65296,65306,65315,65323,65331
,65339,65345,65352,65358,65363,65368,65373,65378,65382,65387,65390,65394,65398,65401,6
5404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,654
37,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65453,65455,65456,65457
,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65469,65470,6
5471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,654
80,65481};

sbit P2_0=P2^0;

/*
作輸入步進電機的脈沖信號發送口
*/
sbit P2_2=P2^2;

/*
作輸入步進電機的旋轉方向信號發送口
*/
sbit P1_0=P1^0;

/*
作串口輸出信號的使能口
, P1_0=0
時接通串口
,
輸出信號
*/
sbit WD=P1^7;

/*
看門狗
*/

main()
{

P2_0=0;

P2_2=0;

/*
步進電機的旋轉方向待試驗後確定
*/

P1_0=1;
/*
開機時需要關斷
,
串口發送功能
,
需要時再接通
*/

WD=1;

/*
看門狗先為
1
,電平翻轉為喂狗
*/

i=0;

common_count=0;

cmd_in_permit=0;

input_order=0;

interval=0;

address_true=1;

speed_change=0;

start_up=0;

2

start_end=0;

sent_ok=0;

//
允許發送

EA=1;
/*
開放總中斷
*/

TMOD=0x21;

TH1 = 0xFD;

//
波特率
9600

TL1 = 0xFD;

SCON = 0xd0;

//
設定串列口工作方式

PCON &= 0x00;

//
波特率不倍增

SM2=1;

TR1 = 1;

ES=1;

//
啟動定時器
1

T2MOD=00;

T2CON=0x00;

RCAP2H
=0xEE;

//

T2
的預置值
0xA600,25MS

0xB800

20MS,0xCA00

15MS,0xDC00

10MS

0xEE00

5MS

RCAP2L =0x00;

TR2=1;

//
啟動定時器

ET2=1;

//
打開定時器
2
中斷

do
{

if(address_true==1)

{

address_true=0;

check_addr();

}

if(start_up==1&&start_end==0)

//
第一次啟動

{

y1=add[common_count];

T0high = (uchar)(y1>>8)

/*

y1
的高
8

*/

T0low = (uchar)(y1&0x00ff);

/*

y1
的低
8

*/

TR0 = 1;

ET0=1;
/*
允許
T/C0
中斷
*/

start_end=1;

}

if(speed_change==1)

{

if(interval>=0&&interval<=0x63)

{

if(interval>common_count)

{common_count=common_count+1; }

if(interval<common_count)

{common_count=common_count-1; }

}

3

speed_change=0;

}

if(sent_ok==1)

{

sent_ok=0;

P1_0=0;

for(i=0;i<=20;i++) {_nop_();}

TI=0; SBUF=T0high;

while(TI==0);TI=0;

TI=0; SBUF=T0low;

while(TI==0);TI=0;

P1_0=1;

for(i=0;i<=20;i++) {_nop_();}

SM2=1;

}
}
while(1);
}

void timer0(void) interrupt 1 using 3

{

P2_0=~P2_0;

y1=add[common_count];

T0high = (uchar)(y1>>8)

/*

y1
的高
8

*/

T0low = (uchar)(y1&0x00ff);

/*

y1
的低
8

*/

TH0=T0high;
/*

8

T0high
送定時器
0

TH0*/

TL0=T0low;
/*

8

T0low
送定時器
0

TL0*/
}
void timer2(void) interrupt 5 using 2

{

TF2=0;
/*T2
溢出中斷需軟體清
0*/

speed_change=1;

//
速度可以改變標示,以便主程序處理

WD=!WD; /*MAX813
喂狗
*/

}

void inte_SERIAL() interrupt 4 using 1

/*
串口
0
中斷服務子程序
*/
{

uchar key_in

key_in=0;

if(RI)

{

Ⅸ 單片機控制步進電動機的運動的原理及單片機程序

51單片步進電機控制原理與控制設計程序
51單片步進電機是數字控制電機,它將脈沖信號轉變成角位移,即給一個脈沖信號,步進電機就轉動一個角度,因此非常適合於單片機控制。步進電機可分為反應式步進電機(簡稱vr)、永磁式步進電機(簡稱pm)和混合式步進電機(簡稱hb)。
51單片步進電機區別於其他控制電機的最大特點是,它是通過輸入脈沖信號來進行控制的,即電機的總轉動角度由輸入脈沖數決定,而電機的轉速由脈沖信號頻率決定。
51單片步進電機的驅動電路根據控制信號工作,控制信號由單片機產生。其基本原理作用如下:
(1)控制換相順序
通電換相這一過程稱為脈沖分配。例如:三相步進電機的三拍工作方式,其各相通電順序為a-b-c-d,通電控制脈沖必須嚴格按照這一順序分別控制a,b,c,d相的通斷。
(2)控制步51單片進電機的轉向
如果給定工作方式正序換相通電,步進電機正轉,如果按反序通電換相,則電機就反轉。
(3)控制51單片步進電機的速度
如果給步進電機發一個控制脈沖,它就轉一步,再發一個脈沖,它會再轉一步。兩個脈沖的間隔越短,步進電機就轉得越快。調整單片機發出的脈沖頻率,就可以對步進電機進行調速。步進電機是機電控制中一種常用的執行機構,它的用途是將電脈沖轉化為角位移,通俗地說:當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。通過控制脈沖個數即可以控制角位移量,從而達到准確定位的目的;同時通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。

閱讀全文

與51單片機步進電機調速程序相關的資料

熱點內容
如何用app覆蓋全部曲庫 瀏覽:602
變異布林源碼 瀏覽:684
表格加密設置列印區域 瀏覽:437
卡耐基pdf下載 瀏覽:922
現在最流行的單片機 瀏覽:88
機頂盒刷機源碼 瀏覽:985
編碼pdf下載 瀏覽:944
隔壁同學app怎麼 瀏覽:299
c語言宏命令 瀏覽:542
php卡死源碼 瀏覽:574
time庫中的clock函數python 瀏覽:989
cad視覺移動命令怎麼打開 瀏覽:821
安卓java調用python 瀏覽:395
java標准時間 瀏覽:137
華為伺服器湖北渠道商雲主機 瀏覽:30
韓式面部護理解壓視頻 瀏覽:301
pdf換成jpg圖片 瀏覽:897
dh加密演算法 瀏覽:107
安卓手機如何隱藏微信信息提示 瀏覽:632
nodejs解壓縮 瀏覽:262