首页>问题汇总>步进电机 - 叶光伟
叶光伟 - 步进电机

步进电机(板子自带驱动器,即steppingrun3()函数):

 

 

控制思想(四相八拍为例):此步进电机为四相步进电机,四相八拍控制即进行以下循环:
1(高电平,其他为低电平,后同)—1,2(高)—2(高)—2,3(高)—3(高)—3,4(高)—4(高)—4,1(高)—1(高)。
程序控制:

  1. (1)对速度的控制,即在拍与拍之间增加一个delay()函数,但是delay()的时间不宜过快也不宜过慢,过慢则步进电机行走抖动厉害,过快的话则步进电机只响不转。

即 if(flag == 1)
{
MOTOR1A_H();
MOTOR1B_L();
MOTOR1C_L();
MOTOR1D_L();
Delay(m)
}
else if(flag == 2)
{
MOTOR1A_H();
MOTOR1B_H();
MOTOR1C_L();
MOTOR1D_L();
Delay(m).................

  1. (2)对路程的控制,即增加一个for函数,入口条件即为脉冲数。

     即  for(;m>0;m--)
{
for(n=64;n>0;n--)
{
if(flag == 1)
{
MOTOR1A_H();
MOTOR1B_L();
MOTOR1C_L();
MOTOR1D_L();
}.................

  1. (3)对方向的控制,对每一拍添加一个标志位,若为正向,则标志位递增,若为反向,则标志位递减。

    即 if(dir == 1)
{
flag ++;
if(flag > 8)
{
flag = 1;
}
}
else
{
flag --;
if(flag < 1)
{
flag = 8;
}
}..............

 

可参考的步进电机源代码(motor.h和motor.c文件,延时函数delay参见延时函数链接)

 

/*-----------motor.h----------*/

#ifndef _MOTOR_H_
#define _MOTOR_H_

#define MOTOR1A_H() PORTA|=(1<<3) //步进电机3四相高低电平
#define MOTOR1A_L() PORTA&=(~(1<<3))
#define MOTOR1B_H() PORTA|=(1<<2)
#define MOTOR1B_L() PORTA&=(~(1<<2))
#define MOTOR1C_H() PORTA|=(1<<1)
#define MOTOR1C_L() PORTA&=(~(1<<1))
#define MOTOR1D_H() PORTA|=(1<<0)
#define MOTOR1D_L() PORTA&=(~(1<<0))

#define PUL2_H() PORTE|=(1<<6) //步进电机1 脉冲信号
#define PUL2_L() PORTE&=(~(1<<6))
#define DIR2_H() PORTE|=(1<<7) //步进电机1 方向信号
#define DIR2_L() PORTE&=(~(1<<7))

#define PUL1_H() PORTA|=(1<<4)//步进电机2 脉冲信号
#define PUL1_L() PORTA&=(~(1<<4))
#define DIR1_H() PORTE|=((1<<2)) //步进电机2 方向信号
#define DIR1_L() PORTE&=(~(1<<2))

void SteppingRun1(unsigned char dis,unsigned char dir);
void SteppingRun2(unsigned char dis,unsigned char dir);
void SteppingRun3(unsigned char dis,unsigned char dir);

#endif

 

/*----------motor.c----------*/

#include <iom64v.h>
#include <macros.h>
#include "delay.h"
#include "motor.h"

void SteppingRun1(unsigned char dis,unsigned char dir)
{
static unsigned char flag = 0;
unsigned char m;
unsigned char n;
m=dis;
if(dir == 1)
{
DIR1_H();
}
else
{
DIR1_L();
}
for(;m>0;m--)
{
for(n=64;n>0;n--)
{
if(flag == 0)
{
PUL1_L();
}
else
{
PUL1_H();
}
flag = !flag;
}
}
}
void SteppingRun2(unsigned char dis,unsigned char dir)
{
static unsigned char flag = 0;
unsigned char m;
unsigned char n;
m=dis;
if(dir == 1)
{
DIR2_H();
}
else
{
DIR2_L();
}
for(;m>0;m--)
{
for(n=64;n>0;n--)
{
if(flag == 0)
{
PUL2_L();
}
else
{
PUL2_H();
}
flag = !flag;
}
}
}
void SteppingRun3(unsigned char dis,unsigned char dir)//板子带驱动步进电机
{
static unsigned char flag = 1;
unsigned char m;
unsigned char n;
m=dis;
for(;m>0;m--)
{
for(n=64;n>0;n--)
{
if(flag == 1)
{
MOTOR1A_H();
MOTOR1B_L();
MOTOR1C_L();
MOTOR1D_L();
}
else if(flag == 2)
{
MOTOR1A_H();
MOTOR1B_H();
MOTOR1C_L();
MOTOR1D_L();
}
else if(flag == 3)
{
MOTOR1A_L();
MOTOR1B_H();
MOTOR1C_L();
MOTOR1D_L();
}
else if(flag == 4)
{
MOTOR1A_L();
MOTOR1B_H();
MOTOR1C_H();
MOTOR1D_L();
}
else if(flag == 5)
{
MOTOR1A_L();
MOTOR1B_L();
MOTOR1C_H();
MOTOR1D_L();
}
else if(flag == 6)
{
MOTOR1A_L();
MOTOR1B_L();
MOTOR1C_H();
MOTOR1D_H();
}
else if(flag == 7)
{
MOTOR1A_L();
MOTOR1B_L();
MOTOR1C_L();
MOTOR1D_H();
}
else if(flag == 8)
{
MOTOR1A_H();
MOTOR1B_L();
MOTOR1C_L();
MOTOR1D_H();
}
if(dir == 1)
{
flag ++;
if(flag > 8)
{
flag = 1;
}
}
else
{
flag --;
if(flag < 1)
{
flag = 8;
}
}
delay_ms(5);
}
}
}

Copyright © 2019 作者:张泽zzhang1@gzu.edu.cn. 大学教师. 网站备案号:黔ICP备18012493号