28BYJ-48步进电机控制程序基础

发布者:PeacefulWarrior最新更新时间:2016-12-24 来源: eefocus关键字:28BYJ-48  步进电机  控制程序 手机看文章 扫描二维码
随时随地手机看文章

解决了精度问题,让我们再次回到我们的电机控制程序上吧。上面给出的两个例程都不是实用的程序,为什么?因为程序中存在大段的延时,而在延时的时候是什么其它的事都干不了的,想想第二个程序,整整 200 秒什么别的事都干不了,这在实际的控制系统中是绝对不允许的。那么怎么改造一下呢?当然还是用定时中断来完成了,既然每个节拍持续时间是2ms,那我们直接用定时器定时 2ms 来刷新节拍就行了。改造后的程序如下:

#include

unsigned long beats = 0; //电机转动节拍总数

void StartMotor(unsigned long angle);

void main(){

    EA = 1;  //使能总中断

    TMOD = 0x01; //设置 T0 为模式 1

    TH0 = 0xF8; //为 T0 赋初值 0xF8CD,定时 2ms

    TL0 = 0xCD;

    ET0 = 1; //使能 T0 中断

    TR0 = 1; //启动 T0

    StartMotor(360*2+180); //控制电机转动 2 圈半

    while (1);

}

/* 步进电机启动函数,angle-需转过的角度 */

void StartMotor(unsigned long angle){

    //在计算前关闭中断,完成后再打开,以避免中断打断计算过程而造成错误

    EA = 0;

    beats = (angle * 4076) / 360; //实测为 4076 拍转动一圈

    EA = 1;

}

/* T0 中断服务函数,用于驱动步进电机旋转 */

void InterruptTimer0() interrupt 1{

    unsigned char tmp;  //临时变量

    static unsigned char index = 0; //节拍输出索引

    unsigned char code BeatCode[8] = { //步进电机节拍对应的 IO 控制代码

        0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6

    };

    TH0 = 0xF8; //重新加载初值

    TL0 = 0xCD;

    //节拍数不为 0 则产生一个驱动节拍

    if (beats != 0){

        tmp = P1; //用 tmp 把 P1 口当前值暂存

        tmp = tmp & 0xF0; //用&操作清零低 4 位

        //用|操作把节拍代码写到低 4 位

        tmp = tmp | BeatCode[index];

        //把低 4 位的节拍代码和高 4 位的原值送回 P1

        P1 = tmp;

        index++; //节拍输出索引递增

        index = index & 0x07; //用&操作实现到 8 归零

        beats--; //总节拍数-1

    }else{ //节拍数为 0 则关闭电机所有的相

        P1 = P1 | 0x0F;

    }

}

程序还是比较简单的,电机转动的启动函数 StartMotor 只负责计算一个需要的总节拍数beats,然后在中断函数内检测这个变量,不为 0 时就执行节拍操作,同时将其减 1,直到减到 0 为止。


这里,我们要特别说明一下的是 StartMotor 函数中对 EA 的两次操作。我们可以看到对beats 的赋值计算语句是夹在 EA=0;EA=1;这两行语句中间的,也就是说这行赋值计算语句在执行前先关闭了中断,而等它执行完后,才又重新打开了中断。在它执行过程中单片机是不会响应中断的,即中断函数 InterruptTimer0 不会被执行,即使这时候定时器溢出了,中断发生了,也只能等待 EA 重新置 1 后,才能得到响应,中断函数 InterruptTimer0 才会被执行。


