步进电机论文概况 - 图文

更新时间:2024-05-13 20:21:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

冯朋昌

物理与信息技术学院 学号:110542037

指导教师:李天超

摘 要:本设计是利用STC12C5A40S2单片机控制步进电机启动、加减速、正反转、单步连续切换等功能,介绍了步进电机的工作原理特点及发展历程,给出了利用STC单片机和LV8731步进电机驱动控制步进电机的设计方案,给出其功能原理图及电路原理图;详细介绍了各个设计单元的工作原理,采用C语言进行编程。此系统采用反射式红外光电管传感器做按键,操作简单、稳定、抗干扰能力强。本系统的设计可有效解决步进电机在工控方面的应用。

关键字:步进电机;STC12C5A40S2 ;LV8731驱动器;反射式红外光电管

1

1 引言

步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。它是用电脉冲信号进行控制,将电脉冲信号转换成相应的角位移或线位移的微电动机,它最突出的优点是可以在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,并且用其组成的开环系统既简单、廉价,又非常可行,因此在打印机等办公自动化设备以及各种控制装置等众多领域有着极其广泛的应用。随着微电子和计算机技术的发展,步进电动机的需求量与日俱增,研制步进电机驱动器及其控制系统具有十分重要的意义。 2 方案论证

本设计采用两相双极式步进电机,两相双极式步进电机体积小,价格便宜。使用、控制步进电机必须由环形脉冲,功率放大等组成的控制系统,LV8731驱动集脉冲分配和功率放大于一身,LV8731是2ch H桥式驱动带负载能力强,操作简单。控制部分用STC12C5A40S2单片机,STC12C5A40S2单片机功能强大,抗干扰能力强,经济可靠。 3 硬件电路设计 3.1 步进电机概述

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

正常情况下,步进电机转过的总角度和输入的脉冲数成正比;连续输入一

2

定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。由于步进电动机能直接接收数字量的输入,所以特别适合于微机控制。

本次毕业设计采用的是步距角为1.8度的两相双极式步进电机。

3.2 步进电机驱动系统简介

步进电机不能直接接到交直流电源上工作,而必须使用专用设备——步进电机驱动器.步进电机驱动系统的性能,除与电机本身的性能有关外,也在很大程度上取决于驱动器的优劣。典型的步进电机驱动系统是由步进电机控制器、步进电机驱动器和步进电机本体三部分组成。步进电机控制器发出步进脉冲和方向信号,每发一个脉冲,步进电机驱动器驱动步进电机转子旋转一个步距角,即步进一步。步进电机转速的高低、升速或降速、启动或停止都完全取决于脉冲的有无或频率的高低。控制器的方向信号决定步进电机的顺时针或逆时针旋转。通常,步进电机驱动器由逻辑控制电路、功率驱动电路、保护电路和电源组成。步进电机驱动器一旦接收到来自控制器的方向信号和步进脉冲,控制电路就按预先设定的电机通电方式产生步进电机各相励磁绕组导通或截止信号。控制电路输出的信号功率很低,不能提供步进电机所需的输出功率,必须进行功率放大,这就是步进电机驱动器的功率驱动部分。功率驱动电路向步进电机控制绕组输入电流,使其励磁形成空间旋转磁场,驱动转子运动。保护电路在出现短路、过载、过热等故障时迅速停止驱动器和电机的运行。

3

3.2.1 本设计步进电机驱动的选择

本设计采用日本三洋公司2010年最新推出的两相步进电机驱动器芯片,电压8-32v,电流2.5a,用于驱动57及以下的步进电机,细分1-16可调,此芯片为最新工艺,超低的0.45欧导通电阻,体积更小,发热更低,加入了跨时代的短路保护功能,并且芯片本身带有5v电源输出。

3.2.2 基本功能说明

3.2.2.1 CHIP有效功能

通过设定ST段子,切换IC的待机/工作。待机状态下,IC进入省电模式、所有逻辑reset.待机状态下内部稳压器电路、电荷泵也不工作。如3-1所示。

图3-1 ST功能框图

3.2.2.2

驱动模式切换端子

通过设定DM段子,切换IC的驱动模式。STM模式下,能控制CLK-IN输入的1ch步进电机。DCM模式下,能控制2ch DC电机或者并联输入的1ch步进电机。控制并联输入的步进电机是2相或者1-2相全扭矩。如3-2所示。

4

图3-2 DM功能框图

3.2.2.3

STEP段子功能

STEP段子是,LV8731的逻辑输入端子,控制输入脉冲。其工作模式

