0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单片机控制步进电机的资料和代码详细说明

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-06-27 10:19 次阅读

步进电机机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

T89C2051单片机驱动步进电机的电路和源码

程序

stepper.c

stepper.hex

/*

* STEPPER.C

* sweeping stepper‘’s rotor cw and cww 400 steps

* Copyright (c) 1999 by W.Sirichote

*/

#include c:mc518051io.h /* include i/o header file */

#include c:mc518051reg.h

register unsigned char j,flag1,temp;

register unsigned int cw_n,ccw_n;

unsigned char step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90}

#define n 400

/* flag1 mask byte

0x01 run cw()

0x02 run ccw()

*/

main()

{

flag1=0;

serinit(9600);

dISAble(); /* no need timer interrupt */

cw_n = n; /* initial step number for cw */

flag1 |=0x01; /* initial enable cw() */

while(1){

{

tick_wait(); /* wait for 10ms elapsed */

energize(); /* round-robin execution the following tasks every 10ms */

cw();

ccw();

}

}

}

cw(){

if((flag1&0x01)!=0)

{

cw_n--; /* decrement cw step number */

if (cw_n !=0)

j++; /* if not zero increment index j */

else

{flag1&=~0x01; /* dISAble cw() execution */

ccw_n = n; /* reload step number to ccw counter */

flag1 |=0x02; /* enable cww() execution */

}

}

}

ccw(){

if((flag1&0x02)!=0)

{

ccw_n--; /* decremnent ccw step number */

if (ccw_n !=0)

j--; /* if not zero decrement index j */

else

{flag1&=~0x02; /* dISAble ccw() execution */

cw_n = n; /* reload step number to cw counter */

flag1 |=0x01; /* enable cw() execution */

}

}

}

tick_wait(){ /* cputick was replaced by simpler ASM code 10ms wait */

asm“ JNB TCON.5,*”; /* wait for TF0 set */

asm“ CLR TCON.5”; /* clear TF0 for further set */

asm“ ORL TH0,#$DC”; /* reload TH0 with $DC, TL0 = 0 */

}

energize(){

P1 = step[(j&0x07)]; /* only step 0-7 needed */

}

一、步进电机常识

常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度 或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为 0.72度。这种步进电机的应用最为广泛。

二、永磁式步进电机的控制

下面以电子爱好者业余制作中常用的永磁式步进电机为例,来介绍如何用单片机控制步进电机。

图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM端标识为C,只要AC、 C、BC、 C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、 、B、 轮流接地。

下表列出了该电机的一些典型参数

表135BY48S03型步机电机参数

型号 步距角 相数 电压 电流 电阻 最大静转距 定位转距 转动惯量

35BY48S03 7.5 4 12 0.26 47 180 65 2.5

有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为0.26A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过 P1.4~P1.7来控制各线圈的接通与切断,电路如图3所示。开机时,P1.4~P1.7均为高电平,依次将P1.4~P1.7切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。如果要改变电机的转动速度只要改变两次接通之间的时间,而要改变电机的转动方向,只要改变各线圈接通的顺序。

图135BY48S03型步进电机外形图

图235BY48S03型步进电机的接线图

图3单片机控制35BY48S03型步进电机的电路原理

三、步进电机的驱动实例

要求:控制电路如图3所示,开机后,电机不转,按下启动键,电机旋转,速度为25转/分,按下加1键,速度增加,按下减1键,速度降低,最高速度为100转/分,最低转带为25转/分,按下停止键,电机停转。速度值要求在数码管上显示出来。

1.要求分析

按上面的分析,改变转速,只要改变P1.0~P1.3轮流变低电平的时间即可达到要求,这个时间不应采用延时来实现,因为会影响到其他功能的实现。这里以定时的方式来实现。下面首先计算一下定时时间。

按要求,最低转速为25转/分,而上述步进电机的步距角为7.5,即每48个脉冲为1周,即在最低转速时,要求为1200脉冲/分,相当于50ms/脉冲。而在最高转速时,要求为100转/分,即48000脉冲/分,相当于12.5ms/脉冲。可以列出下表

表1步进电机转速与定时器定时常数关系

速度 单步时间(us) TH1 TL1 实际定时(us)

25 50000 76 0 49996.8

26 48077 82 236 48074.18

27 46296 89 86 46292.61

28 44643 95 73 44640.155

… … … … …

100 12500 211 0 12499.2

表中不仅计算出了TH1和TL1,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。

表中TH1和TL1是根据定时时间算出来的定时初值,这里用到的晶振是11.0592M。有了上述表格,程序就不难实现了,使用定时/计数器T1为定时器,定时时间到后切换输出脚即可。

2.程序实现

定义DSB-1A实验板的S1为启动键,S2为停止键,S3为加1键,S4为减1键,程序如下:

StartEnd bit 01H ;起动及停止标志

