步进电机
命名方式
以28BYJ48步进电机为例
28-----步进电机的有效最大外径是28毫米
B-----表示步进电机
Y-----表示永磁式
J-----表示减速型
48-----表示四相八拍
控制顺序
单片机
实物图
源码
最简源码
#include <reg52.h>
unsigned char code F_Rotation[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正转
void delay_n(unsigned char z)
{
unsigned char i;
for (i=z; i>0; i--);
}
void delay_ms(unsigned char z)//延时1ms
{
unsigned char i;
for(i=z;i>0;i--)
{
delay_n(110);
}
}
int main()
{
unsigned char i;
while(1)
{
for(i=0;i<8;i++)
{
P1=F_Rotation[i];
delay_ms(10); //延时越高转速越慢
}
}
}
控制正反转和转速
#include <reg52.h>
#define u8 unsigned char
#define s32 int
#define motor P1
sbit turn_bit_r = P2^0; // 正转
sbit turn_bit_l = P2^1; // 反转
sbit turn_speed_a = P2^2; // 加速
sbit turn_speed_d = P2^3; // 减速
u8 code F_Rotation[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正转
void delay_n(s32 z)
{
s32 i;
for (i=z; i>0; i--);
}
void delay_ms(s32 z)//延时1ms
{
s32 i;
for(i=z;i>0;i--)
{
delay_n(110);
}
}
int main()
{
s32 i;
u8 flag = 0; //正反转,0:顺时针,1:逆时针
s32 speed = 70;
while(1)
{
if (turn_bit_r == 0)
{
delay_ms(10);
if (turn_bit_r == 0)
{
flag = 0;
}
}
if (turn_bit_l == 0)
{
delay_ms(10);
if (turn_bit_l == 0)
{
flag = 1;
}
}
if (turn_speed_a == 0)
{
delay_ms(10);
if (turn_speed_a == 0)
{
if (speed > 70){
speed -= 10;
} else {
delay_ms(500);
}
}
}
if (turn_speed_d == 0)
{
delay_ms(10);
if (turn_speed_d == 0)
{
if (speed < 1000){
speed += 10;
} else {
delay_ms(500);
}
}
}
// 电机
if (flag)
{
for(i=7;i>=0;i--)
{
motor=F_Rotation[i];
delay_n(speed); //延时越高转速越慢
}
}
else
{
for(i=0;i<8;i++)
{
motor=F_Rotation[i];
delay_n(speed); //延时越高转速越慢
}
}
}
}
开关、正反转、转速,优化版
#include <reg52.h>
#define u8 unsigned char
#define s32 int
#define motor P1
sbit bit_turn_switch = P2^0; // 开关
sbit bit_turn_rl = P2^1; // 正反转
sbit turn_speed_a = P2^2; // 加速
sbit turn_speed_d = P2^3; // 减速
u8 code F_Rotation[] = {0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//正转
u8 code stop = 0x0;
void delay_n(s32 z)
{
s32 i;
for (i=z; i>0; i--);
}
void delay_ms(s32 z)//延时1ms
{
s32 i;
for(i=z;i>0;i--)
{
delay_n(110);
}
}
int main()
{
s32 i;
u8 turn_switch = 0;
u8 flag = 0; //正反转,0:顺时针,1:逆时针
s32 speed = 0;
while(1)
{
if (bit_turn_switch == 0)
{
delay_ms(10);
if (bit_turn_switch == 0)
{
turn_switch = ~turn_switch;
}
while (bit_turn_switch == 0);
}
if (bit_turn_rl == 0)
{
delay_ms(10);
if (bit_turn_rl == 0)
{
flag = ~flag;
}
while (bit_turn_rl == 0);
}
if (turn_speed_a == 0)
{
delay_ms(10);
if (turn_speed_a == 0)
{
if (speed > 500){
speed -= 30;
} else if (speed > 200) {
speed -= 20;
} else if (speed > 50) {
speed -= 10;
} else if (speed > 10) {
speed -= 5;
} else if (speed > 0) {
speed -= 2;
} else {
delay_ms(500);
}
}
}
if (turn_speed_d == 0)
{
delay_ms(10);
if (turn_speed_d == 0)
{
if (speed < 10) {
speed += 2;
} else if (speed < 50) {
speed += 5;
} else if (speed < 200) {
speed += 10;
} else if (speed < 500) {
speed += 20;
} else if (speed < 800){
speed += 30;
} else {
delay_ms(500);
}
}
}
// 电机
if (turn_switch){
if (flag)
{
for(i=7;i>=0;i--)
{
motor = F_Rotation[i];
delay_n(70);
delay_n(speed); //延时越高转速越慢
}
}
else
{
for(i=0;i<8;i++)
{
motor = F_Rotation[i];
delay_n(70);
delay_n(speed); //延时越高转速越慢
}
}
} else {
motor = stop;
}
}
}