那么为什么要这么做呢?我们来想一下:在本书开始我们就曾提到,我们所使用的STC89C52 单片机是 8 位单片机,这个 8 位的概念就是说单片机操作数据时都是按 8 位即按1 个字节进行的,那么要操作多个字节(不论是读还是写)就必须分多次进行了。而我们程序中定义的 beats 这个变量是 unsigned long 型,它要占用 4 个字节,那么对它的赋值最少也要分 4 次才能完成了。我们想象一下,假如在完成了其中第一个字节的赋值后,恰好中断发生了,InterruptTimer0 函数得到执行,而这个函数内可能会对 beats 进行减 1 的操作,减法就有可能发生借位,借位就会改变其它的字节,但因为此时其它的字节还没有被赋入新值,于是错误就会发生了,减 1 所得到的结果就不是预期的值了!所以要避免这种错误的发生就得先暂时关闭中断,等赋值完成后再打开中断。而如果我们使用的是 char 或 bit 型变量的话,因为它们都是在 CPU 的一次操作中就完成的,所以即使不关中断,也不会发生错误。问题分析清楚了,如何取舍还得根据实际情况来,遇上这类问题的时候多多考虑考虑吧。


关键字:28BYJ-48  步进电机  控制程序 引用地址:28BYJ-48步进电机控制程序基础

上一篇:简易加法计算器
下一篇:实用的电机控制程序

推荐阅读最新更新时间:2024-03-16 15:26

意法半导体:通用电机与步进电机控制方案(一)
意法半导体拥有强大的、面向电机控制应用的产品组合。 运转顺畅和高效率推动了电机控制的发展。 面向PMSM、PMAC和感应电机(其采用高性能微控制器、功率晶体管与高压栅极驱动器IC)的磁场定向控制(FOC)软件的发展满足了对更高效率的需求。 对于功率较低的应用而言,面向步进电机的新型高集成度控制器/驱动器IC可以为步进电机实现更顺畅的运转和更高的定位精度。 通用电机 通用电机属于串励电机,可由AC或DC电源供电。 由于励磁(定子)绕组与电枢(转子)绕组串联,所以任一极性的电流都会产生方向相同的转矩。 由于2个绕组内的电流和磁场同时反转,所以在AC电源供电的情况下,电机运转良好。 通用电机的优点在于起动转矩高、设计紧凑、运行速度快
[模拟电子]
意法半导体:通用电机与<font color='red'>步进电机</font>控制方案(一)
步进电机最简单的驱动方法_步进电机控制方法
  步进电机最简单的驱动方法   最简单的步进电机驱动方法是单相双极驱动方式,也称为双相步进驱动方式。该方式只需要使用一个 H桥驱动器和一个脉冲发生器,即可实现步进电机的驱动控制。   具体的驱动过程如下:   将步进电机的两个相连接到 H桥驱动器的两个输出端口。   将脉冲发生器连接到 H桥驱动器的输入端口,通过控制脉冲的频率和占空比,可以控制步进电机的转速和方向。   通过控制脉冲的数量和频率,可以控制步进电机旋转的步数和转角。   需要注意的是,单相双极驱动方式只能实现单个步进电机的基本驱动控制,对于需要高精度、高速度和高扭矩的应用场景,需要采用更复杂的驱动方式和控制算法。   步进电机控制方法   步进电机的控制方法主
