摘 要
电机是日常生活中必不可少的一部分,同时也是一种常用的机电元件。步进电机是一种特殊的电机,相较于其他类型的电机,步进电机的优点更加突出、应用优势更加明显,广泛应用于各个领域。
本设计是基于单片机开发的步进电机远程控制系统。首先,本设计对步进电机的国内外技术现状进行了简单阐述,并对步进电机相关内容进行了简单介绍。其次,根据系统设计需求,对步进电机控制系统的硬件部分与软件部分进行了设计,经过程序调试仿真和实物调试之后,最终实现了使用红外遥控器远程控制步进电机的正转、反转、转动特定角度等运动情况。最后,对设计内容进行总结,并对单片机、步进电机的未来发展做简单展望。
本设计避免了市面上电机控制系统复杂且开发使用成本高的弊端,是一款简单的、控制效率高且开发应用成本低的电机控制系统。
关键词
单片机;步进电机;电机控制;控制系统;系统设计
目 录
第1章 绪论
1.1 研究背景及意义
1.2 国内外现状分析
1.3 研究内容
第2章 步进电机远程控制系统概述
2.1 步进电机简介
2.2 步进电机性能特点与优缺点
2.3 步进电机的分类
2.4 常见的步进电机
2.5 步进电机远程控制系统组成
2.6 单片机控制步进电机远程控制系统
第3章 电机控制系统的硬件系统设计
3.1 系统原理图
3.2 单片机最小系统
3.3 系统驱动电路设计
3.4 系统工作原理
第4章 电机控制系统的软件系统设计
4.1 电机转速与时间的关系
4.2 系统软件设计流程图
4.3 软件设计源程序分析
第5章 系统调试
5.1 程序调试仿真
5.2 硬件调试
第6章 总结
致谢
参考文献
附录
第1章 绪论
1.1 研究背景及意义
电机是日常生活中常用的元器件,社会的正常运行无时无刻都需要电机的协助来完成。步进电机是电机中的一种,该类型电机是一种具有控制功能的执行元件,主要使用该元件实现对不同仪器与设备的精确控制。在实际的运行过程中,步进电机能够将脉冲信号转换为驱动力,驱动步进电机进行相应的操作,例如转动与停止等。目前为止,单片机是最常用的用来对步进电机进行控制与设计的芯片结构。随着计算机技术水平对不断提升,越来越多的单片机类型出现在人们的视野中,将性能优良的单片机应用进来后,能够从根本上提升步进电机控制系统的整体性能。
在互联网技术发展迅速的今天,传统采用分立元件的电机控制系统具有工作稳定性低、元器件消耗大以及开发成本高等缺点,为解决这些问题,有必要将单片机等先进的芯片应用进来,对步进电机等进行精准控制。
在各类科学技术的推动作用下,单片机与步进电机的研发水平得到了很明显的提升。将结构简单、性能良好的单片机作为电机控制的核心,能够实现从根本上提升控制系统的整体性能。加大对单片机电机控制系统的研究与设计,不仅能够推动相关技术理论体系的进一步完善,还能从根本上提升自身的实践能力,为后人电机控制研究工作的顺利进行建立良好的基础。
综上所述,本文主要以STC89C52型号单片机为基础,对基于单片机的步进电机远程控制系统进行设计与实现。
1.2 国内外现状分析
1.2.1 国内技术现状
我国对单片机以及步进电机的研究起步比较晚,原因是改革开放之前,我国的经济发展水平一直处于比较落后的情况,国家并没有太多的经费对相关技术进行研究。因此,对于单片机以及电机控制的研究,我国不具备丰富的实践经验。
改革开放以后,我国的经济实力在短期内得到了比较明显的提升。在此背景下,我国加强了对单片机以及电机控制等方面的技术研究,这使得我国的单片机以及电机控制技术水平在短期内得到了很明显的提高。如今,我国主要将单片机以及步进电机等应用到化工领域以及其他领域中,并取得了良好的成效。
改革开放初期,我国主要研究步进电机的细分驱动技术。随着科学研发的不断投入,如今我国已经实现了对基于单片机斩波恒流驱动、基于单片机的直流电压驱动等常见驱动方式的设计。除此之外,在众多科研人员努力下,我国已经能够使用汇编语言进行软件开发,通过这种方式实现了电机控制精确度的进一步提升。
1.2.2 国外技术现状
关于单片机以及电机控制的研究,国外具有比较丰富的实践经验,根本原因是国外对这些领域的研究起步比较早,且在资金充足的情况下,国外科研人员更能够安心的开展科研工作。就目前来看,美国、日本等发达国家的研究方向主要为步进电机控制与驱动方向。国外研究人员表示,缩小驱动器的体积,能够有效提升步进电机控制系统的控制精确性。对于美国等发达国家而言,比较典型的芯片有两类,一类主要用来实现电机加速与减速功能以及正反转功能,另外一种主要用来减少电机失步与过冲现象的发生,例如日本近几年研发出了一种名为ppmclOlb的芯片,经实践证明该芯片具有降低电机失步率以及过冲率的功能。
1.3 研究内容
本设计的主要内容如下:
(1)对步进电机现状进行总结
对步进电机进行介绍,分析其具有的优缺点,并对步进电机进行分类介绍,确保在充分了解步进电机的基础上对步进电机远程控制系统进行设计与实现。介绍步进电机远程控制系统的组成、单片机控制步进电机远程控制系统以及驱动系统的组成,并对单片机及其系统开发工具进行深入了解,为系统的设计与实现建立基础。
(2)电机控制系统的硬件系统设计
对步进电机控远程控制系统的硬件部分进行设计,主要包括对单片机最小系统以及系统驱动电路设计,完成电机控制系统的硬件系统设计。
(3)电机控制系统的软件系统设计
对步进电机远程控制系统的软件部分进行设计,首先分析系统软件设计需求,完成对控制系统软件设计流程的设计。其次根据系统软件设计需求,编写系统软件源程序,并对软件源程序进行进一步的分析。最后对软件程序进行调试仿真,完成对步进电机远程控制系统的最终设计与实现。
第2章 步进电机远程控制系统概述
2.1 步进电机简介
学术界将步进电机定义为一种数字转换器与角度转换器,同时也是一个具有串行特点的数/模转换器。步进电机的作用意义巨大,常被用作过程控制以及电器仪表中的起系统控制作用的主要控制元件。步进电机具有错齿结构,是步进电机能够进行旋转的主要原因。将步进电机应用进来,能够实现系统的精确控制与定位,因此步进电机主要被广泛应用于精确定位系统中。
2.2 步进电机性能特点与优缺点
2.2.1 性能特点
步进电机的主要性能特点为:(1)步进电机对工作环境温度的要求较高,温度达不到要求将无法保证磁性材料能够达到退磁点。为保证步进电机的稳定运行,一般需要将步进电机置于较高温度的环境中。(2)在高速的情况下,步进电机启动难,启动概率较小(3)步进电机的控制精度较高,为其步进角的3%到5%之间且不存在累积误差。(4)转速持续的升高,步进电机的力矩急速下降。
2.2.2 优缺点
步进电机的优点为:步进电机的控制比较简单方便,有明显的数字特征,通过数字信号的方式就可以实现对电机的开环控制。步进电机本身的部件比较少,可靠性很高,而且使用寿命与轴承寿命一脉相承。步进电机能在很大的范围内选择步距角,在小步距的情况下仍然可以以高转矩的方式运行。步进电机的结构非常简单,使用与开发的成本较低,是一种经济型电机。
步进电机的缺点为:如果出现控制不当,容易产生共振现象,给系统带来一定的影响。步进电机的体积、重量优势不明显,且能源利用效率相对较低。在超过负载的情况下,步进电机的同步控制情况会受到影响,不能使用普通的交流电源对步进电机进行驱动。
2.3 步进电机的分类
步进电机的类型多种多样,从不同的角度出发可将步进电机分类称为很多种类型。广义上可以将步进电机分为电磁式步进电机、机械式步进电机、组合式步进电机。根据电机结构特点进行区分,又可以将步进电机分为永磁式步进电机、混合式步进电机、反应式步进电机。
2.4 常见的步进电机
2.4.1 反应式步进电机
如下图2.1所示为反应式电机内部结构示意图:
图2.1 反应式电机内部结构示意图
反应式步进电机是一种常用类型的步进电机,该类型电机的工作原理是通过磁通使路径磁阻最小所产生的磁阻转矩,迫使电机转动,从而实现对电机的远程控制。
2.4.2 四相步进电机
四相步进电机是一种常用类型的步进电机,该类型步进电机的结构和普通电机类似,都包含了定子、转子以及定子绕组等结构。区别在于四相步进电机的定子绕组被划分成了四个部分,这也是该类型电机名称的来源。按照A-B-C-D的方向对电机进行通电,四相步进电机就会出现正转的情况,反之四相步进电机则出现反转的情况。四相步进电机的内部结构示意图如下图2.2所示:
图2.2 四相步进电机内部结构示意图
2.5 步进电机远程控制系统组成
一般情况下,步进电机远程控制系统主要由运动控制部件、驱动部件以及运动执行部件组成,步进电机远程控制系统的组成如下图2.3所示:
图2.3 步进电机远程控制系统组成
步进电机为一个常用的控制元件,而步进电机控制系统就是一个完整的有机整体。其中,操作系统与运动控制系统是步进电机控制系统的主要组成部分。操作系统的作用是将操作者执行的操作转换为电信号,电信号作用到运动控制系统上后,运动系统随之作出相应的反应。运动控制的重点在于对物体位置以及速度的控制,控制部分、驱动部分以及执行部分是运动控制系统的主要组成部分。
2.6 单片机控制步进电机远程控制系统
单片机常被用到对步进电机远程控制系统的设计中,基于单片机的步进电机远程控制系统主要包含单片机系统、驱动电路、步进电机与外围电路。单片机控制的步进电机远程控制系统如下图3.2所示:
图3.2 单片机控制的步进电机远程控制系统
电机控制系统的硬件结构组成很复杂,需要耗费较高的成本进行设计。将单片机应用进来后,可实现对驱动电机的软件形式控制,且还可以通过编程的方法对步进电机的转速、转动角度以及转动次数等进行精确控制。与此同时,将单片机应用进来后,还能实现对步进电机运行状态的准确控制,因此可满足不同用户的不同使用需求。而且单片机的应用使步进电机远程控制系统的电路变得更加简单,降低了系统设计的成本。
第3章 电机控制系统的硬件系统设计
根据步进电机远程控制系统的设计要求,进行步进电机远程控制系统框图的设计,如下图3.1所示:
图3.1 步进电机远程控制系统框图
步进电机远程控制系统框图的设计完成后,本章将依次对系统的结构与功能、单片机最小系统、系统驱动电路设计、系统的工作原理进行阐述。
3.1 系统原理图
步进电机主要被应用于自动化工控制系统中,在单片机的作用下,步进电机的运转会得到有效控制。将单片机最小系统与少量外围器应用进来,即可组成一个工作稳定性高、整体性能可靠的步进电机控制器。系统总体设计电路图如下图3.2所示。将控制器应用进来后,就可以实现对步进电机正转、反转与停止等运动情况的精确控制。
对步进电机控制器电路通电后,即可实现电机电路复位,或者通过开关按钮,也能实现电路复位。与此同时,通过操作亲触按键以及独立按键,能够实现步进电机的正转、反转以及停机等功能。另外,通过设计单片机软件程序的方式,能够实现对步进电机步距角的改变。对电机设置延时时间常数后,根据延时常数的不同可控制电机的转速。一般而言,延时时间常数越小,电机转速越快,反之越慢。
图3.2 步进电机控制器整体电路图
3.2 单片机最小系统
图3.3 单片机最小系统电路
将STC89C52单片机最小系统与少量外围器进行组合,可对基于单片机的步进电机远程控制系统完成设计与实现。系统中,单片机主要发挥控制作用,因此单片机是控制系统的核心部分。将能够使单片机运行起来的相关最小硬件进行连接,即可形成实现对单片机最小系统电路图的设计。本文设计的单片机最小系统主要由时钟晶振电路、复位电路以及单片机组成,单片机最小系统电路如下图3.3所示:
单片机最小系统中,产生时钟信号的电路为时钟晶振电路,晶振频率为12MHz,该类型单片机主要有两个外接晶振引脚,名为XTAL1与XTAL2。单片机的时钟晶振电路如下图3.4所示:
图3.4 单片机时钟晶振电路
图3.5 单片机复位电路
除此之外,复位电路是单片机电路中的重要组成部分,主要实现单片机的初始化操作功能。通过在复位电路引脚上连续保持两个周期以上的高电平的方式,即可实现单片机的复位。单片机复位电路如下图3.5所示:
将单片机芯片、复位电路与晶振电路进行连接,即可完成对单片机最系统电路板的制作与实现。
3.3 系统驱动电路设计
步进电机驱动控制系统一般由五个部分组成,分别为脉冲信号部分、信号分配部分、功率放大部分、步进电机部分和负载部分。如下图3.6所示为驱动控制系统的组成情况:
图3.6 ULN2003型芯片与步进电机的连接示意图
电机控制系统中,单片机主要负责产生脉冲信号。脉冲信号产生后,可通过软件编程法以及使用专门的脉冲分配器实现对脉冲信号的分配与控制。增加功率放大电路后,即可将单片机与步进电机进行直接连接。
一般情况下,单片机直接输出的脉冲信号比较小,较小的脉冲信号无法驱动电机的正常工作。因此在实际的控制系统设计过程中,不能将单片机直接输出的信号与步进电机进行直接相连,需要在驱动电路的协助下,完成对步进电机的控制。本文主要使用ULN2003型高耐压、大电流达林顿系列系芯片对单片机进行驱动设计。ULN2003型芯片工作电压比较高且灌电流最高可达到0.5A,能够承受最高50V的电压。将ULN2003型芯片应用进来,能够实现单片机、步进电机之间的良好连接,形成步进电机驱动板。如图3.7驱动电路所示。
图3.7 驱动电路
3.4 系统工作原理
一般而言,控制电路中的步进电机均属于四相步进电机,为提升步进电机的带负载能力,保证步进电机远程控制系统的稳定与高效运行,本文将八拍驱动方式应用了进来,对电机控制系统进行了设计。
步进电机四相八拍通电方式的控制字可使用下表3.1进行表示:
表3.1 步进电机四相八拍通电方式的控制字
通电状态 | P1.3 | P1.2 | P1.1 | P1.0 | 控制字 |
A | 1 | 1 | 1 | 0 | E |
AB | 1 | 1 | 0 | 0 | C |
B | — | — | — | — | — |
BC | — | 1 | 1 | — | — |
C | — | — | — | — | — |
CD | 1 | 1 | — | — | — |
D | — | — | — | — | — |
DA | 1 | — | — | 1 | — |
四相八拍方式步进电机的通电书序为:
首先,对A相线圈进行通电,之后进行通电转换,使A、B两相线圈同时通电。
其次,对B相线圈进行通电。
最后,对B、C两相线圈进行同时通电,其余步骤省略。通电方式与流程可描述为A-AB-B-BC-C-CD-D-DA。步进电机中的定子绕组按照一定的顺序进行通电后,电机转子就会按照设定的程序沿着一定的方向进行转动。
第4章 电机控制系统的软件系统设计
4.1 电机转速与时间的关系
根据步进电机远程控制系统的设计要求,得到如下图4.1所示的反应步进电机转速与时间之间关系的图:
图4.1 步进电机转速—时间的关系
驱动步进电机后,随着时间的变化,步进电机中转子的转速逐渐提高。转子转速达到最大值后,随机进行匀速运动。关掉电源后,步进电机停止,此时转子并不会立马停止,而是需要经过一段的时间,才能处于完全停止的状态。
4.2 系统软件设计流程图
图4.2 单片机控制步进电机的软件设计流程图
单片机控制步进电机的软件控制流程如图4.2所示,由此给出单片机控制步进电机进行变速运动的流程如图4.3所示。
图4.3 单片机控制步进电机的具体流程图
该流程图显示,接通电源后,通过设定的功能按键即可实现对控制电机的正转、反转、停止以及速度转换等控制。
4.3 软件设计源程序分析
单片机步进电机远程控制系统软件设计源程序展示于附录中。源程序对单片机的P2口设置了堆栈,最开始时步进电机处于停转的状态。此时源程序会对按键进行扫描,扫描的目的主要是为了判断是否有按键按下。如果存在按键按下的情况,按键往往需要在断开与闭合两个状态之间进行转换,且需要经过一定的时间后才能处于稳定闭合的状态,该过程称为按键抖动。与此同时,用户按下按键经过10ms的时间后,按键抖动情况就会消失。用户按下不同的按键后,相应的按键会跳动到不同的模块,此时系统会对转动程序进行调用,最终完成对步进电机运动状态的精准控制。对于单片机控制的步进电机远程控制系统软件程序,主要使用C语言进行编写。
第5章 系统调试
5.1 程序调试仿真
为保证系统软件编程效果,达到实现精准控制电机运动的目的,通常需要对设计完毕的软件程序进行调试与仿真。软件程序调试与仿真主要通过一系列仿真软件相互配合的方式来完成。将各种仿真软件应用进来后,能够实现对步进电机与运行状态的模拟,且还能对单片机的运行进行线上调试。本文使用proteus仿真软件,完成了对单片机控制的步进电机远程控制系统的仿真设计,仿真结果图如下图4.4所示:
图5.1 控制系统的仿真效果图
5.2 硬件调试
(1)硬件实物如图5.2所示:
图5.2 硬件实物
(2)使用USB插上电源的初始状态如图5.3所示。此时用万用表测得输入电源电压为5.1V,为单片机正常工作电压,可进行下一步操作。
图5.3 初始状态
(3)在红外遥控器上按下正转一圈的指令,步进电机按照设定的转速正向转动一圈,转动情况在屏幕上显示如图5.4所示:
图5.4 正转情况
(4)在红外遥控器上按下反转一圈的指令,步进电机按照设定的转速反向转动一圈,转动情况在屏幕上显示如图5.5所示:
图5.5 反转情况
(5)上述示例的两种转动情况实现了使用红外遥控远程控制步进电机基本的运动情况,实物调试基本完成。
第6章 总结
步进电机作为远程控制中最常用的控制元件,应用非常广泛,将步进电机应用进来,能够实现对不同仪器以及设备运动状态的精确控制。本设计将STC89C52单片机应用进来后,完成了对步进电机远程控制系统的设计与实现。将单片机应用进来后,本设计实现了对步进电机运动状态的精准控制,通过仿真调试,实现了步进电机反转、正转、速度转换以及停止等功能。本设计的电机控制系统具有一定的实用价值与参考价值,希望能够对相关人员的研究工作有帮助。
步进电机对化工行业以及制造行业的作用意义巨大,因此受到这些行业的极力喜欢。随着科学技术水平的不断提升,在众多技术的协助下,步进电机的应用范围将越来越广泛。步进电机的发展前景良好,未来步进电机以及单片机等的应用价值将越来越高。
全部代码
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^4;//1602数据/命令选择端(H:数据寄存器L:指令寄存器)
sbit RW = P2^5;//1602读/写选择端
sbit E = P2^6;//1602使能信号端
sbit key1=P3^0;//用户按键
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反转表格
uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正转表格
uchar table1[]="dir: + spe:005";
uchar table2[]="cir:000 ang:000";
uchar num;
uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq;
//1键值2键值标志3速度4正转标志5正转圈数6反转标志7反转圈数8正转角度9反转角度10选择
float zang,fang;
/******************************************************************/
/* 延时函数 Xms */
/******************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************************************/
/* LCD1602写命令操作 */
/******************************************************************/
void WriteCommand(uchar com)
{
delay(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
P0=com;
E=1;
delay(5);
E=0;
}
/******************************************************************/
/* LCD1602写数据操作 */
/******************************************************************/
void WriteData(uchar dat)
{
delay(5); //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
P0=dat;
E=1;
delay(5);
E=0;
}
/******************************************************************/
/* 1602初始化程序 */
/******************************************************************/
void InitLcd()//1602初始化程序
{
delay(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //当读或写一个字符后地址指针加一,且光标加一
WriteCommand(0x0c); //显示开及光标不显示
WriteCommand(0x01); //清屏
WriteCommand(0x80);
for(num=0;num<15;num++)//第一行的显示
{
WriteData(table1[num]);
delay(15);
}
WriteCommand(0x80+0x40);//第二行的显示
for(num=0;num<15;num++)
{
WriteData(table2[num]);
delay(15);
}
}
/******************************************************************/
/* 独立键盘扫描函数 */
/******************************************************************/
void keyscan()
{
P3=0xff;//拉高P3口,以读取P3口的值
if(key1==0)//键1被按下
{
delay(5);//延时消抖
if(key1==0)
{
flag=1;
}
while(!key1);
delay(5);//延时消抖
while(!key1);//松手检测
}
if(key2==0)
{
delay(5);
if(key2==0)
{
flag=2;
}
while(!key2);
delay(5);
while(!key2);
}
if(key3==0)//键1被按下
{
delay(5);//延时消抖
if(key3==0)
{
flag=3;
}
while(!key3);
delay(5);//延时消抖
while(!key3);//松手检测
}
if(key4==0)
{
delay(5);
if(key4==0)
{
flag=4;
}
while(!key4);
delay(5);
while(!key4);
}
if(key5==0)
{
delay(5);
if(key5==0)
{
flag=5;
}
while(!key5);
delay(5);
while(!key5);
}
}
/******************************************************************/
/* 1602显示3位数 */
/******************************************************************/
void write_sfm(uchar add,uint date)//1602显示
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
WriteCommand(0x80+add);//设置数据地址指针
WriteData(0x30+bai);
WriteData(0x30+shi);
WriteData(0x30+ge);
WriteData(0x20);
}
/******************************************************************/
/* 键值处理 */
/******************************************************************/
void handle_flag()
{
uchar select1;
if(TR0==0&&TR1==0)
{
if(flag==1) //正转
{
WriteCommand(0x80+0x05);
WriteData('+');
delay(20);
select=0;
}
if(flag==2) //反转
{
WriteCommand(0x80+0x05);
WriteData('-');
delay(20);
select=1;
}
if(flag==3)//转速加
{
speed++;
if(speed>=12)
speed=12;
write_sfm(0x0c,speed);//显示速度
delay(20);
}
if(flag==4) //转速减
{
speed--;
if(speed<=1)
speed=1;
write_sfm(0x0c,speed);//显示速度
delay(20);
}
}
if(flag==5)关闭中断,停止电机
{
select1++;
select1%=2;
if( select1==0)
{
TR0=0;
TR1=0;
if(select==0)//显示转动的角度
write_sfm(0x40+0x0c,zang);
else
write_sfm(0x40+0x0c,fang);
}
else
{if(select==0)
{
TR0=1;//开定时器0,产生正转相序
TR1=0;//关定时器1
}
else
{
TR1=1;//开定时器1,产生反转相序
TR0=0;//关定时器0
}
}
}
flag=0;
}
void main()
{
pp=0;
qq=0;
InitLcd();
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH0=(65536-(14648/speed))/256;
TL0=(65536-(14648/speed))%256;
TH1=(65536-(14648/speed))/256;
TL1=(65536-(14648/speed))%256;
TR0=0;
TR1=0;
while(1)
{
keyscan();
handle_flag();
}
}
void time0() interrupt 1
{
uint zz;
TH0=(65536-(14648/speed))/256; // 360/(5.625/64)=4096
//假设60秒转一圈,即60秒中断4096次,
//那么一次中断需要60000000/4096=14648个时钟
//60000000/(4096*speed) zflag=4096时一圈
TL0=(65536-(14648/speed))%256;
zz%=8;
P1=F_Rotation[zz]; //输出对应的相
zz++;
zflag++;
if(zflag==4096) //正转了一圈
{
zflag=0;
znum++;
write_sfm(0x40+0x04,znum);
}
if(zflag%64==0)//计算正转动的角度
{
pp++;
zang=(uint)(pp*5.625);
if(zang==360)
pp=0;
write_sfm(0x40+0x0c,zang);
}
//zang=0.088*zflag;
//write_sfm(0x40+0x0c,zang);
}
void time1() interrupt 3
{
uint ff;
TH1=(65536-(14648/speed))/256;
TL1=(65536-(14648/speed))%256;
ff%=8;
P1=B_Rotation[ff]; //输出对应的相
ff++;
fflag++;
if(fflag==4096) //反转了一圈
{
fflag=0;
fnum++;
write_sfm(0x40+0x04,fnum);
}
if(fflag%64==0)//计算反转动的角度
{
qq++;
fang=(uint)(qq*5.625);
if(fang==360)
qq=0;
write_sfm(0x40+0x0c,fang);
}
}