单片机控制步进电机正反转
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delay(10);
GPIO_MOTOR = FFZ[3];
Delay(10);
GPIO_MOTOR = FFZ[4];
Delaywenku.baidu.com10);
GPIO_MOTOR = FFZ[5];
Delay(10);
GPIO_MOTOR = FFZ[6];
Delay(15);
GPIO_MOTOR = FFZ[7];
{
Delay(10);//消除抖动
if(K2==0)
{
Direction=2;
}
while((i<200)&&(K2==0))//检测按键是否松开
{
Delay(10);
i++;
}
i=0;
}
Motor();
LED=0;
}
}
void Motor()
{
if(Direction==1)
{
GPIO_MOTOR = FFW[0];
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];
Delay(15);
GPIO_MOTOR = FFZ[2];
{
unsigned char i;
while(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay(10);//消除抖动
if(K1==0)
{
Direction=1;
}
while((i<200)&&(K1==0))//检测按键是否松开
{
Delay(10);
i++;
}
i=0;
}
if(K2==0)//检测按键K1是否按下
其实本题目要求是要转180°,所以才一步一步走的,如果只是一直转则只需把电机驱动函数改为:
void Motor()
{
unsigned char i;
for(i=0;i<8;i++)
{
GPIO_MOTOR = FFW[i];
Delay(Speed);//调节转速
}
}
当然,这种控制个人觉得是不太精确的,如果只是让一个轴转动180度,则用步进电机外接减速箱,然后接一轴,让电机转一圈,轴转10度或20度,则控制会更精准。
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()
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--);
}
C语言程序:
#include <reg52.h>
#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}; //反转顺序
简单的单片机控制步进电机
电路原理图:
过程简介:
用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灯亮。
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];
GPIO_MOTOR = FFZ[3];
Delay(10);
GPIO_MOTOR = FFZ[4];
Delaywenku.baidu.com10);
GPIO_MOTOR = FFZ[5];
Delay(10);
GPIO_MOTOR = FFZ[6];
Delay(15);
GPIO_MOTOR = FFZ[7];
{
Delay(10);//消除抖动
if(K2==0)
{
Direction=2;
}
while((i<200)&&(K2==0))//检测按键是否松开
{
Delay(10);
i++;
}
i=0;
}
Motor();
LED=0;
}
}
void Motor()
{
if(Direction==1)
{
GPIO_MOTOR = FFW[0];
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];
Delay(15);
GPIO_MOTOR = FFZ[2];
{
unsigned char i;
while(1)
{
if(K1==0)//检测按键K1是否按下
{
Delay(10);//消除抖动
if(K1==0)
{
Direction=1;
}
while((i<200)&&(K1==0))//检测按键是否松开
{
Delay(10);
i++;
}
i=0;
}
if(K2==0)//检测按键K1是否按下
其实本题目要求是要转180°,所以才一步一步走的,如果只是一直转则只需把电机驱动函数改为:
void Motor()
{
unsigned char i;
for(i=0;i<8;i++)
{
GPIO_MOTOR = FFW[i];
Delay(Speed);//调节转速
}
}
当然,这种控制个人觉得是不太精确的,如果只是让一个轴转动180度,则用步进电机外接减速箱,然后接一轴,让电机转一圈,轴转10度或20度,则控制会更精准。
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()
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--);
}
C语言程序:
#include <reg52.h>
#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}; //反转顺序
简单的单片机控制步进电机
电路原理图:
过程简介:
用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灯亮。
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];