单片机步进电机程序设计

合集下载

单片机控制步进电机程序设计

单片机控制步进电机程序设计

单片机控制步进电机程序设计1.引言步进电机是一种常用的电机类型,其特点是精度高、稳定性好、速度可调。

在很多自动控制系统中,步进电机被广泛应用于位置控制、定位、打印机等领域。

本文将介绍如何使用单片机来控制步进电机,并给出一个简单的步进电机程序设计示例。

2.步进电机简介步进电机是一种将电脉冲信号转换为角位移或线位移的电机。

其优点包括:-分辨率高:每个步进电机的旋转角度可以非常小,可实现较高的位置精度。

-可控制性强:通过控制电压脉冲的频率和顺序,可以精确控制步进电机的转动方向和步数。

-响应快速:步进电机的响应速度较快,可达数千转每分钟。

3.单片机选型与连接在实现步进电机的控制过程中,我们选择了一款适用于步进电机控制的单片机。

这款单片机具有以下特点:-高效的运算能力和大容量存储空间,适用于复杂的控制算法。

-可编程性强,支持多种开发环境,开发过程相对简便。

-丰富的外设接口,方便与步进电机的连接和控制。

连接单片机与步进电机的基本电路如下所示:步进电机驱动引脚1--单片机引脚A步进电机驱动引脚2--单片机引脚B步进电机驱动引脚3--单片机引脚C步进电机驱动引脚4--单片机引脚D4.步进电机控制原理步进电机控制原理基于对步进电机驱动引脚输入电压脉冲信号的控制。

针对不同的步进电机类型,控制方式可以有所不同,常见的控制方式包括全步进控制和半步进控制。

4.1全步进控制全步进控制方式是将电流依次施加到步进电机的每个驱动相,使其按照一定顺序正转或反转。

控制步骤如下:1.给引脚A和引脚B施加电压,使电机顺时针转动一个步距。

2.给引脚B和引脚C施加电压,使电机顺时针转动一个步距。

3.给引脚C和引脚D施加电压,使电机顺时针转动一个步距。

4.给引脚D和引脚A施加电压,使电机顺时针转动一个步距。

4.2半步进控制半步进控制方式是在全步进控制的基础上,通过控制相邻两个相的电流互补关系,实现更细微的步距调整。

控制步骤如下:1.给引脚A施加电压,使电机顺时针转动半个步距。

单片机课程设计-单片机控制步进电机

单片机课程设计-单片机控制步进电机

单片机课程设计-单片机控制步进电机单片机课程设计单片机控制步进电机一、引言在现代自动化控制领域,步进电机以其精确的定位和可控的转动角度,成为了众多应用场景中的关键组件。

而单片机作为一种灵活、高效的控制核心,能够实现对步进电机的精确控制,为各种系统提供了可靠的动力支持。

本次课程设计旨在深入研究如何利用单片机来有效地控制步进电机,实现特定的运动需求。

二、步进电机的工作原理步进电机是一种将电脉冲信号转换为角位移或线位移的开环控制电机。

它由定子和转子组成,定子上有若干个磁极,磁极上绕有绕组。

当给绕组依次通电时,定子会产生磁场,吸引转子转动一定的角度。

通过控制通电的顺序和脉冲数量,可以精确地控制电机的转动角度和速度。

三、单片机控制步进电机的硬件设计(一)单片机的选择在本次设计中,我们选用了常见的_____单片机。

它具有丰富的引脚资源、较高的运算速度和稳定的性能,能够满足控制步进电机的需求。

(二)驱动电路为了驱动步进电机,需要使用专门的驱动芯片或驱动电路。

常见的驱动方式有全桥驱动和双全桥驱动。

我们采用了_____驱动芯片,通过单片机的引脚输出控制信号来控制驱动芯片的工作状态,从而实现对步进电机的驱动。

(三)接口电路将单片机的引脚与驱动电路进行连接,需要设计合理的接口电路。

接口电路要考虑信号的电平匹配、抗干扰等因素,以确保控制信号的稳定传输。

四、单片机控制步进电机的软件设计(一)控制算法在软件设计中,关键是确定控制步进电机的算法。

常见的控制算法有脉冲分配法和步距角细分法。

脉冲分配法是根据电机的相数和通电顺序,按照一定的时间间隔依次输出控制脉冲。

步距角细分法则是通过在相邻的两个通电状态之间插入中间状态,来减小步距角,提高电机的转动精度。

(二)程序流程首先,需要对单片机进行初始化设置,包括引脚配置、定时器设置等。