如3-3所示。

图3-3 STEP段子功能框图

3.2.2.4

励磁模式设定功能

MD1、DM2段子为LV8731逻辑功能输入端子,控制步进电机的励磁

方式。其功能如3-4所示。

图3-4 励磁方式框图

3.2.2.5

步进模式下,双相励磁的时序图

LV8731驱动的两相双极式步进电机,两相励磁模式下,是四个脉冲

一个齿距角。如3-5所示。

5

图3-5 系统整图

3.3 单片机原理

3.3.1 STC12C5A40S2简介

STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

4 系统各部分功能分析

4.1 系统的控制部分STC12C5A40S2如4-1 所示。

6

图4-1 系统整图

4.2 电源部分

利用L7812ACD2T-TR和L7805ACD2T-TR芯片两次稳压得到+5V的电压,它们的应用要注意以下几点:(1)输入输出压差不能太大,太大则转换效率急速降低,而且容易击穿损坏;(2)输出电流不能太大,1.5A 是其极限值。大电流的输出,散热片的尺寸要足够大,否则会导致高温保护或热击穿;(3)输入输出压差也不能太小,大小效率很差。 外部提供直流电压供步进电机并且要大于12V(3-5)V,5V电压则给单片机供电。在调试程序的时候有P2口提供+5V电压给单片机,程序调试成功以后将CB1焊接,如图4-2所示。

7

图4-2 电路部分

4.3 按键部分

本次设计选用的是RPR220一体化反射式光电传感器。其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。塑料透镜可以提高灵敏度,内置的可见光过滤器可以减小离散光的影响,体积小。利用单片机引脚P1.2、P1.3(anjiankognzhi1、anjiankongzhi2)来控制发射器通断;利用单片机引脚P3.3、P4.2、P3.2、P4.3(anjian1、anjian2、anjian3、anjian4)输入来检测是否有键操作,当有键操作是anjiankognzhi2和anjian1是同步的高低电平、anjiankongzhi2和anjian2、anjian3、anjian4同步高低电平如图4-3所示。

8

图4-3 按键部分电路

4.4 驱动部分

此电路是步进电机的驱动部分,我选用的是LV8731芯片来驱动的,LV8731的DM端子控制其两种驱动模式(STM/DC)本设计DM为低电平利用的是STM(步进模式)模式;STEP端子是STEP信号输入端子转速的快慢,加减速的控制端子;DM1、DM2端子控制步进电机的励磁模式,本设计(DM1=0、DM2=0)是用的是双相励磁模式;FR端子控制步进电机的正反转。单片机和LV8731驱动器之间有光耦隔离。如图4-4。

9

图4-4 驱动部分电路

4.5 状态指示和显示部分

状态指示用发光二极管(DS1、DS2、DS3、DS4)来分别表示电源指示、加速、减速、正反转切换。显示用四位一体共阴极数码管来显示分别用P0控制段码,用(P3.3、P4.2、P3.2、P4.3)来实现位选。如图4-5。

10

图4-5 状态指示部分电路

5 系统主程序

5.1 系统分为主程序、键查询部、步进脉冲产生部分(连续和单步)几部分组

成,其主程序框图如图5-1所示。

11

主程序主要功能是:初始化,判断是待机还是工作,如果是工作模式是连续还是单步。开开初始化、喂狗Power=0?Yes待机no开定时器T1、初始化bujn=0?no单步显示计算yes连续显示计算

图5-1 主程序流程图

5.2 按键查询程序

利用定时器T0进行扫描的动态显示,和按键查询;包括复合键的启动、停止、加速、减速、正反转、连续和单步。Anjian1、 anjian2同时

12

按下电机从待机到启动,从工作到待机;anjian1实现加速;anjian2实现减速;anjian3实现正反转切换并且有自锁功能,每次切换之后必须松开按键才能进行第二次切换;anjian4实现连续、单步切换,同样有自锁功能,在单步状态长按anjian4可切换到连续状态。本程序同时考虑了节能功能,在单步状态,等待一段时间不操作就让电机待机。如5-2所示。

13

