概述
演示单极步进电机的控制。没有现成的 H 桥模块,双极步进电机就不做实验啦。
这里没有使用 stepper 库,用 IO 粗糙地原始地驱动,以加深对步进电机驱动的理解,实际使用的时候当然有库就用库啦。
示例程序
整步驱动
// ----------------------------------------------------------------------------
// unipolarStepperTest_fullStep.ino
//
// Created 2015-06-27
// By seesea
//
// 单极步进电机单相励磁整步驱动方式测试
//
// 通过 uln2003 来控制,arduino 每一个 IO 口接一个输入,对应输出分别接到电机上,因 uln2003 是集电极开路输出,所以电机公共端接高电平
// ----------------------------------------------------------------------------
const unsigned char pins[] = { 8, 9, 10, 11 };
const unsigned char pinNum = sizeof(pins) / sizeof(pins[0]);
const unsigned char delayMs = 10; // 每步动作间隔,控制速度
const char dir = 1; // 正负一用来控制转动方向
void setup()
{
for (unsigned char i = 0; i < pinNum; ++i)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], LOW);
}
}
// 每次进入函数时轮换引脚,在轮换到的引脚上发出高电平后经 uln2003 反相成低电平给电机上电
void loop()
{
static unsigned char pulsePin = 0;
digitalWrite(pins[pulsePin], HIGH);
delay(delayMs);
digitalWrite(pins[pulsePin], LOW);
pulsePin = (pulsePin + dir + pinNum) % pinNum;
}
半步驱动
// ----------------------------------------------------------------------------
// unipolarStepperTest_halfStep.ino
//
// Created 2015-06-28
// By seesea
//
// 单极步进电机单相励磁半步驱动方式测试
// 使用两种方式来实现,一种使用数组做控制序列的,一种使用算法来实现
//
// 通过 uln2003 来控制,arduino 每一个 IO 口接一个输入,对应输出分别接到电机上,因 uln2003 是集电极开路输出,所以电机公共端接高电平
// ----------------------------------------------------------------------------
const unsigned char pins[] = { 8, 9, 10, 11 };
const unsigned char pinNum = sizeof(pins) / sizeof(pins[0]);
const unsigned char delayMs = 10; // 每次动作间隔,控制速度
const char dir = 1; // 正负一用来控制转动方向
const unsigned char controlSeq[] = { 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01, 0x09 }; // 控制序列:以低四位来表示 pins 里的 4 个引脚某一次动作时需要通电的两引脚
const unsigned char pinMask[] = { 0x01, 0x02, 0x04, 0x08 }; // 引脚对应掩码
const unsigned char seqNum = sizeof(controlSeq) / sizeof(controlSeq[0]);
// 如果把控制序列改成这样,就变成原来的单相励磁整步前进的方式:const unsigned char controlSeq[] = { 0x08, 0x04, 0x02, 0x01 };
// 如果把控制序列改成这样,就变成双相励磁整步前进的方式:const unsigned char controlSeq[] = { 0x0C, 0x06, 0x03, 0x09 };
// 使用控制序列的方式来实现的半步驱动
// 对于复杂的没有什么规律的方式可以选用
void halfStep_controlSeq()
{
static unsigned char seqIndex = 0; // 当前序列
// 发出高电平后经 uln2003 反相成低电平给电机上电
for (unsigned char i = 0; i < pinNum; ++i)
{
digitalWrite(pins[i], (controlSeq[seqIndex] & pinMask[i]) ? HIGH : LOW);
}
seqIndex = (seqIndex + dir + seqNum) % seqNum;
delay(delayMs);
}
// 用算法来实现的半步驱动
// 半步驱动的操作其实也是有一定规律的,所以也可以用一定的算法来实现
void halfStep_algrothm()
{
static unsigned char pulsePin1 = 0;
static unsigned char pulsePin2 = 0;
digitalWrite(pins[pulsePin1], HIGH);
digitalWrite(pins[pulsePin2], HIGH);
delay(delayMs);
digitalWrite(pins[pulsePin1], LOW);
digitalWrite(pins[pulsePin2], LOW);
// 算法实现
// 两个引脚的索引按规律前进(这里的前进是以 dir 为标准,如果 dir 是负数,把后退方向当成前进):
// - 当两个引脚一样的时候,pin1 前进
// - 当两个引脚不一样的时候,pin2 前进
if (pulsePin1 == pulsePin2)
pulsePin1 = (pulsePin1 + dir + pinNum) % pinNum;
else
pulsePin2 = (pulsePin2 + dir + pinNum) % pinNum;
}
void setup()
{
Serial.begin(9600);
for (unsigned char i = 0; i < pinNum; ++i)
{
pinMode(pins[i], OUTPUT);
digitalWrite(pins[i], LOW);
}
}
void loop()
{
halfStep_controlSeq();
// halfStep_algrothm();
}
实验照片