【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制

【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制


  • Proteus仿真演示
    在这里插入图片描述
  • 功能说明

正反转采用2和3 引脚外部中断,3和4引脚调节加减速。

示例程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

#define LED ( 13 )
#define MOTOR\_PIN0 ( 8 )
#define MOTOR\_PIN1 ( 9 )
#define MOTOR\_PIN2 ( 10 )
#define MOTOR\_PIN3 ( 11 )
#define KEY\_Add ( 4 )
#define KEY\_Sub ( 5 )

static unsigned char Speed = 110;//初始速度值
unsigned char ButtonAdd = 0 ;//按键+状态
unsigned char ButtonSub = 0 ;//按键-状态

unsigned char CW_flag = 0 ;//按键正转状态
unsigned char CCW_flag = 0 ;//按键反转状态


unsigned char phasecw[8] ={0x01,0x02,0x04,0x08};// 逆时针
unsigned char phaseccw[8]={0x08,0x04,0x02,0x01};// 顺时针

void SetMotor(unsigned char InputData);//根据传送的数据Inputdata设置脉冲引脚输出
void motorNcircle(bool DIR);//position为正转或者反转
void Add()
{
Speed +=10;
if(Speed > 250) Speed =250;//最大值
}
void Sub()
{
Speed -=10;
if(Speed < 100) Speed =110;//最小值
}
void Trg\_CW(){CCW_flag = 0; CW_flag = !CW_flag;}
void Trg\_CCW(){CW_flag = 0; CCW_flag = !CCW_flag;}
void StepperCW(){ motorNcircle(1);}
void StepperCCW(){ motorNcircle(0);}
void setup()
{
pinMode( LED, OUTPUT );//指示灯
pinMode( MOTOR_PIN0, OUTPUT );//电机控制相线
pinMode( MOTOR_PIN1, OUTPUT );
pinMode( MOTOR_PIN2, OUTPUT );
pinMode( MOTOR_PIN3, OUTPUT );
pinMode(2, INPUT_PULLUP);//加速按键
pinMode(3, INPUT_PULLUP);//减速按键
pinMode(KEY_Add, INPUT_PULLUP);//正转/停止检测按钮
pinMode(KEY_Sub, INPUT_PULLUP);//反转/停止检测按钮
attachInterrupt(0, Trg_CW, FALLING); //外部中断号 0,接引脚IO 2,触发方式:高电平变为低电平触发(下降沿触发)
attachInterrupt(1, Trg_CCW, FALLING); //外部中断号 1,接引脚I0 3,触发方式:高电平变为低电平触发(下降沿触发)
}

void loop()
{
static unsigned char i = 0;
unsigned char ButtonAdd = digitalRead(KEY_Add);//正转按键被按下
unsigned char ButtonSub = digitalRead(KEY_Sub);//反转按键被按下
if(ButtonAdd == 0){//检测到有按键按下
delay(10);//消抖处理
if(ButtonAdd == 0){//确认按键被按下
ButtonAdd = 1 - ButtonAdd ;
while(!digitalRead(KEY_Add));//等待按键被释放抬起
}
}
if(ButtonSub == 0){//检测到有按键按下
delay(10);//消抖处理
if(ButtonSub == 0){//确认按键被按下
ButtonSub = 1 - ButtonSub ;
while(!digitalRead(KEY_Sub));//等待按键被释放抬起
}
}
if(ButtonAdd){ Add(); }
if(ButtonSub){ Sub(); }
if(CW_flag){StepperCW();}//正转
if(CCW_flag){StepperCCW();}//反转

else{
//这里可以填写其他控制代码
digitalWrite( MOTOR_PIN0, LOW );
digitalWrite( MOTOR_PIN1, LOW );
digitalWrite( MOTOR_PIN2, LOW );
digitalWrite( MOTOR_PIN3, LOW );
digitalWrite( LED, HIGH );
}
}

void SetMotor(unsigned char InputData)//根据传送的数据Inputdata设置脉冲引脚输出
{//根据传送的数据Inputdata设置IO8-IO11引脚输出
if(InputData&0x01)
{
digitalWrite( MOTOR_PIN0, HIGH );
}
else
{
digitalWrite( MOTOR_PIN0, LOW );
}
if(InputData&0x02)
{
digitalWrite( MOTOR_PIN1, HIGH );
}
else
{
digitalWrite( MOTOR_PIN1, LOW );

}
if(InputData&0x04)
{
digitalWrite( MOTOR_PIN2, HIGH );
}
else
{
digitalWrite( MOTOR_PIN2, LOW );
}
if(InputData&0x08)
{
digitalWrite( MOTOR_PIN3, HIGH );
}
else
{
digitalWrite( MOTOR_PIN3, LOW );
}
}

//position 方向
void motorNcircle(bool DIR)//n为步进电机转动的圈数,position为正转或者反转
{
byte k=0;
for(k=0;k<4;k++)
{//4相单双8拍
if(DIR)
{
SetMotor(phasecw[k]);
}
else
{
SetMotor(phaseccw[k]);
}
delay(110);//延时:速度控制,数值越大速度越慢。电流0.65A
}
}

程序源码和仿真资源

1
2
3
链接:https://pan.baidu.com/s/1SEogH1of56iEOfrnAMdZjQ 
提取码:n0u0


生活里有很多转瞬即逝,像在车站的告别,刚刚还相互拥抱,转眼已各自天涯。很多时候,你不懂,我也不懂,就这样,说着说着就变了,听着听着就倦了,看着看着就厌了,走着走着就散了,爱着爱着就淡了,想着想着就算了