单片机控制步进电机,51单片机控制步进电机

维修要闻     2020-12-24    浏览:25

51单片机控制步进电机

用单片机同时是不可能的,当然,时间间隔小到可以接受,跑几个任务,那也可以视为同时。要实现真正意义上的同时,用FPGA/CPLD是可以完成的。

话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电机,那就好办多了。

一个步进电机,比如4相5线那种,4个IO口可控制一个,四个步进电机就要16个,驱动芯片用ULN2003即可。

当然,如果你的IO口不允许使用这么多,那也可以通过串转并的方法,扩展IO口,比如用74HC595,三根IO口控制它,它可以级联,三根线可以控制很多片。一片为8位,两片就为16位,3片为24位 …… 只要加些三极管驱动那三根控制线,三个IO口可控制一串级联的74HC595,得到的扩展IO口,那是相当多的。我用三个IO口控制过5片74HC595,三个IO口一下子就扩展成了40个IO口!!!
51单片机控制步进电机

这个简单,让我来教楼主怎么玩
首先我说下思路:
我们采用P1口来采集ADC0832的8位数据,用P0.0口控制步进电机动作,利用T0的时间中断来采集P1口的ADC0832数据并做出比较后设置步进电机启动标志位start=1;并设置他的运行频率,当然,楼主没说怎么比较,我这就只是写了个简单的例子,一通百通,希望对你有帮助
下面是程序:
#include <reg51.h> //选用晶振11.0592MHz
unsigned int m=0,n=0; //设置循环的周期
unsigned char start=0,t0temp=0;
sbit Y0=P0^0; //控制步进电机的管脚
delay()
{
unsigned char i,j;
for(i=m;i>0;i--)
for(j=n;i>0;j--);
}

main()
{

//自检测T0时间设置
ET0=1;
TMOD|=0x01;
TH0=0XFC; //1ms中断扫描
TL0=0X66;
IT0=1; //下降沿触发
TR0=0; //关闭扫描
/***********************初始化完毕***********************/
//****************I/O口程序
while(1)
{
while(start)
{
delay();
Y0=~Y0;
}
}
}


void counter1(void) interrupt 1 //T0计时器中断
{
if(t0temp%4)t0temp++; //4ms时间才采集一次P0口的数据
else
{
t0temp++;
//这里就写你怎么做对比的程序,我举个例子
if(P1>150)
{start=1;n=1000;m=0;} //入错采用12M晶振,那这时候控制步进电机的输出周期就是1ms一次,也就是1000HZ
else {start=0;n=0;m=0;}
}
}
//PS:我在输出频率中用了两个全局变量m,n可以延迟很长时间,楼主可以根据需要选用,一般16位的,选用一个就可以了,另一个放弃
OK,至于电路图,我软件没有ADC0832的封装,不然就发给你了,但想来楼主完全就没必要担心,ADC0832的8位数据接到P1口,P0.0控制步进电机启动的三极管,电路图就那么简单!
如何使用单片机控制步进电机?

最低0.27元开通文库会员,查看完整内容>

原发布者:streate

^#include"reg52.h"#include"INTRINS.H"#include#include#defineuintunsignedint#defineucharunsignedcharvoidcheck_addr(void);ucharcodeslave_addr[4]={00,01,02,255};ucharidataT0low,T0high,common_count,input_order,cmd_in_permit,interval;ucharsent_ok,speed_change,start_up,start_end,address_true,i;uinty1;uintcodeadd[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,65111,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,65404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,65437,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,65471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,65480,65481};sbitP2_0=P2^0;sbitP2_2=P2^2;sbitP1_0=P1^0;sbitWD=P1^7;
单片机控制步进电机程序实例下载

#include<reg52.h>
#include <intrins.h>
#include <absacc.h>

#define uchar unsigned char
#define uint unsigned int

#define PA XBYTE[0X7FFC]
#define PB XBYTE[0X7FFD]
#define PC XBYTE[0xffe]
#define COM XBYTE[0X7FFF]

uchar num1,num2=0;

sbit M1_1 = P2^0;
sbit M1_2 = P2^1;
sbit M1_3 = P2^2;
sbit M1_4 = P2^3;

sbit M2_1 = P2^4;
sbit M2_2 = P2^5;
sbit M2_3 = P2^6;
sbit M2_4 = P2^7;

sbit M3_1 = P1^0;
sbit M3_2 = P1^1;
sbit M3_3 = P1^2;
sbit M3_4 = P1^3;

