简单的单片机控制步进电机
电路原理图:
过程简介:
用AT89C52单片机控制步进电机,P3.0和P3.1引脚外接两个开关按钮,做控制用。P2.0引脚接一LED灯,接上拉电阻,做提示信号用。P1口为电机提供信号。用ULN2003D,它是个达林顿器件,主要是给步进电机供电,因为如果直接用单片机对步进电机供电,则电压不足。RST引脚外接开关按钮,提供程序复位。步进电机采用M42SP-5五线四相步进电机,直接接在DIANJI口。其基本工作过程是单片机先查看是否有按键按下,延时消抖,检查是否松开。然后进入电机驱动程序,电机驱动程序主要是向P1口按规律发送0或1,之前建立的数组按照A,AB,B,BC,C,CD,D,DA顺序向ULN2003D提供信号,ULN2003D也按照这个顺序给电机供电。从而使步进电机进行步进。当轴旋转180°后,单片机向P2.0引脚发出低电平信号,则LED灯亮。
其实本题目要求是要转180°,所以才一步一步走的,如果只是一直转则只需把电机驱动函数改为:
void Motor()
{
}
unsigned char i; for(i=0;i
当然,这种控制个人觉得是不太精确的,如果只是让一个轴转动180度,则用步进电机外接减速箱,然后接一轴,让电机转一圈,轴转10度或20度,则控制会更精准。
C语言程序:
#include
#define GPIO_MOTOR P1
sbit LED=P2^0;
sbit K1=P3^0;
sbit K2=P3^1;
unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序
unsigned char Direction;
void Delay(unsigned int t);
void Motor();
void main()
{
unsigned char i;
while(1)
{
{ } if(K2==0) { } Delay(10); if(K1==0) { } //消除抖动 Direction=1; while((i
} } void Motor()
{
if(Direction==1) { GPIO_MOTOR = FFW[0]; Delay(15); GPIO_MOTOR = FFW[1]; Delay(15); GPIO_MOTOR = FFW[2]; Delay(10); GPIO_MOTOR = FFW[3]; Delay(10); GPIO_MOTOR = FFW[4]; Delay(10); GPIO_MOTOR = FFW[5]; Delay(10); GPIO_MOTOR = FFW[6]; Delay(15); GPIO_MOTOR = FFW[7]; Delay(15);
}
if(Direction==2) { GPIO_MOTOR = FFZ[0]; Delay(15); GPIO_MOTOR = FFZ[1];
GPIO_MOTOR = FFZ[2]; Delay(10); GPIO_MOTOR = FFZ[3]; Delay(10); GPIO_MOTOR = FFZ[4]; Delay(10); GPIO_MOTOR = FFZ[5]; Delay(10); GPIO_MOTOR = FFZ[6]; Delay(15); GPIO_MOTOR = FFZ[7]; Delay(15);
}
}
void Delay(unsigned int t)
{ ///1ms unsigned char a,b;
for(;t>0;t--)
for(b=38;b>0;b--)
for(a=13;a>0;a--); }