MinSpd EQU 25 ;起始转动速度

MaxSpd EQU 100 ;最高转动速度

Speed DATA 23H ;流动速度计数

DjCount DATA 24H ;控制电机输出的一个值,初始为11110 111

Hidden EQU 10H ;消隐码

Counter DATA 57H ;显示计数器

DISPBUF DATA 58H ;显示缓冲区

ORG 0000H

AJMP MAIN

ORG 000BH

JMP DISP

ORG 001BH

JMP DJZD

ORG 30H

MAIN:

MOV SP,#5FH

MOV P1,#0FFH

MOV A,#Hidden

MOV DispBuf,A

MOV DispBuf+1,A

MOV DispBuf+2,A

MOV DjCount,#11110111B

MOV SPEED,#MinSpd ;起始转动速度送入计数器

CLR StartEnd ;停转状态

MOV TMOD,#00010001B ;

MOV TH0,#HIGH(65536-3000)

MOV TL0,#LOW(65536-3000)

MOV TH1,#0FFH;

MOV TL1,#0FFH

SETB TR0

SETB EA

SETB ET0

SETB ET1

LOOP: ACALL KEY ;键盘程序

JNB F0,m_NEXT1 ;无键继续

ACALL KEYPROC ;否则调用键盘处理程序

m_NEXT1:

MOV A,Speed

MOV B,#10

DIV AB

MOV DispBuf+5,B ;最低位

MOV B,#10

DIV AB

MOV DispBuf+4,B

MOV DispBuf+3,A

JB StartEnd,m_Next2

CLR TR1 ;关闭电机

JMP LOOP

ORL P1,#11110000B

m_Next2:

SETB TR1 ;启动电机

AJMP LOOP ;主程序结束

;---------------------------------------

D10ms:

……

;---------延时程序,键盘处理中调用

KEYPROC:

MOV A,B ;获取键值

JB ACC.2,StartStop ;分析键的代码,某位被按下,则该位为1

JB ACC.3,KeySty

JB ACC.4,UpSpd

JB ACC.5,DowSpd

AJMP KEY_RET

StartStop:

SETB StartEnd ;启动

AJMP KEY_RET

KeySty:

CLR StartEnd; ;停止

AJMP KEY_RET

UpSpd:

INC SPEED;

MOV A,SPEED

CJNE A,#MaxSpd,K1 ;到了最多的次数?

DEC SPEED ;是则减去1,保证下次仍为该值

K1:

AJMP KEY_RET

DowSpd:

DEC SPEED

MOV A,SPEED

CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回

MOV SPEED,#MinSpd;

KEY_RET:

RET

KEY:

……获取键值的程序

RET

DjZd: ;定时器T1用于电机转速控制

PUSH ACC

PUSH PSW

MOV A,Speed

SUBB A,#MinSpd ;减基准数

MOV DPTR,#DjH

MOVC A,@A+DPTR

MOV TH1,A

MOV A,Speed

SUBB A,#MinSpd

MOV DPTR,#DjL

MOVC A,@A+DPTR

MOV TL1,A

MOV A,DjCount

CPL A

ORL P1,A

MOV A,DjCount

JNB ACC.7,d_Next1

JMP d_Next2

d_Next1:

MOV DjCount,#11110111B

d_Next2:

MOV A,DjCount

RL A

MOV DjCount,A ;回存

ANL P1,A

POP PSW

POP ACC

RETI

DjH: DB 76,82,89,95,100,106,110,115,119,123,12……

DjL: DB 0,236,86,73,212,0,214,96,163,165

……

DISP: ;显示程序

POP PSW

POP ACC

……

RETI

BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH

DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

END

3.程序分析

本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器的高3位消隐,步进电机驱动的各引脚均输出高电平,然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序,否则直接转下一步。下一步是将当前的转速值转换为BCD码,送入显示缓冲区;接着判断 StartEnd这个位变量,是“1”还是“0”,如果是“1”,则开启定时器T1,否则关闭定时器T1,为防止关闭时某一相线圈长期通电,因此,在关闭定时器T1时,将P1.0~P1.3均置高。至此,主程序的工作即结束。这里为简便起见,这里没有做高位“0”消隐的工作,即如果速度为10转/分,则显示值“010”,读者可以自行加入相关的代码来处理这一工作。

步进电机的驱动工作是在定时器T1的中断服务程序中实现的,由前述分析,每次的定时时间到达以后,需要将P1.0~P1.3依次接通,程度中用了一个变量DjCntr来实现这一功能,在主程序初始化时,该变量被赋予初值 11110111B,进入到定时中断以后,将该变量取出送ACC累加器,并在累加器中进行左移,这样,该数值就变为1110 1111,然后将该数与P1 相“与”,此时,P1.4即输出低电平,第二次进入中断时,先将该数取反,成为 00010000,然后将该数与P1相“或”,这样,P1.4即输出高电平,关断了相应的线圈,然后将该数重新取出,并作左移,即1110,1111右移成为11011111,将该数与P1相“与”,这样P1.5即输出低电平,依次类推,P1.7~P1.4即循环输出低电平。当这一数据变为0111 1111后,需要作适当的改动,将数据重新变回11110111,进行第二次循环,相关代码,请读者自行分析。

