参考:https://www.arduino.cn/thread-75936-1-1.html
知识点:
步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
正文:
本文用Arduino 驱动步进电机28BYJ48,没有使用库文件,编写的程序简捷高效。注意,连接成组,在端口4 5 6 7,之后就可以测试了。程序测试通过,没有问题,供学习Arduino和步进电机用。
[kenrobot_code]/*********************************
功能:驱动28BYJ-48步进电机
设计:凌晨七點半
日期:2018.3.25
连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
Arduino Uno R3 4 5 6 7引脚 也就是PORTD 4 5 6 7
*********************************/
//定义连接为PD4 PD5 PD6 PD7
#define ROTATE(x) {PORTD|=x; PORTD&=(x|0x0F);}
//四相单四拍
const char SinBeat[4]={0x80,0x40,0x20,0x10};
//四相双四拍
const char DulBeat1[4]={0xc0,0x60,0x30,0x90};
//四相双八拍
const char DulBeat2[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
//节拍模式选择
#define MODE DulBeat2
void setup() {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Serial.begin(9600);
}
//逆时针旋转
void Anti_Clockwise(int Speed)
{
for(int i=0;i<sizeof(MODE);i++)
{
ROTATE(MODE);
delay(Speed);
}
}
//顺时针旋转
void Clockwise(int Speed)
{
for(int i=sizeof(MODE);i>=0;i--)
{
ROTATE(MODE);
delay(Speed);
}
}
void loop() {
Clockwise(50);
delay(500);
//Serial.println("OK...");
}[/kenrobot_code]
IMG_20180325_173728.jpg (399.76 KB, 下载次数: 208)
2018-3-25 17:39 上传
<ignore_js_op>
2018-4-13 21:03 上传
点击文件名下载附件
参考:
/*********************************
功能:驱动28BYJ-48步进电机
设计:凌晨七點半
日期:2018.3.25
连接引脚:分别将28BYJ-48驱动器的IN1 IN2 IN3 IN4连接到
Arduino Uno R3 4 5 6 7引脚 也就是PORTD 4 5 6 7
*********************************/
//定义连接为PD4 PD5 PD6 PD7#define ROTATE(x) {PORTD|=x;PORTD&=(x|0x0F);}
unsigned long Time;
unsigned long End;//四相单四拍
const char SinBeat[4]={0x80,0x40,0x20,0x10};
//四相双四拍
const char DulBeat1[4]={0xc0,0x60,0x30,0x90};
//四相双八拍
const char DulBeat2[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};//节拍模式选择
#define MODE SinBeat//DulBeat1
void setup() {
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Serial.begin(9600);
}
////逆时针旋转
//void Anti_Clockwise(int Speed)
//{
//for(int i=0;i<sizeof(MODE);i++)
//{
// ROTATE(MODE[i]);//{PORTD|=MODE[i];PORTD&=(MODE[i]|0x0F);}
//delay(Speed);
//}
//}
//顺时针旋转
void Clockwise(int Speed)
{
for(int i=sizeof(MODE);i>=0;i--)
{
ROTATE(MODE[i]);
delay(Speed);
}
}
void loop() {
Time = millis();
do
{
Clockwise(2);
End = millis() - Time;
} while(End < 6000);delay(25920000); // 一天86400000 三天25920000
//Serial.println("OK...");}