然后,根据用户的输入或预设的运动模式,计算出需要输出的脉冲数量和频率。

通过定时器中断来产生控制脉冲,并按照预定的顺序输出到驱动电路。

步进电机单片机课程设计程序

步进电机单片机课程设计程序

步进电机单片机课程设计程序7EH 0-1表示正反转 7DH 0-F转速控制7CH-79H步距数ORG 0000HAJMP MAINORG 000BHAJMP IT0PORG 0050HMAIN: MOV SP,#40HMOV 79H,#00HMOV 7AH,#00HMOV 7BH,#00HMOV 7CH,#00HMOV 7DH,#00HMOV 7EH,#00HL4: MOV R1,#7EHL1: ACALL dirLOOP1:ACALL ks1JZ L1ACALL keyiCJNE A,#16H,BBLCALL ZZZBB: CJNE A,#10H,L2AJMP DO1L2: MOV @R1,ADEC R1CJNE R1,#78H,LOOP1AJMP L4DO1: MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HACALL HB1SETB ET0SETB TR0SETB EAHERE: ACALL DIRACALL CF1ACALL ks1JZ l1ACALL keyiCJNE A,#0EH,hereSJMP MAINSJMP HEREORG 0300HIT0P: PUSH PSWPUSH ACCPUSH DPHPUSH DPLMOV TH0,#3CHMOV TL0,#0B0HDJNZ 63H,RETURNMOV 63H,#0AHMOV A,#01HADD A,62HDA AMOV 62H,ACJNE A,#60H,RETURNMOV 62H,#00HMOV A,#01HADD A,61HDA AMOV 61H,ACJNE A,#60H,RETURNMOV 61H,#00HMOV A,#01HADD A,60HDA AMOV 60H,ACJNE A,#24H,RETURNMOV 60H,#00H RETURN:POP DPHPOP DPLPOP ACCPOP PSWRETICF1: MOV R5,62HMOV A,R5ANL A,#0F0HSWAP AMOV 7AH,AMOV A,R5ANL A,#0FHMOV 79H,AMOV R5,61HMOV A,R5ANL A,#0F0HSWAP AMOV 7CH,AMOV A,R5ANL A,#0FHMOV 7BH,AMOV R5,60HMOV A,R5ANL A,#0F0HSWAP AMOV 7EH,AMOV A,R5ANL A,#0FHMOV 7DH,ARETHB1: MOV 63H,#0AHMOV A,7AHSWAP AADD A,79HMOV 62H,AMOV A,7CHSWAP AADD A,7BHMOV 61H,AMOV A,7EHSWAP AADD A,7DHMOV 60H,ARETORG 0400Hkeyi: MOV R2,#0FEHMOV R4,#00HLk4: MOV DPTR,#0FFDDH MOV A,R2MOVX @DPTR,AINC DPTRMOVX A,@DPTRJB ACC.0,LONEMOV A,#00HAJMP lkplone: JB ACC.1,ltw0 MOV A,#08HAJMP lkpLTW0: JB ACC.2,LTHR MOV A,#10HAJMP LKPLTHR: JB ACC.3,next MOV A,#18Hlkp: ADD A,R4PUSH ACClk3: ACALL dirACALL ks1JNZ lk3POP ACCMOV DPTR,#tabel1MOVC A,@A+DPTRRETnext: INC R4MOV A,R2JNB ACC.7,kndRl AMOV R2,AAJMP lk4knd: RETks1: MOV DPTR,#0FFDDHMOV A,#00HMOVX @DPTR,AINC DPTRMOVX A,@DPTRCPL AANL A,#0FHRETtabel1:DB 7,4,8,5,9,6,0AH,0BH,1,0,2,0FH,3,0EH,0CH,0DH,0,0,0,0,0,0,16 H,10HORG 0500Hdir: MOV R0,#79HMOV R3,#01HMOV A,R3ld0: MOV DPTR,#0FFDDHMOVX @DPTR,AMOV A,@R0MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0FFDCHdir1: MOVX @DPTR,AACALL dl1msINC R0MOV A,R3JB ACC.5,ld1RL AMOV R3,AAJMP ld0ld1:RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83HDB 0C6H,0A1H,86H,8EH,8CH,0C1HDB 0CEH,91H,89H,0C7H,0FFHdl1ms:MOV R7,#02Hdl: MOV R6,#0FFHdl6: DJNZ R6,dl6DJNZ R7,dlRETZZZ: MOV A,#00HCJNE A,7EH,FZAJMP ZZFZ: MOV P1,#03HACALL DELAY1MOV P1,#06HACALL DELAY1MOV P1,#0CHACALL DELAY1MOV P1,#09HACALL DELAY1ACALL J1AJMP FZZZ: MOV P1,#09HACALL DELAY1MOV P1,#0CHACALL DELAY1MOV P1,#06HACALL DELAY1MOV P1,#03HACALL DELAY1ACALL J1AJMP ZZDELAY1: MOV A,#03HADD A,7DHRL ARL AMOV R7,ADE1: MOV R6,#0FFHDE2: DJNZ R6,DE2DJNZ R7,DE1ACALL dirRETJ1: MOV R0,#79HJ2: CJNE @R0,#0,ZJ1MOV @R0,#9INC R0CJNE R0,#7DH,J2AJMP JSZJ1: DEC @R0RETJS: DEC SPDEC SPLJMP MAINEND一、系统描述及控制要求要求:设计一个三相六拍环形分配器控制脉冲进而控制步进电机运行。