开始Anjian1 1s消斗初始化、喂狗Aj1=anjiankongzhi?yesJishi2<1000?no(Jishu2=0;flag1=0)初始化yesJishi2++;jishi2>5时jishi11=100(蜂鸣响0.1s)no 置位标志位Jishi11>0?noSpeaker=0初始化Flag2=1?yesBujn=1?单步时待机时间设定可节能Power=1(开机) (flag1=flag2=0)初始化noPower=0(待机)yesJishi11--jishu2=0;flag1=1yesAj2=anjiankongzhiAnjian2 1.2s 消斗Yes yesJishi3++当jishi3>5时jishi11=100蜂鸣0.1s(Jishu3=0;flag2=0)初始化Jishi12>0?nono关T1;初始化STEP待机yesJishi12--noJishi3<1200?yesno置位标志位Power=1?jishu3=0和flag2=1yes高位为0时不显示noFlag1=1?noPower=0(待机)yes定时器T1动态扫描显示 在待机时同时按下anjian1、anjian2实现开机 Power=0?Power=1(开机) (flag1=flag2=0初始化)noPower=1?noYes

14

接上图nono接下面power=0?进口power=0?no下面Power=1Power=0?yesAj1=anjiankongzhi&&bujin=0?noJishi2=0;jishi5=500;jishi7=0;flag1=0加速时anjian1 消斗yesJishi250?yesJihi5-35noZhuansu<600?noZhuansu=600yesZhuansu++;led1=0(加速灯亮)anjian1消斗Jishi7<1000?yesJishi7++noJishi7=0和flag1=1工作时anian1、anjian2同时按下制动Flag2=1?noPower=1(工作)yesPower=0(待机)flag1=flag2=0和jishi11=500(蜂鸣0.5s)Aj2=anjiankongzhi&&bujin=0?noJishi3=0;jishi6=500;jishi8=0;flag2=0yesJishi350?yesJihi6-35noZhuansu>10?noZhuansu=10yesZhuansu--;led2=0(减速灯亮)Jishi8<1200?yesJishi8++noJishi8=0和flag2=1Flag1=1?noPower=1(工作)yesPower=0(待机)flag1=flag2=0和jishi11=500(蜂鸣0.5s)Aj3=anjiankongzhi&&flag4=1noyes接下图 15

Aj3=aniiankongzhi&&flag4=1?yesJishi1<500?Anjian3 消斗Bujin=0?noBujinshu<9999yesBujinshu++;初始化T1;jishu=8(四个脉冲走一步);jishi12=80Bujin=1(连续切换yes到单步);bujinshu=0;STEP=0yesJishi1++;jishi11=100(蜂鸣0.1s)noBujinshu=0noJishi1=0;flag4=0(自锁);FR=~FR(正反切换)长按anjian4时实现单步到连续切换Aj3!=anjiankongzhi?Jishi9<1500noanjian3松开后,自锁解除yesJishi9++Jishi1=0;flag4=1Jishi9=0FR=1?noLed3=0;led4=1(正传指示灯亮)noBujin=1?yesBujin=0;ST=0;TR1=1noyesLed3=1;led4=0(反转指示灯亮)Aj4=anjiankongzhi?yesFlag3=1?yesJishi4<100?noJihi4=0;flag3=0(自锁)noJishi4=0;flag3=1;jishi9=0;Power=0?yesLed1=led2=1(加减指示灯灭)noyesJishi4++Anjiankongzhi=~anjiankongzhi产生按键控制脉冲结束 图5-2 定时器T0程序流程图

16

5.3 定时器T1中断程序

定时器T1中断实现连续和但不是STEP脉冲的产生,脉冲的频率快慢决定速度的快慢。流程图如图4-5所示。

开始本程序步进电机是双相励磁,单步是四个脉冲走一齿距角Bujin=0?noJishu8>0?noTR1=0(关T1)yesyesST=1?STEP=~SPEP;初始化T1;Jishu--yesST=0(工作)noSTEP=~STEP(送脉冲);初始化T1结束

图5-3定时器T1流程图

17

6 系统的调试与检测

6.1 程序编译时的错误与解决方法

把编好的程序(包括正反转程序、停止程序、显示程序等)合理安排好结合到一起进行编译。由于编译只能检查是否存在语法错误,所以还要看是否存在逻辑错误。程序修改好以后,当显示编译0错误,0警告的时候,这说明已经没有语法错误了,是否有逻辑错误还要看接上电路板通过仿真以后,步进电机能否正常转动,显示是否正常。

6.2 硬件的调试

电路板焊接好之后,不要急于通电测试,要认真检查电路板有无短路、短路、虚焊、漏焊。板子检查完毕可通电测试,烧如程序调试。常见问题如下: 6.2.1 电源部分:电源部分是整个板子的心脏,通电后检测步进电机供电,和

单片机供电是否正常。

6.2.2 按键和显示部分:步进电机能否正常工作按键部分至关重要,按键部分

