51单片机驱动步进电机的方法(详解)
基于MCGS的51系列单片机控制步进电机的设计
基于MCGS的51系列单片机控制步进电机的设计摘要:介绍了mcgs组态软件和80c51单片机的特点。
并以基于80c51单片机设计的步进电机控制系统为例,详细阐述了开发基于mcgs的80c51单片机驱动程序的方法和步骤,并简单介绍了80c51的程序设计,最后给出了测试情况。
在实际应用中取得了良好效果。
关键词:MCGS;单片机;步进电机1简介步进电机是实现电脉冲信号与角位移或线位移转换的开环控制电机原件。
在非超负荷的情况下,电机的转速只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。
当步进电机驱动器接收到一个脉冲信号时,它就驱动步进电机按设定的方向转过一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制输入脉冲的频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机是一种感应电机。
其工作原理是在将直流电转换为元件时,利用电子电路供电。
多相定时控制电流。
有了这个电流为步进电机供电,步进电机就可以正常工作。
司机正在开车为步进电机分时供电的,多相时序控制器。
2系统总体方案本设计将系统分为上位机和下位机,以达到预期的控制效果。
下位机部分是以89C51单片机为主控核心,步进电机驱动电路为外围的控制系统。
通过单片机编程实现电机的启停、正反转和调试。
上位机监控系统由MCGS组态软件开发。
用户可以通过可视会议控制步进电机。
该系统具有操作简单、使用方便的特点。
尽管MCGS本身提供了大量的设备驱动程序,但对于特殊设备仍然没有固定的程序模块。
因此,开发人员可以使用MCGS提供的可扩展接口规范和开发工具包来开发自己的设备驱动程序组件。
在上位机中实现MCGS 与MCU之间的通信。
(1)最小系统。
89C51单片机最小系统是单片机正常运行的最小配置:它由一系列模块组成。
它包括电源模块和复位模块。
复位模块:当引脚9出现2个机器周期以上高电平时,单片机复位,程序从头开始运行。
51单片机细分驱动步进电机
51单片机细分驱动步进步进电机一、引言步进电机是一种将电脉冲转化为角位移的执行机构。
步进电机与普通电机最大的不同就是步进电机能很好地控制电机的旋转角度。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。
您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机原理说明请参考/Article.asp?id=1699533。
大家看到配单片机学习开发板的大多是小巧的那种两相步进电机(六线、也称四相),而实际上应用最广泛的就是工业或专用设备的24V/2~4A的步进电机,这类电机则需要专门制作或购买带细分功能的步进驱动器来驱动,所以了解和学会使用这种驱动器是单片机应用的必修课。
不过无论电机大小,原理是一样的。
二、工业用步进电机典型介绍看到网上不少单片机初学者不知道如何用驱动器去驱动大的步进电机,其实并不难,笔者前不久从仓库中翻出一个BS(白山牌)的步进驱动器和步进电机一套,特用单片机控制实验示范给狼友,下面是步进电机和驱动器外观及参数图。
电机主要参数:步距角----- 1.8°(200步/1圈,即360° / 1.8° = 200)保持转矩----- 0.9N.m电压/电流----- 24V/3.0A相电阻----- 0.75Ω相电感----- 1.1mH转子惯量----- 300g.cm2步进驱动器主要参数:反应频率 ----- 200Kpps (最高)驱动电流 ----- 0.5~4A连续可调电压范围----- DC12~40V 特殊功能:双极恒流斩波方式;步进脉冲停止超过100ms 时,电机线圈自动减半。
设有12/8档等角度恒力矩细分,最高200细分。
细分数1248163264128 D0ON OFF ON OFF ON OFF ON OFF D1ON ON OFF OFF ON ON OFF OFF D2ON ON ON ON OFF OFF OFF OFF D3无效D4ON, 双脉冲:PU为正向步进脉冲信号,DR为反向步进脉冲信号OFF, 单脉冲:PU为步进脉冲信号,DR为方向控制信号D5自检测开关(OFF时接收外部脉冲,ON时驱动器内部发7.5KHz脉冲)二、用单片机驱动步进电机经过测试和电路了解,此驱动器内部各信号输入端具有光耦隔离电路,而且只需10MA左右即可驱动,因此单片机I/O直接接到驱动器即可。
51单片机控制四相步进电机电路图
51单片机控制四相步进电机接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。
这几天给自己的任务就是搞定步进电机的单片机控制。
以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。
今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示:拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
基于51单片机的步进电机控制
电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC- CD-DA-AB-。。。), 八拍(A-AB-B-BC-C-CD-D-DA-A。。。) 3、系统电路图
(1)接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容 0.1uF (2)接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用 12MHz), 还有辅助电容 20pF (3)接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析 复位工作原理 4、 接配置:EA(PIN31) (1)四个 8 位通用 I/O 端口,对应引脚 P0、P1、P2 和 P3; (2)两个 16 位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) (3)一个串行通信接口;(SCON,SBUF) (4)一个中断控制器;(IE,IP) 根据以上的方案比较与论证确定总体方案,确定硬件原理图。原理图如下:
1.3 步进电机的特点
1.精度高 一般的步进电机的精度为步进角的 3-5%,且不累积。可在宽 广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反 转控制及制动 等,这是步进电动机最突出的优点
2.过载性好——其转速不受负载大小的影响,不像普通电机,当负载加大 时就会出现速度下降的情况,所以步进电机使用在对速度和位置都有严格要求的 场合;
一、步进电机与驱动电路
1.1 什么是步进电机
步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱 动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度 (及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目 的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调 速的目的。
51单片机控制四相步进电机解析
51单片机控制四相步进电机2009年07月21日星期二 12:4451单片机控制四相步进电机2009-03-01 18:53接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。
这几天给自己的任务就是搞定步进电机的单片机控制。
以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。
今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示:详细内容:/31907887_d.html拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1 {TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
51单片机按键控制步进电机加减速及正反转
51单片机按键控制步进电机加减速及正反转之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。
所用硬件:步进电机及驱动器、STC89C52单片机、直流电源1、硬件连接图•注意:上图为共阳极接法,实际连接参考总体线路连接。
•驱动器信号端定义:PUL+:脉冲信号输入正。
( CP+ )PUL-:脉冲信号输入负。
( CP- )DIR+:电机正、反转控制正。
DIR-:电机正、反转控制负。
EN+:电机脱机控制正。
EN-:电机脱机控制负。
•电机绕组连接A+:连接电机绕组A+相。
A-:连接电机绕组A-相。
B+:连接电机绕组B+相。
B-:连接电机绕组B-相。
•电源连接VCC:电源正端“+”GND:电源负端“-”注意:DC直流范围:9-32V。
不可以超过此范围,否则会无法正常工作甚至损坏驱动器.•总体线路连接输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信号DIR+,DIR-③脱机信号EN+,EN-。
输入信号接口有两种接法,可根据需要采用共阳极接法或共阴极接法。
在这里我采用的是共阴极接法:分别将PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端);脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接入(不接也可,代码中未接,置空)。
按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。
注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路,以免损坏驱动器。
2、代码1.#include<reg51.h>2.#define MotorTabNum 53.unsigned char T0_NUM;4.sbit K1 = P3^5; // 启动5.sbit K2 = P3^4; // 反转6.sbit K3 = P3^3; // 加速7.sbit K4 = P3^2; // 减速8.sbit K5 = P3^1; //正反转9.10.sbit FX = P2^4; // 方向11.//sbit MotorEn = P2^5; // 使能12.sbit CLK = P2^6; // 脉冲13.14.inttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};15.16.unsigned char g_MotorSt = 0; //17.unsigned char g_MotorDir = 0; //18.unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};19.20.signed char g_MotorNum = 0;21.22.void delayms(xms);23.void mDelay(unsigned int DelayTime);24.void T0_Init();25.26.void KeyScan(void);27.28.29.30.void main(void)31.{32.T0_Init();33.// MotorEn = 0; //34.FX = 0;35.while(1)36.{37.KeyScan(); //38.}39.40.41.}42.43.void T0_Init()44.{45.TMOD = 0x01;46.TH0 = (65535-100)/256; // 1ms47.TL0 = (65535-100)%256;48.EA = 1;49.ET0 = 1;50.// TR0 = 1;51.52.}53.54.void T0_time() interrupt 155.{56.// TR0 = 0;57.TH0 = (65535-100)/256;58.TL0 = (65535-100)%256;59.T0_NUM++;60.if(T0_NUM >= MotorTab[g_MotorNum]) //61.{62.T0_NUM = 0;63.CLK=CLK^0x01; //64.}65.// TR0 = 1;66.}67.68.69.//--------------------------70.void KeyScan(void)71.{72.if(K1 == 0)73.{74.delayms(10);75.if(K1 == 0)76.{77.g_MotorSt = g_MotorSt ^ 0x01;78.// MotorEn ^= 1;79.TR0 = 1;80.FX ^= 0; //反转81.}82.}83.84.if(K2 == 0)85.{86.delayms(10); //正转87.if(K2 == 0)88.{89.g_MotorDir = g_MotorDir ^ 0x01;90.FX ^= 1; //加速91.}92.}93.94.if(K3 == 0) //95.{96.delayms(5); //加速97.if(K3 == 0)98.{99.g_MotorNum++;100.if(g_MotorNum > MotorTabNum) 101.g_MotorNum = MotorTabNum; 102.}103.}105.if(K4 == 0) //106.{107.delayms(5); // 减速108.if(K4 == 0)109.{110.g_MotorNum--;111.if(g_MotorNum < 0)112.g_MotorNum = 0;113.}114.}115.116.if(K5 == 0) //117.{118.delayms(10); // 正反转119.if(K5 == 0)120.{121.g_MotorSt = g_MotorSt ^ 0x01; 122.g_MotorDir = g_MotorDir ^ 0x01; 123.MotorEn ^= 1;124.TR0 = 1;125.while(1)126.{127.FX ^= 1; //128.delayms(90000);129.FX ^= 0; //130.delayms(90000);131.}132.}133.}135.136.void delayms(xms)//延时137.{138.unsigned int x,y;139.for(x=xms;x>0;x--)140.for(y=110;y>0;y--);141.}3、常见问题解答•控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
51单片机驱动步进电机的方法(详解)
1
CHD
v?c
31门
33
37
30
35
34
33
32
1
2
3
4
5
十
ICJ
ATfiSCSl
RST
PSEN
XI
XZ
EA
ALE
CADI) PdO
(AS)P20
(ADI,)PD 1
CA9)P2 1
CAD2)PD.a
CA10)P22
(AD3)PD.3
(AU)P2 3
(AI>4)PO 4
CA1Z)P3 4
CAD5)P0.5
51单片机驱动步进电机的方法
2019.02
这款步进电机的驱动电压12V,步进角为7.5度.一圈360度,需要48个脉冲完成!!!
I^H
该步进电机有
6根引线,排列次序如下:
1:红色、2:红色、
3:橙色、4:棕色、5:黄色、
6:黑色。
米用51驱动
ULN2003的方法进行驱动。
I
R1
I OK
C3 lOuF
P37而
9
X2
12M
X2
^_JOp_J 30p
GND
IC2
2£
3
37
3
2E
4
1D
11
30近
22
23
25
_5_6Zj
3
「
LB
IC
2B
2C
3B
3C
斗B
AC
5B
5C
6B
6C
7B
7C
GND
VCC
1
16
<
51单片机驱动步进电机28BYJ-48
转载51单⽚机驱动步进电机28BYJ-4851单⽚机驱动步进电机 28BYJ-48步进电机 28BYJ-48介绍和驱动及编程28BYJ-48步进电机:步进电机是⼀种将电脉冲转化为⾓位移的执⾏机构。
通俗⼀点讲:当步进驱动器接收到⼀个脉冲信号,它就驱动步进电机按设定的⽅向转动⼀个固定的⾓度(及步进⾓)。
您可以通过控制脉冲个来控制⾓位移量,从⽽达到准确定位的⽬的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从⽽达到调速的⽬的。
步进电机28BYJ48型四相⼋拍电机,电压为DC5V—DC12V 。
当对步进电机施加⼀系列连续不断的控制脉冲时,它可以连续不断地转动。
每⼀个脉冲信号对应步进电机的某⼀相或两相绕组的通电状态改变⼀次,也就对应转⼦转过⼀定的⾓度(⼀个步距⾓)。
当通电状态的改变完成⼀个循环时,转⼦转过⼀个齿距。
四相步进电机可以在不同的通电⽅式下运⾏,常见的通电⽅式有单(单相绕组通电)四拍(A-B-C-D-A 。
),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。
),⼋拍(A-AB-B-BC-C-CD-D-DA-A 。
)红线接电源5V ,橙⾊电线接P1.3⼝,黄⾊电线接P1.2⼝,粉⾊电线接P1.1⼝,蓝⾊接P1.0⼝。
由于单⽚机接⼝信号不够⼤需要通过ULN2003放⼤再连接到相应的电机接⼝,如下:橙黄 粉蓝⼗六制(P1⼝) 10 0 0 0x08 11 0 0 0x0c 01 0 0 0x04 01 1 0 0x06 00 1 0 0x02 00 1 1 0x03 00 0 1 0x01 10 0 1 0x09顺序刚好相反所以可以定义旋转相序uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表C 语⾔代码:#include<AT89X52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int uchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //逆时钟旋转相序表 uchar code CW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08}; //正时钟旋转相序表sbit K1=P3^2; //反转按键 sbit K2=P3^3; //正转按键 sbit K3=P3^4; //停⽌按键 sbit FMQ=P3^6; // 蜂鸣器void delaynms(uint aa){ uchar bb; while(aa--) { for(bb=0;bb<115;bb++) //1ms 基准延时程序 { ; } } }void delay500us(void){ int j; for(j=0;j<57;j++) { ; }}void beep(void){ uchart; for(t=0;t<100;t++) { delay500us(); FMQ=!FMQ; //产⽣脉冲 } FMQ=1; //关闭蜂鸣器}void motor_ccw(void){ uchar i,j; for(j=0;j<8;j++) //电机旋转⼀周,不是外⾯所看到的⼀周,是⾥⾯的传动轮转了⼀周 { if(K3==0) { break; //如果K3按下,退出此循环 } for(i=0;i<8;i++) //旋转45度 { P1=CCW[i]; delaynms(10); //调节转速 } }}void motor_cw(void){ uchar i,j; for(j=0;j<8;j++) { if(K3==0) { break; //如果K3按下,退出此循环 } for(i=0;i<8;i++) //旋转45度 { P1=CW[i]; delaynms(2); //调节转速 } }}void main(void){ uchar r; uchar N=64; //因为步进电机是减速步进电机,减速⽐的1/64 , //所以N=64时,步进电机主轴转⼀圈 while(1) { if(K1==0) { beep(); for(r=0;r<N;r++) { motor_ccw(); //电机逆转 if(K3==0) { beep(); break; } } } elseif(K2==0) { beep(); for(r=0;r<N;r++) { motor_cw(); //电机反转 if(K3==0) { beep(); break; } } } else P1=0xf0; //电机停⽌ }}附:步进电机⼩知识(转)1.什么是步进电机?步进电机是⼀种将电脉冲转化为⾓位移的执⾏机构。
51单片机项目教程项目 21 步进电机控制
21.2.2 步进电机转动原理及内 部结构
减速步进电机28BYJ-48的原理如下图:
中间部分是转子,由一个永磁体组成,边上的是定子绕组。当定子 的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方 向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产 生一个扭力将定子扭转。 依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电 次序为A->B->C->D正转,反之则反转)。而改变磁场切换的时间间 隔,就可以控制步进电机的速度了,这就是步进电机的驱动原理。 不管是两相四相,四相五线,四相六线步进电机。内部构造都是 如此。至于究竟是四线,五线,还是六线。
21-2 步进电机内部结构(与转轴平行方向的断面图)
图 21-3
步进电机拆解图
21.2.3 ULN2003驱动板
由于步进电机的驱动电流较大,单片机不能直接驱动,一般都是使 用ULN2003达林顿阵列驱动。ULN2003内部有一个非门电路,包 含7个单元,单独每个单元驱动电流最大可达500mA,9脚可以悬 空。其与开发板及步进电机连接,原理图如下:
项目 21步进电机控制
项目目标 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步 进电机件。在非超载的情况下,电机的转速、停止的位置只取决 于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱 动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动 一个固定的角度,称为“步距角”,它的旋转是以固定的角度一 步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达 到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动 的速度和加速度,从而达到调1.2.1 步进电机简介 步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲: 当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方 向转动一个固定的角度(及步进角)。您可以通过控制脉冲个来控 制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲 频率来控制电机转动的速度和加速度,从而达到调速的目的。 图20-1为所用的步进电机及驱动 板,型号28BYJ-48
51单片机驱动步进电机电路及程序
相绕组通断,P1.1控制B相,P1.2
控制C相。
2021/8/5
13
以A相控制为例:
当 P1 . 0 输 出 为 1 , 发 光管不发光,因此光敏二极 管截止,使担负驱动任务的 达林顿管导通。A相绕组通电。
相反,当P1.0=0→发 光管发光→光敏管导通→达 林顿管截止→A相绕组不通 电。
2021/8/5
2021/8/511 NhomakorabeaSUB: SETB P3.0
SETB P3.0 ;保证输出高电平的时间>5μs
SETB P3.0
CLR P3.0
;变为低电平
MOV R7,30H
LOOP: NOP
;软件延时程序:
NOP
;基本延时(10μs×时间常数)
NOP
DJNZ R7,LOOP
RET
※时间常数事先可装入30H单元,改变30H单元的内容就可改
所以按照 A→AB→B→BC→C→CA→A
的顺序控制,电机将按顺时针方向旋转, 每步转动1.5°,即步距角=1.5°,
由于要经过6步才走完一个齿距 (6×1.5°=9°),所以叫三相六拍。
2021/8/5
7
如果要使步进电机反转,只要按
A→AC→C→CB→B→BA
顺序通电就行了。
结论:从上面两种运行方式可看出,错齿是促使步
进电机旋转的根本原因,当某相通电,相应的齿对
齐,迫使电机旋转一个步距角,未通电的各相的齿
出现了新的错位。改变通电的顺序和通电的相数,
可组合出其它的运行方式。
讨论:三项三拍和三项六拍运行方式,哪种定位
2021更/8/5精确?
8
三、步进电机有如下特点:
❖ 给步进脉冲电机就转,不给步进脉冲电机就不转; ❖ 步进脉冲频率高,步进电机转得快;步进脉冲频率
51单片机驱动步进电机__终极完整版
51单片机驱动步进电机__终极(完整版)在这里介绍一下用51单片机驱动步进电机的方法。
这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈360 度 , 需要 48 个脉冲完成!!!该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。
采用51驱动ULN2003的方法进行驱动。
ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。
;************************************************ ******************************;************************* 步进电机的驱动*************************************** ; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19;---------------------------------------------------------------------------------; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!!; 本步进电机步进角为 7.5度 . 一圈 360 度 , 需要48 个脉冲完成!!!;---------------------------------------------------------------------------------; A组线圈对应 P2.4; B组线圈对应 P2.5; C组线圈对应 P2.6; D组线圈对应 P2.7; 正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转 7.5 度);----------------------------------------------------------------------------------;----------------------------正转-------------------------- ORG 0000H LJMP MAIN ORG 0100HMAIN:MOV R3,#144 正转 3 圈共 144 脉冲 START: MOVR0,#00H START1: MOV P2,#00H MOV A,R0MOV DPTR,#TABLE MOVC A,@A+DPTRJZ START 对 A 的判断,当 A = 0 时则转到 START MOV P2,ALCALL DELAY INC R0DJNZ R3,START1MOV P2,#00H LCALL DELAY1;-----------------------------反转------------------------MOV R3,#144 反转一圈共 144 个脉冲 START2:MOV P2,#00H MOV R0,#05 START3: MOV A,R0MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START2 MOV P2,A CALL DELAY INC R0DJNZ R3,START3 MOV P2,#00HLCALL DELAY1 LJMP MAINDELAY: MOV R7,#40 步进电机的转速 M3: MOV R6,#248 DJNZ R6,$ DJNZ R7,M3RETDELAY1: MOV R4,#20 2S 延时子程序 DEL2: MOV R3,#200 DEL3: MOV R2,#250 DJNZ R2,$ DJNZ R3,DEL3 DJNZ R4,DEL2 RET TABLE:DB 30H,60H,0C0H,90H 正转表 DB 00 正转结束DB 30H,90H,0C0H,60H 反转表 DB 00 反转结束 END 51单片机控制四相步进电机拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为 360/(4×5)=18度。
51单片机驱动步进电机的方法
51单片机驱动步进电机的方法一、步进电机简介步进电机是一种将电脉冲转化为角位移的执行机构,广泛应用于各种自动化设备中。
其工作原理是,当一个脉冲信号输入时,电机转动一个步距角,从而实现电机的精确控制。
二、51单片机驱动步进电机的方法1、硬件连接需要将51单片机与步进电机连接起来。
通常,步进电机需要四个引脚,分别连接到单片机的四个GPIO引脚上。
同时,还需要连接一个驱动器来提高电机的驱动能力。
2、驱动程序编写接下来,需要编写驱动程序来控制步进电机的转动。
在51单片机中,可以使用定时器或延时函数来产生脉冲信号,然后通过GPIO引脚输出给电机。
同时,还需要设置电机的步距角和转向,以保证电机的精确控制。
3、示例程序以下是一个简单的示例程序,用于演示如何使用51单片机驱动步进电机:cinclude <reg52.h> //包含51单片机的头文件sbit motorPin1=P1^0; //定义连接到P1.0引脚的电机引脚sbit motorPin2=P1^1; //定义连接到P1.1引脚的电机引脚sbit motorPin3=P1^2; //定义连接到P1.2引脚的电机引脚sbit motorPin4=P1^3; //定义连接到P1.3引脚的电机引脚void delay(unsigned int time) //延时函数unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);void forward(unsigned int step) //正转函数motorPin1=0;motorPin2=0;motorPin3=0;motorPin4=0; //清零电机引脚delay(step); //延时一段时间motorPin1=1;motorPin3=1;motorPin2=0;motorPin4=0; //设置转向和步距角delay(step); //延时一段时间void backward(unsigned int step) //反转函数motorPin1=0;motorPin2=0;motorPin3=0;motorPin4=0; //清零电机引脚delay(step); //延时一段时间motorPin2=1;motorPin4=1;motorPin3=0;motorPin1=0; //设置转向和步距角delay(step); //延时一段时间void main() //主函数unsigned int step=1000; //设置步距角为1000微步forward(step); //正转一圈backward(step); //反转一圈while(1); //循环等待,保持电机转动状态在这个示例程序中,我们使用了四个GPIO引脚来控制步进电机的转动。
51单片机学习之3-步进电机
51单片机学习之3-步进电机
第八集讲解用移位和或运算实现流水灯的方法《51单片机复习笔记2》里面的代码。
讲解了用函数的方法实现流水灯。
第九集
一、ULN2003芯片。
用于增强单片机IO口的驱动能力。
ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。
ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。
可直接驱动继电器等负载。
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路
直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V-95V的电压,输出还可以在高负载电流并行运行。
ULN2003采用DIP16或SOP16塑料封装。
一、蜂鸣器
驱动蜂鸣器很简单,由于51单片机的IO口驱动能力还不足以驱动蜂鸣器,所以需要加一个三极管来做电子开关控制蜂鸣器。
(当然也可以用ULN2003)。
上面电路图中其实不接电阻也可以驱动蜂鸣器,当然R26的分支需要去掉。
FM接在单片机的P2I O口上并给低电平即可让蜂鸣器鸣响。
第十集
一、步进电机
步进电机和我们以前玩的四驱车里面的马达是不一样的。
里面的马达是连续。
51单片机步进电机程序教学内容
#include <REG52.H>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define CLK_WISE 0//顺时针方向转动#define INVERSE 1//逆时针方向转动bit direction=CLK_WISE;/***方向标志,取值为CLK_WISE 或INVERSE*/static uchar speedcount=0;//加速标志,越大转速越快,最大到7,然后回归到0,循环。
//程序中可以依据它来改变占空比uchar step[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};//8个步uchar th_0[8]={0x5D,0x85,0x9E,0xAE,0xBA,0xC2,0xC9,0xCF};//8个定时器值,高8位uchar tl_0[8]={0x3D,0xEE,0x58,0x9E,0x3E,0xF7,0xBF,0x2C};//8个定时器值,低8位int step_i=0;//当前处于哪一步/***定时器t0***/void time0(void) interrupt 1 using 1{P2=step[step_i];//输出电机控制信号if(direction==CLK_WISE) //顺时针转step_i++;elsestep_i--;//逆时针转if (step_i>7)//顺时针到最后一步,需要调整到第一步step_i=0;if (step_i<0)//顺时针到第一步,需要调整到最后一步step_i=7;TH0=th_0[speedcount];//根据当前速度设定定时器初值TL0=tl_0[speedcount];}/****改变转向标志*****/void int1_srv (void) interrupt 2 using 2{if(INT1==0){while(!INT1);direction=!direction;}}/*******加速********/void change(void) interrupt 0 using 0{if(INT0==0){while(!INT0);speedcount++;//记录加速次数if(speedcount>7)speedcount=0;//最大为7,然后从0开始循环。
51单片机控制四相步进电机
51单片机控制四相步进电机(上)我们研究组有一个纳米项目,现在要测量单根纳米线pn结,我们的方案是类似于原子力显微镜(AFM)一样,把电极探针放在一个微位移控制器上,粗逼近利用步进电机实现,细逼近利用压电陶瓷管实现。
虽然这样的控制器已经可以商品化了,但是我们想自己尝试做一个。
在网上看了些资料,感觉也不是很难,只要想做,花些时间应该可以实现。
先转一篇网上的文章,以后随时更新进展。
51单片机控制四相步进电机作者:易劲松QQ:371719025 Email:yijingsong@接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。
这几天给自己的任务就是搞定步进电机的单片机控制。
以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。
今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下图所示:拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:制作的实物图如下:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count; static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次 TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
51单片机驱动与控制步进电动机的设计
摘要步进电机在控制系统中具有广泛的应用。
它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器、或角位移发生器等。
有时从一些旧设备上拆下的步进电机(这种电机一般没有损坏)要改作它用,一般需自己设计驱动器。
本设计采用8051对感应子式步进电机步进电机进行控制,通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机;同时,用4X4的键盘来对电机的状态进行控制,并用数码管显示电机的转速,采用74LS164作为4位单个数码管的显示驱动,从单片机输入信号;利用单片机的语音功能播报电机的转速。
最后对所设计的步进电动机驱动器进行了性能测试分析,结果表明:该驱动器达到了系统设计前所提出的各项指标。
系统运行安全、可靠、稳定。
整个系统电路简单实用、性能优良、通用性强。
关键词:步进电机,单片机,数码管,只读存储器,I/O接口目录第1章前言……………………………………………第2章方案论证比较设计…………………………………………………2.1单片机概述…………………………………………………2.1.1 单片机——微控制器嵌入式应用的概念…………………………………………2.1.2 单片机的特点和应用…………………………………………………2.2步进电机概述…………………………………………………2.1.1感应子式步进电机工作原理………………………………………………2.2.2步进电机的应用·………………………………………2.3单片机控制步进电机的设计思路…………………………………………………第3章控制系统的硬件电路设计…………………………………………………3.1 MCS-513.1.1 8051单片机内部结构…………………………………………………3.1.2 8051单片机的CPU…………………………………………………3.1.3芯片的引脚排列和说明…………………………………………………3.2 步进电机的驱动电路设计…………………………………………………3.3数码管显示电路的设计…………………………………………………3.4 4×4键盘电路的设计…………………………………………………第4章控制系统的软件设计…………………………………………………4.1 控制脉冲的产生…………………………………………………4.2 语音报数………………………………………第5章结论…………………………………………………致谢…………………………………………………参考文献…………………………………………………第1章前言步进电机最早是在1920年由英国人所开发。
STC增强型51单片机利用PWM脉冲控制4个57步进电机的编程方法
IAP15W4K58S4单片机利用PWM脉冲控制4个步进电机的编程方法最近购入一块IAP15W4K58S4(图1)的STC单片机的最小系统,然后用它控制步进电机,步进电机驱动器为基于TB6600的MicroStep Driver(图2)驱动器。
为了能控制该驱动器,利用现有的单片机系统控制驱动器。
连接电路原理图如图3所示,图中Vcc=5V.图1 IAP15W4K58S4单片机最小系统图2 步进电机驱动器使IAP15W4K58S4单片机能够控制步进电机,首先需要产生PWM脉冲,本例子产生频率为1KHz,占空比为50%的脉冲,P2.1、P2.2、P2.3、P3.7口输出4路PWM脉冲。
生产PWM脉冲,单片机涉及到的寄存器(不考虑PWM中断)有P_SW2(端口配置寄存器)、PWMCFG(PWM配置寄存器,初始电平高低)、PWMCKS(PWM时钟选择寄存器)、由PWMCH(高7位)和PWMCL(低8位)组成的15位PWM计数器、由PWM n T1H、PWM n T1L和PWM n T2H、PWM n T2L组成的PWM脉冲翻转计数器(其中PWM n T1H、PWM n T1L组成第一次翻转15位计数器,其中PWM n T2H、PWM n T2L组成第二次翻转15位计数器,n取值范围为2、3、4、5、6、7)、PWM n CR(PWM n的控制寄存器,设置输出管脚选择和中断使能控制,n取值范围为2、3、4、5、6、7)和PWMCR(PWM控制寄存器,用于开启各个端口和PWM模块开关,该寄存器最后设置)。
由于生成PWM,需将I/O 口配置为准双向口或强推挽模式,所以还需配置P m M0和P m M1寄存器,m取值范围为0~3。
以上寄存器各个位配置可参考该单片机的数据手册,本项目的例程参考STC官方例程基础进行修改,如后文所述。
IAP15W4K58S4单片机的特殊功能寄存器区中要使用扩展的特殊功能寄存器需要配置P_SW2的bit7位,将其(bit7)置1。
51单片机驱动步进电机(双四拍和八拍)
51单片机驱动步进电机(双四拍和八拍)步进电机是一种将电脉冲转化为相应的线位移和角位移的电磁机械装置。
具有快速启动停止能力,在电机的负荷不超过他提供的转矩时,可以通过输入脉冲来控制他在一瞬间的停止和启动。
步进电机的步距角和转速只和输入脉冲的频率有关。
通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。
该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。
当定子的矢量磁场旋转一个角度。
转子也随着该磁场转一个角度。
每输入一个电脉冲,电动机转动一个角度前进一步。
它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。
改变绕组通电的顺序,电机就会反转。
所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。
每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。
当通电状态的改变完成一个循环时,转子转过一个齿距。
四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A),双(双相绕组通电)四拍(AB-BC-CD-DA-AB),八拍(A-AB-B-BC-C-CD-D-DA-A)。
以下代码为8 拍:sbit P00 = P0;sbit P01 = P0;sb it P02 = P0 ;sbit P03 = P0;//设置成推挽模式-将引脚强制拉高--void init_gpio(void){P0M1 = P0M1 &0X0;P0M2 = P0M2 0XFF;P0 = 0X0; }//--horizontal motor#define A P00#define B P01#define C P02#define D P03#define h_Coil_A {A = 1;B = 0;C = 0;D = 0;}#define h_Coil_AB {A = 1;B = 1;C = 0;D = 0;}#define h_Coil_B {A = 0;B = 1;C = 0;D = 0;}#define。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机驱动步进电机的方法2019.02这款步进电机的驱动电压12V,步进角为7.5度. 一圈360 度, 需要48 个脉冲完成该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。
采用51驱动ULN2003的方法进行驱动。
ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。
;****************************************************************************** ;*************************步进电机的驱动*************************************** ; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19;---------------------------------------------------------------------------------; 步进电机的驱动信号必须为脉冲信号转动的速度和脉冲的频率成正比; 本步进电机步进角为7.5度. 一圈360 度, 需要48 个脉冲完成;---------------------------------------------------------------------------------; A组线圈对应P2.4; B组线圈对应P2.5; C组线圈对应P2.6; D组线圈对应P2.7; 正转次序: AB组--BC组--CD组--DA组(即一个脉冲,正转7.5 度);----------------------------------------------------------------------------------;----------------------------正转--------------------------ORG 0000HLJMP MAINORG 0100HMAIN:MOV R3,#144 正转3 圈共144 脉冲START:MOV R0,#00HSTART1:MOV P2,#00HMOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START 对A 的判断,当A = 0 时则转到STARTMOV P2,ALCALL DELAYINC R0DJNZ R3,START1MOV P2,#00HLCALL DELAY1;-----------------------------反转------------------------MOV R3,#144 反转一圈共144 个脉冲START2:MOV P2,#00HMOV R0,#05START3:MOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START2MOV P2,ACALL DELAYINC R0DJNZ R3,START3MOV P2,#00HLCALL DELAY1LJMP MAINDELAY: MOV R7,#40 步进电机的转速M3: MOV R6,#248DJNZ R6,$DJNZ R7,M3RETDELAY1: MOV R4,#20 2S 延时子程序DEL2: MOV R3,#200DEL3: MOV R2,#250DJNZ R2,$DJNZ R3,DEL3DJNZ R4,DEL2RETTABLE:DB 30H,60H,0C0H,90H 正转表DB 00 正转结束DB 30H,90H,0C0H,60H 反转表DB 00 反转结束END51单片机控制四相步进电机拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。
通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四线脉冲电流的顺序,则可实现对转向的控制。
所以,设计了如下电路图:C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
所以,我将程序代码改进了一下,如下:代码二#include <AT89X51.h>static unsigned int count;static int step_index;void delay(unsigned int endcount);void gorun(bit turn, unsigned int speedlevel);void main(void){count = 0;step_index = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数do{gorun(1,60);}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;}void delay(unsigned int endcount){count=0;}void gorun(bit turn,unsigned int speedlevel){switch(step_index){case 0:P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 0;break;case 1:P1_0 = 1;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 2:P1_0 = 0;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 3:P1_0 = 0;P1_1 = 1;P1_2 = 1;P1_3 = 0;break;case 4:P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 0;break;case 5:P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 1;break;case 6:P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 1;break;case 7:P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 1;}delay(speedlevel);if (turn==0){step_index++;if (step_index>7)step_index=0;}else{step_index--;if (step_index<0)step_index=7;}}改进的代码能实现速度和方向的控制,而且,通过step_index静态全局变量能“记住”步进电机的步进位置,下次调用gorun()函数时则可直接从上次步进位置继续转动,从而实现精确步进;另外,由于利用了步进电机内线圈之间的“中间状态”,步进角度减小了一半,只为9度,低速运转也相对稳定一些了。
但是,在代码二中,步进电机的运转控制是在主函数中,如果程序还需执行其它任务,则有可能使步进电机的运转收到影响,另外还有其它方面的不便,总之不是很完美的控制。
所以我又将代码再次改进:代码三#include <AT89X51.h>static unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数void main(void){count = 0;step_index = 0;spcount = 0;stop_flag = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数turn = 0;speedlevel = 2;delay(10000);speedlevel = 1;do{speedlevel = 2;delay(10000);speedlevel = 1;delay(10000);stop_flag=1;delay(10000);stop_flag=0;}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount) {count=0;do{}while(count<endcount); }void gorun(){ if (stop_flag==1){P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;return;}switch(step_index){case 0: //0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 0;break;case 1: //0、1P1_0 = 1;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 2: //1P1_0 = 0;P1_1 = 1;P1_2 = 0;P1_3 = 0;break;case 3: //1、2P1_0 = 0;P1_1 = 1;P1_2 = 1;P1_3 = 0;break;case 4: //2P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 0;break;case 5: //2、3P1_0 = 0;P1_1 = 0;P1_2 = 1;P1_3 = 1;break;case 6: //3P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 1;break;case 7: //3、0P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 1;}if (turn==0){step_index++;if (step_index>7)step_index=0;}else{step_index--;if (step_index<0)step_index=7;}}在代码三中,我将步进电机的运转控制放在时间中断函数之中,这样主函数就能很方便的加入其它任务的执行,而对步进电机的运转不产生影响。