定时时间又是如何确定的呢?这里用的是查表的方法,首先用Excel计算得出在每一种转速下的TH值和TL值,然后,分别放入DjH和DjL表中,在进入T1中断程序之后,将速度值变量Speed送入累加器ACC,然后减去基数25,使其基数从 0开始计数,然后分别查表,送入TH1和TL1,实现重置定时初值的目的。

看完这一部份内容以后,请读者自行完成以下工作:

1. 更改程序,将S1定义为“启动/停止”,而S2定义为“方向”,按下S2,切换电机旋转方向。

2. 更改程序,要求转速从1到100。

3. 更改程序,实现首位无效零消隐

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44514

    浏览量

    632915
  • 步进电机
    +关注

    关注

    150

    文章

    3095

    浏览量

    147343
收藏 人收藏

    评论

    相关推荐

    基于MSP430单片机的模糊逻辑电机控制

    电子发烧友网站提供《基于MSP430单片机的模糊逻辑电机控制.pdf》资料免费下载
    发表于 10-23 10:21 0次下载
    基于MSP430<b class='flag-5'>单片机</b>的模糊逻辑<b class='flag-5'>电机</b><b class='flag-5'>控制</b>

    利用MSP430单片机控制步进电机

    电子发烧友网站提供《利用MSP430单片机控制步进电机.pdf》资料免费下载
    发表于 10-09 14:18 0次下载
    利用MSP430<b class='flag-5'>单片机</b><b class='flag-5'>控制</b><b class='flag-5'>步进</b><b class='flag-5'>电机</b>

    基于STM32单片机步进电机控制系统设计

    系统内使用按键进行步进电机控制,可以控制步进电机的启动和关闭,使用按键进行加速和减速以及进行旋
    的头像 发表于 06-25 14:14 933次阅读
    基于STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b>系统设计

    基于51单片机步进电机正反转调速控制电路图及程序

    本资源内容概要:       这是基于51单片机步进电机正反转调速控制电路图及程序设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源
    发表于 06-20 16:17 0次下载

    串口通信如何控制步进电机转动?

    在自动化控制系统中,步进电机控制是一项重要的技术任务。通过串口通信控制步进
    的头像 发表于 04-19 16:23 1728次阅读

    arduino控制步进电机代码

    中,我们将详细介绍如何使用Arduino来控制步进电机代码步进
    的头像 发表于 02-14 16:29 1881次阅读

    步进电机控制方法 步进电机和伺服电机的区别

    步进电机控制方法 步进电机是一种将电信号转化为机械转动的电动机,其输出转角是按照电脉冲控制信号的
    的头像 发表于 01-22 17:18 1108次阅读

    基于51单片机电机功率测量设计

    电子发烧友网站提供《基于51单片机电机功率测量设计.rar》资料免费下载
    发表于 01-12 10:11 0次下载

    基于51单片机电机控制设计

    电子发烧友网站提供《基于51单片机电机控制设计.rar》资料免费下载
    发表于 01-12 09:31 12次下载

    基于51单片机电机功率测量设计

    电子发烧友网站提供《基于51单片机电机功率测量设计.rar》资料免费下载
    发表于 01-07 09:29 3次下载

    基于51单片机电机控制设计

    电子发烧友网站提供《基于51单片机电机控制设计.rar》资料免费下载
    发表于 01-03 11:19 4次下载

    单片机解析g代码的方法

    单片机是一种完整的计算机系统,它集成了处理器、存储器、输入输出接口等基本的计算机组成部分。单片机应用广泛,可以用于控制各种电子设备。在单片机中,G
    的头像 发表于 12-22 14:15 1660次阅读

    步进电机控制方法及需要哪些控制信号

    步进电机是一种将电子信号转化为机械运动的电动机,广泛应用于机器人、打印机、数码相机等领域。步进电机由于其精度高、固有扭矩大、容易控制等特点,
    的头像 发表于 12-20 11:21 3236次阅读

    步进电机一体化控制系统的设计

    :本文应用单片机步进电机驱动芯片、字符型 LCD 和键盘阵列 构建了集步进电机控制器和驱动器为
    发表于 12-18 09:24 2次下载

    基于单片机步进电机控制系统设计

    该项目利用51单片机实现了一个步进电机控制系统,可以实现步进电机的正反转、加减速、启动和停止,并
    的头像 发表于 12-06 16:39 4517次阅读
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>步进</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b>系统设计