主要是焊接问题。

6.2.3 按键和显示一切正常但步进电机转,主要是步进电机的电源部分和焊接

问题。

6.3 软硬件通调

烧如程序板子通电后,结合示波器观察LV8731驱动去输出端OUT1、AOUTB、OUT2A、OUT2B输出波形情况,改变程序参数看波形改变,知道最好的效果。

18

6.4 结论与展望

本次课程设计能够实现步进电机的启停、正反转以及速度的调节和单步连续转换,通过本次毕业设计加强了我对软件编程和硬件设计的掌握,并且熟悉了LV8731、STC12C5A40S2等芯片。步进电机在控制系统中具有广泛的应用。它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器、或角位移发生器等,所以说步进电机有着广阔的市场和远大的发展前景。

19

7 参考文献

[2]李夙.异步电动机直接转矩控制[M].北京:机械工业出版社,1998. [3]王鸿钰.步进电机控制入门[M].上海:同济大学出版社,1990.

[4]袁任光,张伟武.电动机控制电路选用与258实例[M].北京:机械工业出版社,2005.

[5]王秀和.永磁电机[M].北京: 中国电力出版社,2007.

[6]房玉明,杭柏林.基于单片机的步进电机开环控制系统[J].电机与控制应用,2006,33(4):64-64.

[7]孙笑辉,韩曾晋.减少感应电动机直接转矩控制系统转矩脉动的方法[J].电气传动,2001,(1):8-11.

[8]冯江华,陈高华,黄松涛.异步电动机的直接转矩控制[J].电工技术学报,1999,(6):29-33.

[9]江一,朱凌,申仲涛.异步电动机直接转矩控制仿真研究[J].华北电力大学学报,2003,(1):10-13.

[10]韩利虎. 浅谈步进电机的基本原理[J]. 内蒙古石油化工, Inner Mongolia Petrochemical Industry, 2007,(11):109.

[11]张巍. 浅谈单片机控制步进电机[J]. 安防科技,2006,(3): 25. [12] 乔璐.,景林,韩英桃.一种实用的步进电动机驱动器设计[J].微特电机,2005,(10):29-31.

[13] 康晶.采用反馈控制的步进电机高低压驱动电路[J].电力电子技术,2003,37(1):61-62,65.

20

附录1

21

附录2

22

附录6

--步进电机:

------------------------------------------------------------------------------------------------ -- 工程名称: 基于STC12C5A60S2单片机的步进电机控制

-- 功能描述: 能实现步进电机的启动,制动,加减速,正反转切换,连续单--

步切换

-- 文件来源: 自主设计 -- 编译环境: KEILL

-- 硬件连接: 22脚 步进脉冲输出端

-- 21脚为步进电机正反转输出端 -- 20、19脚为步进电机励磁控制输出端 -- 6、8、9、39脚为按键检测输入端 -- 42、43脚为按键控制信号输出端 -- 23-26脚为数码管位控制输出端 -- 31-37脚为数码管段码控制输出端 -- 18脚为步进电机待机/工作控制输出端 -- 1、2、40、41脚为指示灯控制输出端

-- OUT1A、 OUT1B、 OUT2A、 OUT2B为步进电机 -- 输出端 -- 日期:2012、05、20

----------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------- --本设计采用双相励磁模式、2CH H 桥驱动

-----------------------------------------------------------------------------------------------------------------

#include #include #define FOSC 12000000L #define

T0MS

sfr AUXR=0x8E; sfr P4=0xc0; sfr P4SW=0xBB;

(65536-FOSC/1000+14) sfr P0M0=0x94;

sfr P0M1=0x93; sfr P1M0=0x92;

23

//1ms计时初始值

sfr P1M1=0x91; sfr P2M0=0x96; sfr P2M1=0x95;

sfr WDT=0xC1; //声明看门狗

sbit led1=P1^6; sbit led2=P1^5; sbit led3=P1^1; sbit led4=P1^0;

sbit speaker=P1^4; sbit ajkongzhi1=P1^3; sbit ajkongzhi2=P1^2;

sbit w1=P4^4; sbit w2=P2^7; sbit w3=P2^6; sbit w4=P2^5;

sbit aj1=P3^3; sbit aj2=P4^2; sbit aj3=P3^2; sbit aj4=P4^3;

sbit ST=P2^0;

//待机与工作切

sbit MD1=P2^1;

//励磁模式选择

sbit MD2=P2^2; sbit FR=P2^3;

