步进电机驱动一般通过脉冲数进行对应控制。
输入一个脉冲,则转动一个指定角度。通过驱动细分,一般会有不同的细分结果,以下程序为200/转,表示每转对应200个脉冲。即360°/200=1.8°,一般步进电机默认就是每个输入一个脉冲转1.8°。脉冲输出口为PUL
一、单脉冲驱动电机正反转控制程序
一般的电机除了通过脉冲口PUL控制转角,还需要通过一个DIR控制其转向。即给定DIR低电平,电机顺时针转动,给定DIR高电平,电机逆时针转动
#define PUL 9// 脉冲位
#define DIR 8//方向位
void setup() {
//
pinMode(PUL,OUTPUT);//设置输出口
pinMode(DIR,OUTPUT);//设置输出口
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Forward Begins");//输入正转开始
digitalWrite(DIR,HIGH);//设置逆时针转
for(int x=0;x<200;x++)
{
digitalWrite(PUL,HIGH);
delayMicroseconds(500);
digitalWrite(PUL,LOW);
delayMicroseconds(500);
//一个脉冲转一个步长 总步数为200步/圈 循环一次实现一个脉冲
}
Serial.println("Forward ENDs");//输入正转结束
delay(1000);
//改变转向
Serial.println("Backward Begins");//输入正转开始
digitalWrite(DIR,LOW);//设置顺时针转
for(int x=0;x<600;x++)
{
digitalWrite(PUL,HIGH);
delayMicroseconds(500);
digitalWrite(PUL,LOW);
delayMicroseconds(500);
//一个脉冲转一个步长 总步数为200步/圈 循环一次实现一个脉冲 总计转三圈
}
Serial.println("Backward ENDs");//输入反转结束
delay(2000);
}
二、双脉冲输入电机正反转控制
双脉冲输入指的是PUL输入脉冲时,电机顺时针转动,DIR输入脉冲时,电机逆时针转动。
为了实现电机能够转动指定的角度,并可以调整电机的转速,又定义了一个电动机的类函数,并补充修改了算法,具体如下:
class STEPPER//定义一个电机类函数
{
public:
byte DirPin, PulPin, EnaPin;//定义步进电机控制信号输出引脚
byte APin, BPin;//定义编码器输入引脚对应A相与B相信号输入
long StepTime = 1000;//steptime表示每步的时间
long CurrentStep = 0, TargetStep = 0;//当前步数与目标步数
STEPPER(byte dir, byte pul, byte en, byte a, byte b)//设置引脚信息
{//定义输出引脚,byte is 数据类型字节,从0-225
DirPin = dir;
PulPin = pul;
EnaPin = en;
//设置为输出引脚
pinMode(DirPin, OUTPUT);
pinMode(PulPin, OUTPUT);
pinMode(EnaPin, OUTPUT);
//初始化为低电平
digitalWrite(DirPin, 0);
digitalWrite(PulPin, 0);
digitalWrite(EnaPin, 0);
//定义编码器输入引脚
APin = a;
BPin = b;
//设置为输入引脚
pinMode(APin, INPUT);
pinMode(BPin, INPUT);
}
bool IsRunToTarget()//是否走到目标
{
return TargetStep == CurrentStep;
}
//采用现有频率控制步进电机转动指定角度
bool RunTo(long target)//只输入目标步长
{
TargetStep = target;//赋值目标步数给targetstep
while(IsRunToTarget() == false)//调用函数判断是否走到了目标步数
{
runStep(CurrentStep < target);//走步
}
CurrentStep=0;//运行一次后需要将当前步数清零以进行下一次控制
return IsRunToTarget();
}
//采用指定频率控制步进电机转动指定角度
bool RunTo(long target, long stepTime)//既输入目标步长 又输入周期也是频率 用于调节速度
{
TargetStep = target;//修改目标
StepTime = stepTime;//修改周期
while(IsRunToTarget() == false)
{
runStep(CurrentStep < target);
}
CurrentStep=0;//运行一次后需要将当前步数清零以进行下一次控制
return IsRunToTarget();
}
private:
void runStep(bool dir)//, unsigned long st,bool pulpin,bool dirpin
{
if(dir==0)//如果CurrentStep>target,顺时针赚
{digitalWrite(PulPin, 1);
delayMicroseconds(StepTime/2);//高电平保持1/2周期
digitalWrite(PulPin, 0);
delayMicroseconds(StepTime/2);//低电平保持1/2周期
CurrentStep += (dir ? 1 : -1);
}
else//逆时针转
{digitalWrite(DirPin, 1);
delayMicroseconds(StepTime/2);
digitalWrite(DirPin, 0);
delayMicroseconds(StepTime/2);
CurrentStep += (dir ? 1 : -1);
}
}
};
STEPPER MyStepperA(10, 9, 4,6,5);//步进电机数字引脚对应接口
//采用此方法可以控制多个电机,例如设置MyStepperB
void setup()
{
MyStepperA.RunTo(400,5000);
//电机设置400步/圈,表明每个脉冲转0.9°,这里要求电机转400步,即刚好转一圈
//5000是脉冲周期,单位微秒,对应频率为200HZ
delay(500);
MyStepperA.RunTo(400,1000);//正转一圈
delay(500);
MyStepperA.RunTo(-400,300); //反转一圈
delay(2000);
}
void loop()//闭循环
{
}