void delay_1ms () //误差 0us
{
unsigned char a,b;
for(b=30;b>0;b--)
for(a=100;a>0;a--);
}

void delay10ms(void)
{
unsigned char i=0,j=0;
for(i=0;i<20;i++)
for(j=0;j<248;j++);
}

void key ()
{
PC = 0xff;
if(PC!=0xff)
{
delay10ms ();
if(PC!=0xff)
{
P1 = PC;
}
}
}

void M1_clock () //X轴电机正转
{
M1_1=1;
M1_2=0;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=1;
M1_2=1;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=1;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=1;
M1_3=1;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=0;
M1_3=1;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=0;
M1_3=1;
M1_4=1;
delay_1ms();

M1_1=0;
M1_2=0;
M1_3=0;
M1_4=1;
delay_1ms();

M1_1=1;
M1_2=0;
M1_3=0;
M1_4=1;
delay_1ms();
}

void M1_aclock () //X轴电机反转
{
M1_1=0;
M1_2=0;
M1_3=0;
M1_4=1;
delay_1ms();

M1_1=0;
M1_2=0;
M1_3=1;
M1_4=1;
delay_1ms();

M1_1=0;
M1_2=0;
M1_3=1;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=1;
M1_3=1;
M1_4=0;
delay_1ms();

M1_1=0;
M1_2=1;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=1;
M1_2=1;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=1;
M1_2=0;
M1_3=0;
M1_4=0;
delay_1ms();

M1_1=1;
M1_2=0;
M1_3=0;
M1_4=1;
delay_1ms();
}

void M2_clock () //Y轴电机正转
{
M2_1=1;
M2_2=0;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=1;
M2_2=1;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=1;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=1;
M2_3=1;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=0;
M2_3=1;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=0;
M2_3=1;
M2_4=1;
delay_1ms();

M2_1=0;
M2_2=0;
M2_3=0;
M2_4=1;
delay_1ms();

M2_1=1;
M2_2=0;
M2_3=0;
M2_4=1;
delay_1ms();
}

void M2_aclock () //Y轴电机反转
{
M2_1=0;
M2_2=0;
M2_3=0;
M2_4=1;
delay_1ms();

M2_1=0;
M2_2=0;
M2_3=1;
M2_4=1;
delay_1ms();

M2_1=0;
M2_2=0;
M2_3=1;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=1;
M2_3=1;
M2_4=0;
delay_1ms();

M2_1=0;
M2_2=1;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=1;
M2_2=1;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=1;
M2_2=0;
M2_3=0;
M2_4=0;
delay_1ms();

M2_1=1;
M2_2=0;
M2_3=0;
M2_4=1;
delay_1ms();
}

void M3_clock () //Z轴电机正转
{
M3_1=1;
M3_2=0;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=1;
M3_2=1;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=1;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=1;
M3_3=1;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=0;
M3_3=1;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=0;
M3_3=1;
M3_4=1;
delay_1ms();

M3_1=0;
M3_2=0;
M3_3=0;
M3_4=1;
delay_1ms();

M3_1=1;
M3_2=0;
M3_3=0;
M3_4=1;
delay_1ms();
}

void M3_aclock () //Z轴电机反转
{
M3_1=0;
M3_2=0;
M3_3=0;
M3_4=1;
delay_1ms();

M3_1=0;
M3_2=0;
M3_3=1;
M3_4=1;
delay_1ms();

M3_1=0;
M3_2=0;
M3_3=1;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=1;
M3_3=1;
M3_4=0;
delay_1ms();

M3_1=0;
M3_2=1;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=1;
M3_2=1;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=1;
M3_2=0;
M3_3=0;
M3_4=0;
delay_1ms();

M3_1=1;
M3_2=0;
M3_3=0;
M3_4=1;
delay_1ms();
}

void timer_init ()
{
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
TH1=(65536-45872)/256;
TL1=(65536-45872)/256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}

void motor_rst ()
{
while (PC!=0xef)
{
M1_clock ();
}
_nop_;
while (PC!=0xf7|PC!=0xf7)
{
M2_clock ();
}
_nop_;
while (PC!=0xfe)
{
M3_clock ();
}
_nop_;
}

void main ()
{
COM = 0x8b;
timer_init ();

motor_rst ();

while (1)
{


}

}

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
num1++;
if(num1==20)
{
num1=0;
num2++;
}
if(num2==60)
num2=0;
}

相关搜索

相似文章