//正反转选择 sbit STEP=P2^4;

//步进信号

bit power;//电源状态标志, bit ajkongzhi;//按键控制标志位

bit bujin;//单步进标志,为0时连续转动,为1时单步进

unsigned

char

shuzi[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; //常用数字所对应的数值(0-9) 0x00为数码管不亮 unsigned

char

qianwei,baiwei,shiwei,gewei,weizhi;

//显

示数位千、百、十、个、数码管位选 unsigned

char

flag1,flag2,flag3,flag4; //加按键按下标志,减按键按下标志, 单步进按键锁定标志,正反转切换按键锁定标志

unsigned

int

jishi1,jishi2,jishi3,jishi4,jishi5,jishi6,jishi7,jishi8,jishi9,jishi10,jishi11,jishi12; // jishi1-4为按键消抖计时,jishi5为加速按键加速计时,jishi6为减速按键减速计时,jishi7和jishi8为关机按键计时 //jishi9为切换至连续转动模式计时,jishi10为脉冲发生计时,jishi11为蜂鸣器鸣响计时,jishi12为单步进时电机待机计时,

unsigned int zhuansu,bujinshu,jishu;//转速,记录总的步进数,记录单步进时脉冲的翻转次数

void inti()

2

{

TMOD=0x11; //T0工作在WDT=0x38; //喂狗

w2=0; w3=0; w4=0;

模式1-16位计数器 ST=1; TL0=T0MS; TH0=T0MS>>8;

TR0=1;

ET0=1; EA=1; ET1=1; PT1=1;

P4SW=0x70; P0M0=0xff; P0M1=0x00; P1M0=0xff; P1M1=0x00; P2M0=0xff; P2M1=0x00;

AUXR=0X81; 输出 led1=0;

led2=0; led3=0; led4=0;

speaker=0; ajkongzhi1=0; ajkongzhi2=0;

w1=0;

//ALE禁止//

MD1=0; MD2=0; FR=0; STEP=0;

power=0; 待机状态 ajkongzhi=0;

bujin=0; 连续转动 qianwei=0; baiwei=0; shiwei=0; gewei=0; weizhi=1;

flag1=0; flag2=0; flag3=1; flag4=1; jishi1=0; jishi2=0;

jishi3=0; jishi4=0;

jishi5=500;

jishi6=500;

//上电时处于

//开机时默认为

3

jishi7=0; jishi8=0; jishi9=0; jishi10=0; jishi11=1000;

TR1=0;

bujin=0;

zhuansu=100; //默认

设定转速为100RPM jishi12=0;

zhuansu=100; bujinshu=0; jishu=0;

}

void main() {

inti(); //初始化

WDT=0x38; //喂狗

while(1) {

if(power==0) //待机模式 { led1=1; //led待机

led2=1;

led3=1; led4=1;

P0=0; //数码管待机

weizhi=1;

w1=w2=w3=w4=0; ST=1; //线圈待机 FR=0; // 默认正转 MD1=0; //2相励磁模式

MD2=0;

}

else if(power==1)

{

TR1=1;

jishi10=65536-(15000/zhuansu)*10; if(bujin==0)

{

qianwei=(zhuansu000)/1000; baiwei=(zhuansu00)/100; shiwei=(zhuansu0)/10; gewei=zhuansu;

}

else

{

qianwei=(bujinshu000)/1000;

baiwei=(bujinshu00)/100; shiwei=(bujinshu0)/10; gewei=bujinshu;

}

}

}

4

}

void timer0() interrupt 1 using 1 //定时器T0 1mS定时器 { TR0=0; TL0=T0MS; TH0=T0MS>>8; TR0=1;

WDT=0x38; //喂狗

if(jishi11>0)

//蜂鸣器鸣响控制 { jishi11--; speaker=1;

}

else speaker=0;

if(bujin==1)

//电机待机时间定时 {

if(jishi12>0)

jishi12--;

else { TR1=0; ST=1; STEP=0; }

}

if(power==1)

//数码管显示控制 {

if(qianwei==0) {

qianwei=10; if(baiwei==0) {

baiwei=10; if(shiwei==0)

shiwei=10;

} }

switch(weizhi)

数码管显示控制 { case 1:{

P0=shuzi[qianwei];

w1=1;w2=w3=w4=0; break;

}

case 2:{

P0=shuzi[baiwei];

w2=1;w1=w3=w4=0; break;

}

case 3:{

//

5

P0=shuzi[shiwei];

w3=1;w2=w1=w4=0; break;

}

case 4:{

P0=shuzi[gewei];

w4=1;w2=w3=w1=0; break;

}

default: weizhi=0;

}

