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

发布者:TechVoyager最新更新时间:2017-11-15 来源: eefocus关键字:28BYJ-48  步进电机  控制程序基础 手机看文章 扫描二维码
随时随地手机看文章

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

#include 
unsigned long beats = 0; //电机转动节拍总数
void StartMotor(unsigned long angle);
void main(){
    EA = 1;  //使能总中断
    TMOD = 0x01; //设置 T0 为模式1
    TH0 = 0xF8; //为 T0 赋初值 0xF8CD,定时 2 ms
    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 步进电机控制程序基础

上一篇:让 28BYJ-48 步进电机转起来
下一篇:实用的 28BYJ-48 步进电机控制程序

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

单片机的步进电机开环控制系统
    步进电机是一种将电脉冲信号变换成相应的角位移或直线位移的机电执行元件。控制步进电机的输入脉冲数量、频率及电机各相绕组的接通顺序,可以得到各种需要的运行特性。尤其与数字设备配套时,体现了更大的优越性,因此广泛应用于数字控制系统中。     本文介绍已实现的单片机对步进电机的数字控制系统。该控制系统中,控制器担负着产生脉冲以及发送、接收控制命令的任务。本文对控制器的设计,尤其是脉冲产生电路的设计作了详细的介绍。 1 系统设计     步进电机开环控制系统框图如图1所示。系统由步进电机控制器、步进电机驱动电源、步进电机和LED状态显示等4部分组成,本文着重介绍步进电机控制器、步进电机驱动电源、LED 显示状态3部分。
[单片机]
51单片机--巧记步进电机相关知识
上次说的LCD1602的编程挺复杂的,这次我说一个简单一点的:步进电机。 这里不说步进电机的 细分 实验,只说一下有关步进电机的基础概念以及步进电机的三种工作方式——单拍、双拍、单双拍,现在步进电机的编程一般都要用到专门的步进电机驱动芯片(如:L6219芯片),所以具体的编程下次再讲。先说一下相、线和极性。 一:线、相、极性 相 就是说明步进电机有几个线圈(也叫做绕组)。 线 就是说明步进电机有几个接线口。 极性 分为 单极性 和 双极性。如果步进电机的线圈是可以双向导电的,那么这个步进电机就是双极性的,相反,如果步进电机的线圈是只允许单向导电的,那么这个步进电机就是单极性的。 上面的三个只要知道其中两个,
[单片机]
51单片机--巧记<font color='red'>步进电机</font>相关知识
基于STM32F103VCT6单片机和步进电机的三维微位移控制系统设计
为实现X-Y-Z三维工作台的精确定位,设计了一种基于STM32F103VCT6单片机和步进电机的三维微位移控制系统。该系统可与上位机实现串口通信,接收上位机命令并把处理结果反馈给上位机;根据光栅传感器提供的位置反馈信息,系统可以通过对步进电机的方向、速度调节来实现精确定位;采用匀加速和匀减速方式对步进电机的速度进行调节,避免了因步进电机的突然加速和急停所带来的丢步和冲击现象。控制系统的测量实验结果表明,步进电机运行平稳,噪音低,定位精度高,控制系统性能稳定可靠。 微位移控制系统是一种集机械、光学、电子和计算机等多种技术于一体的智能化仪器。在先进制造技术与科学研究中有着极其广泛的应用,也是现代工业检测、质量控制和制造技术
[单片机]
基于STM32F103VCT6单片机和<font color='red'>步进电机</font>的三维微位移控制系统设计
东芝的新步进电机驱动器IC具有防失步反馈技术
东京–东芝公司(东京:6502)存储与电子元器件解决方案公司于今天宣布推出一款步进电机驱动器“TB67S289FTG”,它采用了东芝开发的结构,能自动检测和预防运行过程中的失步情况。新产品量产预计将于2017年7月底开始。 对于打印机、办公设备、ATM等银行终端、娱乐设备和家用电器等的电机应用而言,基本的操作要求是稳定和高精度的控制。而最新的要求也日益强调需要提高电机驱动器的效率,即降低功耗和发热量。 避免步进电机在操作过程中发生失步的情况,这是确保电机控制实现稳定性和精确性的第一要务,而实现这一要务的方法是提供附加电流以确保电机的工作范围。若要提高效率和降低发热量,还需要使用附加的传感器和高级MCU控制以实时监测电
[电源管理]
东芝的新<font color='red'>步进电机</font>驱动器IC具有防失步反馈技术
基于步进电机控制技术的汽车辅助照明随动系统设计
驾驶A、B级汽车的驾驶员会遇到这样的问题,当夜晚行驶在盘山公路或乡村的小街巷时,总觉得前大灯照着的方向与你行驶的道路不一致。行车速度和行车安全存在很大问题。汽车辅助照明随动系统是以单片机AT892051芯片为控制核心,控制步进电机带动辅助照明光源,随方向盘的转动而转动。对汽车的前大灯照明起到辅助作用。辅助照明光源采用高亮度LED灯,这种光源节能、抗震性能好、重量轻,符合“辅助”的特点,可以随时安装或取下。安装时只需用光源底部的永久磁铁吸附在驾驶室顶部或汽车的任何部位。用霍尔开关检测汽车的转向、转角的大小以及转弯的速率,将检测信号和倒车信号一起送至单片机的输入接口,经单片机分析、计算、判断后,由单片机的输出接口输出控制信号,控制步进
[嵌入式]
一文看懂HB混合式步进电机与相数、转子齿数、主极数的关系
    混合式步进是指混合了永磁式和反应式的优点,分为两相和五相,两相步进角一般为1.8度而五相步进角一般为 0.72度,这种步进电机的应用最为广泛。   在《HB型混合式步进电机的结构和工作原理详解》我们已经详细的了解到了它的结构及工作原理,接下来小编将带领大家来详细了解一下HB型混合式步进电机与相数、转子齿数、主极数的关系。本文首先介绍的是步进电机相数、转子齿数和主极数的表达式,其次介绍了相内及相间磁路的一般形式。     步进电机相数、转子齿数和主极数的表达式   如HB型步进电机为P相,转子齿数则依据式θs=180°/PNr可知其步距角久为θs=180°/PNr。此时,定子1相主极数(A“杠A”相的总和)为m个
[工业控制]
详解混合式直线步进电机技术
 步进电机由旋转运动变为线性运动可用几种机械方法完成,包括齿条和齿轮传动及皮带轮传动以及其他机械联动机械。所有这些设计都需要各种机械零件。而完成这种转变的最有效方法是在电机自身内部实现。   说明   基本的步进电机是由有磁性的转子铁芯通过与由定子产生的脉动的定子电磁场相互作用而产生转动。直线电机把旋转运动变为线性运动,完成这个转变的精密性取决于转子的步进角度和所选方法。线性步进电机,或者称为直线步进电机,首先出现在1968年的第3,402,308号专利上,是颁发给Willian Henschke的。从此以后,直线步进电机被应用于包括制造、精密调准和精密流体测量在内的诸多高要求领域。   使用螺纹的直线电机的精密度,取决于它的螺
[嵌入式]
步进电机驱动器选型需要注意的参数
步进 电机驱动器 的电流 电流是判断步进电机驱动器能力的大小,是选择驱动器的重要指标之一,通常驱动器的最大电流要略大于电机标称电流,通常驱动器有2.0A、3.5A、6.0A、8.0A等规格。 步进电机驱动器供电电压 供电电压是判断驱动器升速能力的标志,常规电压供给有:24VDC、40VDC、80VDC、110VAC等。 步进电机驱动器的细分 细分是控制精度的标志,通过增大细分能改善精度。细分能增加 电机 平稳性,通常步进电机都有低频振动的特点,通过加大细分可以改善,使电机运行非常平稳。 控制信号接口说明 差分式接口 兴丰元步进电机驱动器采用差分式接口电路,内置高速光电耦合器,允许接收长线驱动器,集电极开路
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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