导航:首页 > 操作系统 > 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