传感器与射频识别之步进电机实验

一、实验目的:

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++)
        {
        }
    }
}

五、实验小结:

实验结果截图:请添加图片描述通过本次的实验,我对步进电机有了更加深刻的理解:
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。
步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。
步进电机相对于其它控制用途电机的最大区别是,它接收数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,它本身就是一个完成数字模式转化的执行元件。而且它可开环位置控制,输入一个脉冲信号就得到一个规定的位置增量,这样的所谓增量位置控制系统与传统的直流控制系统相比,其成本明显减低,几乎不必进行系统调整。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。

完整版实验文档doc下载链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@小冯@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值