单片机驱动步进电机程序代码

单片机驱动步进电机程序代码

/实现功能:正转程序使用芯片:AT89S52晶振:编译环境:Keil作者:声明此程序仅用于学习与参考,引用请注明版权和作者信息/include<> //库文件define uchar unsigned char //字符型宏定义define uint unsigned int //整型宏定义uchar tcnt; //定时器计数初值定义uint sec; //速度值定义uchar buf11;uchar bai,shi,ge;/控制位定义/sbit shi_neng=P1^0; // 使能控制位sbit fang_shi=P1^1; // 工作方式控制位sbit fang_xiang=P1^2;// 旋转方向控制位sbit mai_chong=P1^3; // 脉冲控制位/延时函数/void delay1msuchar z{uchar x,y;forx=0;x<z;x++fory=0;y<110;y++;}/定时中断服务函数/void t0void interrupt 1 using 0 //定时中断服务函数{tcnt++; //每过250ust tcnt 加一iftcnt==1 //当tcnt满足条件时{tcnt=0; //计满重新再计sec++;ifsec==6 //括号内数值越小,电机转动速度越快{sec=0; //计满重新再计mai_chong=~mai_chong; //脉冲输出}}}/定时器0/1初始化/void T0_Init{ET0 = 1;TMOD = 0x22;TH0=0x06; //对TH0 TL0 赋值TL0=0x06;TR0=1; //开始定时sec=0;mai_chong=1; // 脉冲控制位}/串口初始化/void Uart_Init{TMOD = 0x22;TH1 = 0xFD;TL1 = 0xFD;SCON = 0x50;PCON &= 0xef;TR1 = 1;}/数据接收函数/void ReceiveBuf{int i;fori=0;i<11;i++{bufi = SBUF;whileRI == 0;RI=0;}}/角度控制函数/void Control{ifbai==buf5&shi==buf6&ge==buf7{shi_neng=0;};ifbai<buf5{shi_neng=1;fang_xiang=0;}else ifbai>buf5{shi_neng=1;fang_xiang=1;};ifbai==buf5&shi<buf6{shi_neng=1;fang_xiang=0;}else ifbai==buf5&shi>buf6{shi_neng=1;fang_xiang=1;};ifbai==buf5&shi==buf6&ge<buf7{shi_neng=1;fang_xiang=0;}else ifbai==buf5&shi==buf6&ge>buf7 {shi_neng=1;fang_xiang=1;};ifbai==buf5&shi==buf6&ge==buf7{shi_neng=0;};delay1ms3;bai=buf5;shi=buf6;ge=buf7;}/主函数/main{EA=1;T0_Init;Uart_Init;while1{// shi_neng=1; // 使能控制位fang_shi=1; // 工作方式控制ReceiveBuf;delay1ms1;Control;delay1ms10;}}/结束/。

单片机课程设计步进电机

单片机课程设计步进电机

单片机课程设计 步进电机一、课程目标知识目标:1. 让学生掌握步进电机的原理、结构及其在单片机控制系统中的应用。

2. 让学生了解步进电机的控制算法,如细分驱动、变速控制等。

3. 使学生能够运用所学知识,设计简单的单片机控制步进电机系统。

技能目标:1. 培养学生使用编程软件(如Keil、Arduino等)编写单片机程序,实现对步进电机的控制。

2. 培养学生运用电路原理图设计、搭建单片机控制步进电机的硬件系统。

3. 培养学生动手操作、调试单片机控制步进电机系统的能力。

情感态度价值观目标:1. 激发学生对单片机控制技术及步进电机应用的兴趣,培养其创新意识和探索精神。

2. 培养学生团队协作意识,提高沟通与协作能力。

3. 培养学生严谨的科学态度和良好的工程素养,使其具备一定的项目实践能力。

课程性质分析:本课程为单片机课程设计,以实践操作为主,结合理论教学。

课程内容具有较强的实践性和应用性,旨在培养学生运用单片机技术解决实际问题的能力。

学生特点分析:学生已具备一定的单片机基础知识,具有一定的编程和电路设计能力。

但大部分学生对步进电机及其控制技术了解较少,需要通过本课程的学习,提高实际应用能力。

教学要求:1. 结合学生特点,注重理论与实践相结合,强化实践操作环节。

2. 采用项目驱动法,引导学生主动参与课程学习,培养其自主学习能力。

3. 注重课程评价,通过过程性评价和总结性评价相结合,全面评估学生的学习成果。

二、教学内容1. 步进电机原理与结构- 介绍步进电机的种类、原理及结构- 分析步进电机的技术参数,如步距角、静力矩等2. 步进电机控制技术- 讲解步进电机的控制方式,如单脉冲控制、细分控制等- 探讨步进电机的变速控制原理及实现方法3. 单片机与步进电机接口技术- 介绍单片机与步进电机接口电路设计- 分析常用的步进电机驱动芯片及其应用4. 步进电机控制程序设计- 指导学生使用编程软件(如Keil、Arduino等)编写步进电机控制程序- 讲解程序设计中的关键算法,如PID控制、速度规划等5. 单片机控制步进电机系统实践- 布置实际项目任务,让学生动手搭建单片机控制步进电机系统- 指导学生进行系统调试,分析并解决实际问题6. 课程总结与评价- 对所学内容进行总结,巩固知识点- 进行课程评价,检验学生学习成果教学内容安排与进度:第1-2周:步进电机原理与结构、步进电机控制技术第3-4周:单片机与步进电机接口技术、步进电机控制程序设计第5-6周:单片机控制步进电机系统实践、课程总结与评价教材章节关联:本教学内容与教材中“步进电机控制技术”章节相关,涉及的内容包括步进电机原理、接口技术、控制程序设计等,为教材内容的拓展与实践。

单片机控制步进电机程序设计 -回复

单片机控制步进电机程序设计 -回复

单片机控制步进电机程序设计-回复单片机控制步进电机程序设计是现代电子技术领域的重要研究方向之一。

步进电机广泛应用于工业生产、机械设备、医疗器械等领域,具有定位精度高、控制方便等优势。

本文将从单片机控制步进电机的基本原理、程序设计流程和示例程序三个方面,逐步讲解单片机控制步进电机的程序设计。

一、单片机控制步进电机基本原理步进电机是一种可以控制转动角度和转速的电动机。

它由驱动电路与电机本体两部分组成。

其中,电机本体由定子和转子两部分构成,定子上搭载绕组,转子通过定子和绕组形成磁场的相互作用来实现转动。

驱动电路则负责控制绕组的电流,使电机的转子按照特定的顺序和角度旋转。

单片机作为控制器,通过驱动电路向步进电机的绕组提供电流信号,控制绕组的状态,从而控制步进电机的转动。

具体而言,单片机通过控制输出端口的高低电平来控制驱动电路产生相应的电流信号,进而控制步进电机的转动。

二、单片机控制步进电机程序设计流程单片机控制步进电机的程序设计主要分为以下几个步骤:1. 确定步进电机的工作模式:步进电机有多种工作模式,包括全步进模式、半步进模式等。

根据实际需要选择适合的工作模式。

2. 确定步进电机的转速和转动方向:根据具体需求确定步进电机的转速和转动方向。

一般通过控制输出端口的高低电平和不同的电流信号来实现。

3. 编写程序:根据所选工作模式、转速和转动方向,利用单片机的指令集和控制端口编写相应的程序。

首先需要定义输出端口和相关的变量,然后编写主程序,设置转动方向和转速,最后通过循环控制步进电机的转动。

4. 调试程序:将程序烧录至单片机,连接步进电机及驱动电路,通过调试程序观察步进电机的转动情况,并对程序进行修改优化,直至达到预期的效果。

三、单片机控制步进电机程序设计示例以下是一个简单的单片机控制步进电机程序设计示例:include <reg51.h>define motor P1void delay(unsigned int t){unsigned int i, j;for(i=0; i<t; i++)for(j=0; j<1000; j++);}void main(){motor = 0xFF; 设置所有输出端口为高电平while(1){motor = 0xFF; 正转delay(200);motor = 0x00;delay(200);motor = 0xF0; 反转delay(200);motor = 0x00;delay(200);}}以上示例程序实现了步进电机的定时正反转功能。

