一、实验目的:
1.了解步进电机的特性及工作原理;
2.掌握步进电机采集数据的使用方法;
3.熟悉步进电机的操作、响应方式。
二、实验设备:
1.Proteus仿真软件;
2.keil c++编译软件;
3.串口调试工具和虚拟串口创建工具。
三、实验内容:
利用按键控制步进电机的工作方式;
四、实验步骤及数据分析:
1.传感器选型
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。电路图说明如下:
2.打开proteus新建工程“步进电机”,首先点击右上角“file”中的“新建工程”,选择新建工程的目录,如下图所示,之后直接选择默认下一步即可,最后出现Finish成功创建项目。3.在proteus画出对应的步进电机的电路图,电路图如下所示。
之后,右键Source Group 1,点击“Add New Item to Group’ Source Group 1’”,选中第一个.c文件,输入文件名(自己起)和文件保存的路径,然后点击“Add”即可。
在“.c”文件中写入代码之后,右键“target 1”,选中第一个,再出现的弹框中先点击“output”,之后勾选“Create HEX File”,最后点击“OK”。最后,点击keil工具栏中的
,编译代码。5.点击proteus电路图中的芯片,将Program File中的路径设置成之前创建的keil项目的.hex文件所在的目录,然后点击“确定”即可,最后点击proteus左下角的“运行”按钮
6. 通过按键控制步进电机的工作方式。
7. 关键代码分析
(需要新建一个c文件)
Main.c
/*******************************************************************************
* 实 验 名: 步进电机实验
* 使用的IO: 电机用P2口,按键使用P1.0、P1.1、P1.2、P1.3、P1.4、P1.5
* 按键功能:K1;正转 K2;反转 K3;低速转动 K4;高速转动 K5:电机切换 K6;停止
* 实验效果: 按下K1键,顺时针转,按下K2键,逆时针转,按下K3键,低速,按下K4键,高速。
按下K5键,转动的电机停止,并切换到控制另一个电机
按下K6键,转动的电机停止,按下K1或K2时,刚才停止的电机继续转动
*******************************************************************************/
#include "reg52.h"
// 电机IO
#define GPIO_MOTOR P2 // 宏定义 对端口进行操作,定义电机接口为P1
// sbit F1 = P2^0;
// sbit F2 = P2^1;
// sbit F3 = P2^2;
// sbit F4 = P2^3;
// sbit F5 = P2^4;
// sbit F6 = P2^5;
// sbit F7 = P2^6;
// sbit F8 = P2^7; //另种操作,位操作,定义电机接口为P1.0~p1.7
// 按键IO
sbit K1 = P1 ^ 0; // 正转
sbit K2 = P1 ^ 1; // 反转
sbit K3 = P1 ^ 2; // 减速
sbit K4 = P1 ^ 3; // 加速
sbit K5 = P1 ^ 4; // 电机切换
sbit K6 = P1 ^ 5; // 停止
unsigned char code FFW_X[8] = {0xf1, 0xf3, 0xf2, 0xf6, 0xf4, 0xfc, 0xf8, 0xf9}; // X反转顺序
unsigned char code FFZ_X[8] = {0xf9, 0xf8, 0xfc, 0xf4, 0xf6, 0xf2, 0xf3, 0xf1}; // X正转顺序
unsigned char code FFW_Y[8] = {0x1f, 0x3f, 0x2f, 0x6f, 0x4f, 0xcf, 0x8f, 0x9f}; // Y反转顺序
unsigned char code FFZ_Y[8] = {0x9f, 0x8f, 0xcf, 0x4f, 0x6f, 0x2f, 0x3f, 0x1f}; // Y正转顺序
unsigned char Direction, Speed, X_Y = 0, stop = 0; // Direction 转向标志位,Speed 延时函数的参数,通过改变它大小来控制电机转速
// X_Y 电机的参数 X_Y=0为Y电机 X_Y=1为X电机
void Delay(unsigned int t); // stop为控制电机停止的标志位,但它为1时,电机停止
void Motor(); // 电机旋转函数
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{
unsigned char i;
Speed = 20; // Speed 延时函数的参数,通过改变它大小来控制电机转速
while (1)
{
/********************检测按键K1是否按下***********************/
if (K1 == 0) // 检测按键K1是否按下
{
Delay(1); // 消除抖动
if (K1 == 0)
{
Direction = 1; // Direction 转向标志位,为1时为正转
stop = 0; // 按下K1时,对stop停止标志位清零,如果之前按下停止键,清零之后才能启动
}
while ((i < 200) && (K1 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
/********************检测按键K2是否按下***********************/
if (K2 == 0) // 检测按键K2是否按下
{
Delay(1); // 消除抖动
if (K2 == 0)
{
Direction = 2; // Direction 转向标志位,为2时为反转
stop = 0; // 按下K1时,也对stop停止标志位清零,如果之前按下停止键,清零之后才能启动
}
while ((i < 200) && (K2 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
/********************检测按键K3是否按下***********************/
if (K3 == 0) // 检测按键K3是否按下
{
Delay(1); // 消除抖动
if (K3 == 0)
{
Speed = 60; // Speed 延时函数的参数,通过改变它大小来控制电机转速
// 87行代码定义Speed=30;但按键K3按下后,Speed=60,这时转速就会降下来
}
while ((i < 200) && (K3 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
/********************检测按键K3是否按下***********************/
if (K4 == 0) // 检测按键K4是否按下
{
Delay(1); // 消除抖动
if (K4 == 0)
{
Speed = 30; // Speed 延时函数的参数,通过改变它大小来控制电机转速
// 87行代码定义Speed=30;但按键K4按下后,Speed=20,这时转速就会降下来升上去
}
while ((i < 200) && (K4 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
if (K5 == 0) // 检测按键K1是否按下
{
Delay(1); // 消除抖动
if (K5 == 0)
{
Direction = 0; // X_Y 电机的参数 X_Y=0为Y电机 X_Y=1为X电机
if (X_Y == 0) // 当切换电机时,对Direction=0;对标志位清零,防止上个电机的转向影响本次所控电机
X_Y = 1;
else
X_Y = 0;
}
while ((i < 200) && (K5 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
if (K6 == 0) // 检测按键K1是否按下
{
Delay(1); // 消除抖动
if (K6 == 0)
{
stop = 1; // stop为控制电机停止的标志位,但它为1时,电机停止
}
while ((i < 200) && (K6 == 0)) // 检测按键是否松开
{
Delay(1);
i++;
}
i = 0;
}
Motor();
}
}
/*******************************************************************************
* 函 数 名: Motor
* 函数功能: 电机旋转函数
* 输 入: 无
* 输 出: 无
*******************************************************************************/
void Motor()
{
unsigned char i;
for (i = 0; i < 8; i++)
{
if (Direction == 1 && X_Y == 0 && stop == 0) // 正转&Y电机&电机没按下停止
GPIO_MOTOR = FFW_Y[i] & 0xf0; // 取数据,‘&’按位与
if (Direction == 2 && X_Y == 0 && stop == 0) // 反转&Y电机&电机没按下停止
GPIO_MOTOR = FFZ_Y[i] & 0xf0;
if (Direction == 1 && X_Y != 0 && stop == 0) // 正转&X电机&电机没按下停止
GPIO_MOTOR = FFW_X[i] & 0x0F; // 取数据
if (Direction == 2 && X_Y != 0 && stop == 0) // 反转&X电机&电机没按下停止
GPIO_MOTOR = FFZ_X[i] & 0x0f;
Delay(Speed); // 调节转速
}
}
/*******************************************************************************
* 函 数 名 : Delay
* 函数功能 : 延时
* 输 入 : t
* 输 出 : 无
*******************************************************************************/
void Delay(unsigned int t)
{
unsigned int k;
while (t--)
{
for (k = 0; k < 45; k++)
{
}
}
}
五、实验小结:
实验结果截图:通过本次的实验,我对步进电机有了更加深刻的理解:
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。
步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。
步进电机相对于其它控制用途电机的最大区别是,它接收数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,它本身就是一个完成数字模式转化的执行元件。而且它可开环位置控制,输入一个脉冲信号就得到一个规定的位置增量,这样的所谓增量位置控制系统与传统的直流控制系统相比,其成本明显减低,几乎不必进行系统调整。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。