[嵌入式]
锅炉筒打孔专机数控系统
1 前 言 为实现锅炉筒壁孔加工自动化而设计的数控系统,是以MCS-51单片机为控制核心、步进电机为驱动电机、机床大、小拖板为执行部件的两坐标开环控制系统。大拖板纵向移动以确定打孔位置,脉冲当量值为0.02mm/步,最大进给速度为5m/min。小拖板横向移动以实现刀具的快进和工进。系统具有点动对刀、自动加工、暂停和继续、急停报警、回零等主要功能。 2 硬件结构与功能 系统硬件分布于一块控制主板和两块驱动板上。 在以8031单片机为主的控制主板上,扩展一片27256EPROM,用于存放系统软件,一片2764EPROM,用于固化经过调试的零件加工程序,一片带掉电保护的6264RAM,用于随机存储手工编辑的零件加工程序。
[嵌入式]
步进电机相关的定义及硬件介绍
步进电机常用来做定位控制,它可以由PLC输出的脉冲数量控制旋转的角度(相对来说可以是距离),脉冲的频率控制步进电机旋转的速度。但用于控制精度不是很高的场合,简单、经济、控制方便;对于控制精度要求很高的场合,就得使用伺服控制系统了。 步进系统=步进驱动器+步进电机。步进电机由步进驱动器来驱动,相当于驱动电源,且它受外部的脉冲信号和方向信号控制(这里举例是西门子PLC输出脉冲),进而控制步进电机的旋转角度和速度。 步进驱动器+步进电机+西门子PLC(CPU 222 CN) 相关的定义 1、驱动器:用于PLC控制步进电机的媒介,负责把PLC给的脉冲信号经过放大后,输给步进电机,使电机按照PLC和驱动器给定的参数运行。 控
[嵌入式]
<font color='red'>步进电机</font>相关的定义及硬件介绍
基于GAL器件的步进电机控制器的研究与设计
摘要:介绍了利用阵列逻辑器件GAL16V8对三相六拍步进电机实现控制的方法及其电路设计。通过计算机编程器对GAL进行编程,可以满足各种控制要求。该电路简单,工作稳定可靠,编程灵活方便。 关键词:通用阵列逻辑器件 步进电机 GAL16V8 三相六拍 步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可
[半导体设计/制造]
伺服电机和步进电机的技术问答
  伺服电机和步进电机的技术问答:   1、如何正确选择伺服电机和步进电机?   主要视具体应用情况而定,简单地说要确定:负载的性质(如水平还是垂直负载等),转矩、惯量、转速、精度、加减速等要求,上位控制要求(如对端口界面和通讯方面的要求),主要控制方式是位置、转矩还是速度方式。供电电源是直流还是交流电源,或电池供电,电压范围。据此以确定电机和配用驱动器或控制器的型号。   2、选择步进电机还是伺服电机系统?   其实,选择什么样的电机应根据具体应用情况而定,各有其特点。请见下表,自然明白。   3、如何配用步进电机驱动器?   根据电机的电流,配用大于或等于此电流的驱动器。如果需要低振动或高精度时,可配用细分型驱动器。对于大转矩电
[嵌入式]
永磁步进电机的基本概念、结构组成及工作原理
永磁步进电机是一种兼容且高效的设备,具有多种应用。由于转子由永磁体制成,不需要任何外部励磁,这使其在玩具、小型电机等应用中非常有用。 在设计方面,每次旋转的步距角可以轻松设计,这使得永磁步进电机在医疗仪器和航空结构等精密应用中非常有用。另外,由于体积小,它具有很高的移动性和易于使用等优势特点。 基本概念 永磁步进电机是一种机电能量转换装置,也就是将电能转换为机械能。在步进电机中,转子和定子磁场都被激发,因此转子磁场和定子磁场的相互作用产生扭矩。而在永磁步进电机中,转子线圈没有励磁,而是使用永磁体。 在传统的步进电机中,使用电磁铁,需要外部激励才能产生转子磁场。但在永磁步进电机当中,使用了永磁体,这减少了转子励磁系统并使
[嵌入式]
永磁<font color='red'>步进电机</font>的基本概念、结构组成及工作原理
使用MSP430G2 LaunchPad开发板连接步进电机的方法
在本篇文章中,我们将介绍如何使用MSP430 LaunchPad开发板连接一个步进电机。 MSP-EXP430G2是德州仪器(TI)提供的开发工具,又名LaunchPad,用于学习和练习如何使用他们提供的微控制器。该开发板属于MSP430产品线,我们可以使用它对所有MSP430系列微控制器进行编程。如果您是MSP430的新手,请查看MSP430 LaunchPad的入门教程。 所需的材料 ● MSP430 LaunchPad开发板 ● 35BYJ46或28-BYJ48步进电机 ● ULN2003驱动芯片 ● 连接导线 ● 面包板 步进电机 步进电机是一种无刷直流电机,可将电脉冲转换为不同的机械运动。步进电机的轴以
[单片机]
使用MSP430G2 LaunchPad开发板连接<font color='red'>步进电机</font>的方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

502 Bad Gateway

502 Bad Gateway


openresty
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved