arduino步进电机程序库_Arduino 入门程序示例之步进电机(2015-06-28)

这篇博客介绍了如何使用Arduino控制单极步进电机,包括整步驱动和半步驱动的实现。作者通过不使用stepper库,而是直接操作IO口来深入理解步进电机的驱动原理。示例程序详细展示了如何通过编程控制步进电机的转动方向和速度。
摘要由CSDN通过智能技术生成

概述

演示单极步进电机的控制。没有现成的 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();

}

实验照片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值