单片机控制步进电机课程设计

第一章系统分析概述步进电机是用电脉冲信号控制,以实现对生产过程或设备的数字控制,它是过程控制中一种十分重要和常用的功率执行器件,它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器或角位移发生器等,近年来由于计算机应用技术的迅速发展,步进电机常常和计算机一起组成高精度的数字控制系统。

由于它是由数字脉冲控制,因此非常适合于用单片机控制,本设计便是在此基础上,以MCS51型单片机为核心,并结合外围电路以步进电机为控制对象的控制系统。

1.1 功能简介本设计系统有单片机最小系统、8个按键输入控制、四个数码管显示和步进电机驱动电路一共四大部分组成,通过按键输入数值来控制步进电机转速,并且在数码管上显示数值(1)8个按键包括:数字键1~5;3个功能键:设置SET、清零CLR、开始START;(2)显示器上第一位显示次数,后三位显示每次行走的角度;(3)通过键盘的按键,设置步进电机各次的角度值;第一位设置次数,后三位设置角度值。

(4)按START键启动步进电机开始转动,按SET键停止;按CLR键清零。

1.2 方案选择1.2.1 步进电机驱动电路方案本设计的重点在于对步进电机的控制和驱动,设计中受控电机为四相六线制的步进电机(内阻33欧,步进1.8度,额定电压12V)方案一:使用多个功率放大器件驱动电机通过使用不同的放大电路和不同参数的器件,可以达到不同的放大的要求,放大后能够得到较大的功率,如图1-1,使用三极管组成的步进电机驱动电路。

但是由于使用的是四相的步进电机,就需要对四路信号分别进行放大,由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作也比较复杂。

注:A、B、C、D分别为步进电机四相输入图1-1 三极管组成的步进电机驱动电路方案二:使用ULN2003芯片驱动电机ULN2003芯片可以驱动两个二相电机,也可以驱动一个四相电机,如图1-2。

ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。

完整的单片机控制步进电机程序

#include "reg52.h"#include "INTRINS.H"#include <absacc.h>#include <math.h>#define uint unsigned int#define uchar unsigned charvoid check_addr(void); /* 地址核对*/uchar code slave_addr[4]={00, 01, 02, 255}; /* 从机地址*/uchar idata T0low, T0high,common_count,input_order,cmd_in_permit,interval; ucharsent_ok,speed_change,start_up,start_end,address_true,i;uint y1;uint codeadd[100]={60006,62771,63693,64154,64430,64614,64746,64845,64922,64983,65033,65075,651 11,65141,65167,65190,65211,65229,65245,65260,65273,65285,65296,65306,65315,65323,65331 , 65339,65345,65352,65358,65363,65368,65373,65378,65382,65387,65390,65394,65398,65401,6 5404,65407,65410,65413,65416,65418,65421,65423,65425,65428,65430,65432,65434,65435,654 37,65439,65441,65442,65444,65445,65447,65448,65450,65451,65452,65453,65455,65456,65457 , 65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65469,65470,6 5471,65472,65472,65473,65474,65475,65475,65476,65477,65477,65478,65478,65479,65480,654 80,65481};sbit P2_0=P2A0; sbit P2_2=P2A2; sbit P1_0=P1A0; sbit WD=P1A7; /* 作输入步进电机的脉冲信号发送口*//* 作输入步进电机的旋转方向信号发送口*//*作串口输出信号的使能口,P1_0=0时接通串口,输出信号*/ /* 看门狗*/main(){P2_0=0;P2_2=0; /* 步进电机的旋转方向待试验后确定*/P1_0=1; /* 开机时需要关断,串口发送功能,需要时再接通*/ WD=1; /* 看门狗先为1,电平翻转为喂狗*/ i=0;common_count=0; cmd_in_permit=0;input_order=0;interval=0; address_true=1;speed_change=0;start_up=0;start_end=0;sent_ok=0; // 允许发送EA=1; /* 开放总中断*/ TMOD=0x21;TH1 = 0xFD; TL1 = 0xFD; SCON = 0xd0; PCON &= 0x00; SM2=1;TR1 = 1;ES=1; // 波特率9600// 设定串行口工作方式// 波特率不倍增// 启动定时器1T2MOD=00;T2CON=0x00;RCAP2H =0xEE; //赋T2 的预置值0xA600,25MS ,0xB800 ,20MS,0xCA00 ,15MS,0xDC00 ,10MS,0xEE00 ,5MSRCAP2L =0x00;TR2=1; //启动定时器ET2=1; //打开定时器2 中断do{if(address_true==1){ address_true=0; check_addr();} if(start_up==1&&start_end==0) //第一次启动{y1=add[common_count];T0high = (uchar)(y1>>8) ; /* 取y1 的高8 位*/T0low = (uchar)(y1&0x00ff); /*取y1的低8位*/TR0 = 1;ET0=1; /* 允许T/C0 中断*/start_end=1;}if(speed_change==1){ if(interval>=0&&interval<=0x63) {if(interval>common_count){common_count=common_count+1; }if(interval<common_count){common_count=common_count-1; }speed_change=0;} if(sent_ok==1){ sent_ok=0; P1_0=0; for(i=0;i<=20;i++) {_nop_();}TI=0; SBUF=T0high; while(TI==0);TI=0; TI=0; SBUF=T0low; while(TI==0);TI=0;P1_0=1; for(i=0;i<=20;i++) {_nop_();}SM2=1;}} while(1);}void timer0(void) interrupt 1 using 3{ P2_0=~P2_0; y1=add[common_count];T0high = (uchar)(y1>>8) ; /* 取y1 的高8 位*/ T0low = (uchar)(y1&0x00ff); /* 取y1 的低8 位*/ THO=TOhigh; /*高8 位TOhigh 送定时器0 的TH0*/ TL0=T0low; /*低8 位T0low 送定时器0 的TL0*/}void timer2(void) interrupt 5 using 2{TF2=0; /*T2 溢出中断需软件清0*/ speed_change=1; //速度可以改变标示,以便主程序处理WD=!WD; /*MAX813 喂狗*/}void inte_SERIAL() interrupt 4 using 1 /*串口0 中断服务子程序*/{uchar key_in ; key_in=0;if(RI){key_in=SBUF;RI=0;if (SM2==1){ if(key_in==slave_addr[2]){SM2=0; address_true=1;}}if ((SM2==0)&& (RB8==0)){ if(key_in==0xff){SM2=1;}if(key_in==0xfe){ /* 接收主机命令引导字节,准备接收主机命令*/ cmd_in_permit=1;} if(cmd_in_permit==1){ input_order=input_order+1;}if (input_order==2){ /* 接收主机命令,使从机开始调节电机*/ cmd_in_permit=0; input_order=0;/*interval 代表控制器发给电机的转速期望值*/ interval= key_in;sent_ok=1; if(start_up==0){start_up=1;}}}}}void check_addr(void){ /* 地址核对成功,发送从机地址给主机*/TB8=1;RB8=0;P1_0=0;for(i=0;i<=25;i++) {_nop_();}SBUF=slave_addr[2]; /* 发送地址核对成功,发送从机地址给主机*/ do{} while(TI==0); TI=0;P1_0=1;for(i=0;i<=25;i++) {_nop_();}TB8=0;。

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

基于51单片机的步进电机控制系统设计步进电机是一种特殊的直流电动机,具有定角度、定位置、高精度等特点,在许多领域得到广泛应用,如机械装置、仪器设备、医疗设备等。

本文将基于51单片机设计一个步进电机控制系统,主要包括硬件设计和软件设计两部分。

一、硬件设计步进电机控制系统的硬件设计主要包括51单片机、外部电源、步进电机驱动模块、以及其他辅助电路。

1.51单片机选择由于步进电机控制需要执行复杂的算法和时序控制,所以需要一个性能较高的单片机。

本设计选择51单片机作为主控芯片,因为51单片机具有丰富的外设接口、强大的计算能力和丰富的资源。

2.外部电源步进电机需要较高的电流供给,因此外部电源选择稳定的直流电源,能够提供足够的电流供电。

电源电压和电流的大小需要根据具体的步进电机来确定。

3.步进电机驱动模块步进电机驱动模块是连接步进电机和51单片机的关键部分,它负责将51单片机输出的脉冲信号转化为对步进电机的驱动信号,控制步进电机准确转动。

常用的步进电机驱动芯片有L297、ULN2003等。

4.其他辅助电路为了保证步进电机控制系统的稳定运行,还需要一些辅助电路,如限流电路、电源滤波电路、保护电路等。

这些电路的设计需要根据具体的应用来确定。

二、软件设计1.系统初始化系统初始化主要包括对51单片机进行外部中断、定时器、串口和IO 口等初始化设置。

根据实际需求还可以进行其他模块的初始化设置。

2.步进电机驱动程序步进电机的驱动程序主要通过脉冲信号来控制电机的转动。

脉冲信号的频率和脉冲宽度决定了电机的转速和运行方向。

脉冲信号可以通过定时器产生,也可以通过外部中断产生。

3.运动控制算法步进电机的运动控制可以采用开环控制或闭环控制。

开环控制简单,但无法保证运动的准确性和稳定性;闭环控制通过对电机转动的反馈信号进行处理来调整脉冲信号的生成,从而实现精确的运动控制。

4.其他功能设计根据具体的应用需求,可以加入其他功能设计,如速度控制、位置控制、加速度控制等。

步进电机控制程序(c语言51单片机)


// pri_dj = Pme );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one _round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
while ( key_puse & key_clear ); delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break; }
while( !key_puse ); delay(8ms);
while( !key_puse ); }
set_display_num(); for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0; P0 = P0 | LEDBuf[i] ; if(i==0) led_1000 = 0; //P0^4 if(i==1) led_100 = 0; //P0^5 if(i==2) led_10 = 0; //P0^6 if(i==3) led_1 = 0; //P0^7
delay ( 1ms ); tmp = (~(P2 | 0xF0)); P2 = 0x7F; // 0111 1111
delay ( 1ms ); tmp = (~(P2 | 0xF0)) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1 引言 (1)2 步进电机设计方案及原理 (1)2.1 电路基本理论 (1)2.2 方案设计 (1)3 硬件设计 (2)3.1 硬件设备 (2)3.2 设计思路 (2)3.3 步进电机模块 (2)3.4 控制模块 (2)3.5 指示灯模块 (3)4 软件设计 (4)4.1 程序流程图 (4)4.2 中断延时程序 (4)5 总结 (5)6 参考文献 (5)7 附录 (5)7.1 硬件仿真图 (5)7.2 源程序代码 (6)1引言如今步进电机由于其一步一动以及单、双拍工作模式的特点已经被应用于很多机床设备中,控制好步进电机的运动,使其高效可靠的工作是非常重要的环节。

在该设计中主要模拟步进电机实现正反转的控制。

步进电机是一种将电脉冲转变为角位移的执行机构。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。

可通过控制脉冲数来控制角位移量,来达到准确的定位目的,也可通过控制脉冲的频率来控制电机的转速和加速度,从而达到调速的目的。

本设计根据步进电机的结构、原理及应用,在keil uVision2软件中利用C语言编写程序,然后在Proteus7.0仿真软件中反复运行和调试,实现单片机对步进电机的控制。

2步进电机设计方案及原理2.1 电路基本理论步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,它的的驱动电路根据控制信号工作,控制信号由单片机产生。

当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,控制换相顺序,即通电控制脉冲必须严格按照一定顺序分别控制各相的通断。

通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的。

控制步进电机的转向,即给定工作方式正序换相通电,步进电机正转,若按反序通电换相,则电机就反转。

控制步进电机的速度,即给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步,两个脉冲的间隔越短,步进电机就转得越快。

同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

2.2方案设计基于单片机的步进电机控制电路的基本组成如图1所示。

图1 步进电机控制电路的原理框图在该设计方案中,硬件部分实现用单片机控制电机转动显示功能,包括控制开关模块;电机转动模块和电机转向显示模块。

软件部分实现对步进电机的控制功能,主要设计思想通过控制台控制程序的开关来控制电机的转动,以及控制电动机指示灯的显示。

3硬件设计3.1硬件设备在该设计中,经过分析,硬件器件选择有:单片机AT89C51,四相六线步进电机,电机驱动器LUN2003,LED显示灯,按钮,电阻,电源等。

3.2设计思路用AT89C51做主控芯片,按钮作为外部输入控制信号从P3口输入。

用单片机的P2口作输出口,P2.0~P2.3分别与驱动器LUN2003的1B~4B口相连接,进行脉冲的分配与放大,接着从1C~4C口输出控制电机转动。

又从单片机P2.4~P2.6口输出信号分别控制LED指示灯D2、D1、D3表示电机的正反转及停止状态。

3.3步进电机模块步进电机模块如图2所示,其功能为:将单片机输出的信号经过电机驱动器ULN2003给步进电机一个脉冲信号,使电机实现正转或反转。

ULN2003是高耐压大电流达林顿陈列,由七个硅NPN 达林顿管组成。

ULN2003的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连。