weizhi++;

}

if(power==0) {

if(aj1==ajkongzhi)

//关机状态下加速按键 {

if(jishi2<1000)

//消抖时间

500ms {

jishi2++;

if(jishi2>5) //

jishi11=100;

jishi2=0;

flag1=1;

if(flag2==1)

flag1=0;

flag2=0;

power=1;

power=0;

} else {

{

} else

{

} }

}

else { jishi2=0; flag1=0;

}

if(aj2==ajkongzhi)

6

//关机状态下减速按键

{

if(jishi3<1200)

{ jishi3=0; flag2=0; }

//消抖时间1500ms

jishi11=100;

if(flag1==1)

flag1=0;

flag2=0;

power=1;

power=0;

}

else

{ jishi3++; if(jishi3>5)

}

else

{

jishi3=0;

flag2=1;

{

} else

}

}

if(power==1) {

if((aj1==ajkongzhi2)&&(bujin==0))

//开机状态下的加速按键 {

if(jishi2

//消抖时间

500ms

jishi2++;

else

{

jishi2=0;

if(jishi5>50)

jishi5=jishi5-35;

if(zhuansu<600)

{

zhuansu++;

7

led1=0;

led2=1;

zhuansu=600;

if(jishi7<1000) //消抖时间1000ms

jishi7=0;

if(flag2==1)

jishi11=500;

flag1=0;

flag2=0;

power=0;

} else

}

jishi7++; else {

flag1=1;

//

{

}

else

power=1;

}

}

else

{

jishi2=0; jishi5=500; jishi7=0; flag1=0;

}

if((aj2==ajkongzhi)&&(bujin==0)) //开机状态下的减速按键 {

if(jishi3

//消抖时间500ms { jishi3++;

}

else {

jishi3=0;

if(jishi6>50)

jishi6=jishi6-35;

if(zhuansu>10) {

zhuansu--;

led1=1;

8

jishi6=500; jishi8=0; flag2=0; }

led2=0;

}

else

zhuansu=10; if((aj3==ajkongzhi)&&(flag4==1))

}

if(jishi8<1200) { jishi8++;

} else { jishi8=0; flag2=1; if(flag1==1)

{

jishi11=500; flag1=0; flag2=0; power=0;

}

else power=1;

}

}

else {

jishi3=0;

//正反转切换按键

{

if(jishi1<500)

// 500ms反应 { jishi1++; if(jishi1>5)

jishi11=100;

}

else { jishi1=0;

flag4=0;

FR=~FR;

}

}

else if(aj3!=ajkongzhi) {

jishi1=0; flag4=1;

} if(FR==1) { led3=1; led4=0;

}

9

else { led3=0; led4=1;

}

if(aj4==ajkongzhi)

//单步进按键 { if(flag3==1) {

if(jishi4<100)

//100ms消抖 {

jishi4++;

if(jishi4>5)

jishi11=50;

}

else { jishi4=0;

flag3=0;

//单步进按键锁定

if(bujin==0)

{

bujin=1;

bujinshu=0;

//切换至单步

进模式

STEP=0;

if(bujinshu<9999)

{

bujinshu++;

jishu=8;

TL1=jishi10;

TH1=jishi10>>8;

TR1=1;

jishi12=80;

ST=0;

}

{

bujinshu=0;

}

}

else

{

//

else

10

}

led1=1; led2=1; }

ajkongzhi=~ajkongzhi;

}

} ajkongzhi1=ajkongzhi;

if(jishi9<1500) ajkongzhi2=ajkongzhi;

//切换至连续转动模式 { jishi9++; if(jishi9>5) jishi11=100;

}

else { jishi9=0; if(bujin==1)

{

bujin=0; TR1=1; ST=0; }

}

}

else { jishi4=0;

flag3=1;

//单步进按键

解锁 jishi9=0; }

}

if(power==0) {

}

void timer1() interrupt 3 using 1 //定时器T1 步进信号输出定时 {

if(bujin==0) { if(ST==1) ST=0; STEP=~STEP; TR1=0; TL1=jishi10; TH1=jishi10>>8; TR1=1;

} else { if(jishu>0)

{

STEP=~STEP;

TR1=0; TL1=jishi10; TH1=jishi10>>8; TR1=1; jishu--;

}

11

}

else

TR1=0;

}

12

本文来源:https://www.bwwdw.com/article/71c7.html

Top