图2步进电机3.4控制模块控制模块如图3所示,其功能为:通过3个按钮向单片机输入控制信号与程序结合来控制电机的正反转及停止。

以及1个按钮控制复位电路让电机恢复到初始状态。

图3单片机控制模块3.5指示灯模块指示灯模块如图4所示,其功能为:通过单片机输出的信号点亮LED灯来显示步进电机的工作状态。

D3红灯表示电机停止工作,D2绿灯表示电机正向运转,D1绿灯表示电机反向运转。

图4 LED显示灯4软件设计4.1程序流程图本设计程序的主流程图如图5所示。

图5程序流程图4.2中断延时程序在中断程序设计中使用定时器T0作中断定时器,所以设定TMOD=0x11。

定时时间设为1ms,则T0高八位、第八位分别为TH0=0xFC,TL0=0x18。

允许外部中断,在主函数中设定EA=1,ET0=1。

通过外部中断程序就可以用控制电路中按钮产生的信号控制电机的转动方向,并且每过1ms检测一次是否有外部中断信号产生。

中断程序代码如下:void timeint(void) interrupt 1 //定时器0中断处理{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}在延时程序中用do…while语句作循环延时。

循环次数设定为1000次。

延时程序代码如下:void delay(){endcount=1000;count=0;do{}while(count<endcount);}5总结本设计采用51单片机AT89C51(晶振频率为12MHZ)对四相六线制步进电机进行控制。

通过I/O口输出的具有时序的脉冲信号经过驱动芯片ULN2003驱动步进电机。

ULN2003是高耐压、大电流达林顿阵列,由七个硅NPN达林顿管组成。

单片机AT89C51的21~24引脚接驱动器ULN2003的1~4输入端。

控制电路中用按钮对步进电机的运行状态进行控制,并用LED灯显示电机的运行状态。

设计的步进电机基本能实现预期目标,不足之处是实现控制比较简单,接下来的工作就是实现更多更复杂的步进电机的控制,如加减速控制,转换单双拍工作模式等。

通过该设计运用了所学的很多内容,如单片机原理,C语言等。

并且更加熟悉了Proteus7和keil uVision2等软件的使用。

软硬件的结合仿真使得我对所学知识应用于实践有了更大的信心。

6参考文献[1]李华,王思明,张金敏.单片机原理及应用[M].兰州:兰州大学出版社,2003:75-105.[2]何钦铭,颜辉.C语言程序设计[M].北京:高等教育出版社,2010:40-73.[3]柴钰.单片机原理和应用[M].西安:西安电子科技大学出版社,2006:66-68.[4]张靖武.单片机系统的PROTUSE设计和仿真[M].电子工业出版社,2007:23-30.7附录7.1硬件仿真图硬件仿真全电路图如图6所示。

单片机AT89C51左边是复位电路,下边是3个按钮的输入控制电路。

单片机右边的上边为指示灯模块,下边为驱动器及步进电机模块。

图6硬件全电路图7.2源程序代码该设计程序主要实现步进电机的正反转及停止控制。

程序中用单片机的P3口作外部信号输入口,用单片机P2口作控制信号输出口。

当单片机接收到外部信号经判断后进入指定程序,依次给P2.0~P2.3口输出高电平控制电机正反转。

主要函数有:主函数main(),延时函数delay(),定时器中断函数timeint()。

该设计中主要用到的软件有:Proteus7.0和keil uVision2。

#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位工作方式1ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数while(1){P2_4=1;P2_5=1;P2_6=0;if(P3_7==0) //停止控制{P2_6=0; //D3亮P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 0;}else if(P3_5==0) //正转控制{P2_6=1; //D3灭P2_4=0; //D2亮P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 1;delay();P2_0 = 0;P2_1 = 0;P2_2 = 1;P2_3 = 0;delay();P2_0 = 0;P2_1 = 1;P2_2 = 0;P2_3 = 0;delay();P2_0 = 1;P2_1 = 0;P2_2 = 0;P2_3 = 0;delay();}else if(P3_6==0) //反转控制{P2_6=1; //D1灭P2_5=0; //D3亮P2_0 = 1;P2_1 = 0;P2_2 = 0;P2_3 = 0;delay();P2_0 = 0;P2_1 = 1;P2_2 = 0;P2_3 = 0;delay();P2_0 = 0;P2_1 = 0;P2_2 = 1;P2_3 = 0;delay();P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 1;delay();}}}void timeint(void) interrupt 1 //定时器0中断处理{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay() //延时子函数{endcount=1000;count=0;do{}while(count<endcount);}。

相关文档
最新文档