MSP430单片机对步进电机的驱动控制设计
- 格式:doc
- 大小:17.00 KB
- 文档页数:4
作品概述MSP430G2 系列 Launchpad 是TI 推出的一款低成本的开辟平台。
它合用于适 用于 TI 最新 MSP430G2xx 系列产品, 其基于 USB 的集成型仿真器可提供为全系 列 MSP430G2xx 器件开辟应用所必需的所有软、硬件。
本作品选择 MSP430G2231 为 Launchpad 核心板的单片机, 采用 Launchpad 核心板加底板的形式, 实现了对 步进机电的四相四拍和四相八拍控制, 并实现了转动方向和转动速度的控制, 并 且用数码管显示转动方向和转动速度的百分比。
本作品选择 MSP430G2231 为 Launchpad 核心板的单片机,采用 Launchpad 核心板加底板的形式,对步进机电进行控制。
滑变,即滑动变阻器,用来控制电 机的转速,本系统共有两个拨动按键,一个拨动按键用来选择步进机电的模式, 如四相八拍或者四相四拍, 另一个拨动按键用来控制转动方向。
数码管可用来显示 模式和方向,以与转速的百分比。
系统总体设计框图如下图 1.2.1 系统总体设计框图在硬件设计时, 只需设计外围电路, 留出与 Launchpad 核心板的接口即可, 既节 约了设计时间, 又节省了成本, 而且无需额外购买仿真器, 从而使设计成本到达数码管Launchpad 核心板拨动按键步进机电滑变.最低。
在软件设计方面,可充分利用 G2 系列单片机的各个功能模块,如时钟系统、TA 定时器、 ADC10 模数转换器,看门狗,以与IO 口中断等资源,设计出高效率、低功耗、结构紧凑而又功能强大的产品。
第一章作品硬件系统设计MSP430G2 系列 Launchpad 是TI 推出的一款低成本的开辟平台。
它合用于适用于 TI 最新 MSP430G2xx 系列产品,其基于 USB 的集成型仿真器可提供为全系列 MSP430G2xx 器件开辟应用所必需的所有软、硬件。
LaunchPad 具有集成的 DIP 目标插座,可支持多达 20 个引脚,从而使 MSP430 Value Line 器件能够简便地插入 LaunchPad 电路板中。
基于MSP430单片机的步进电机控制系统设计步进电机是一种电动机,能够将电脉冲信号转换为机械转动。
它具有结构简单、运行平稳、响应速度快、定位精度高等特点,广泛应用于各种机械设备中。
本文主要介绍基于MSP430单片机的步进电机控制系统的设计。
1.系统硬件设计步进电机控制系统的硬件设计需要包括MSP430单片机、步进电机、电源以及其他辅助电路。
1.1MSP430单片机MSP430系列是由德州仪器公司推出的一款低功耗、高性能的16位单片机。
它具有低功耗、高计算性能、丰富的接口资源等特点,非常适合用于步进电机控制系统。
1.2步进电机步进电机是由转子、定子、绕组和传感器组成,可以完成定距离的转动。
根据具体需求,可以选择不同类型的步进电机,如单相、双相、两相、三相等。
1.3电源步进电机控制系统需要提供稳定的电源供电。
可以采用直流电源或者交流电源,具体电压和电流根据步进电机的额定参数确定。
1.4辅助电路辅助电路包括电机驱动电路、电流控制电路、保护电路等。
电机驱动电路可以选择使用驱动芯片,如L293D芯片,来驱动步进电机。
电流控制电路用于控制步进电机的电流大小,保护电路用于保护步进电机不受过电流、过压等问题的影响。
2.系统软件设计步进电机控制系统的软件设计需要编写相应的程序代码,并通过MSP430单片机来控制步进电机的运动。
2.1硬件初始化在软件设计开始之前,需要对MSP430单片机的相关硬件进行初始化设置。
包括设置时钟源、引脚功能、定时器等。
根据具体的单片机型号,可以参考官方提供的资源来进行初始化设置。
2.2电机控制算法步进电机的控制主要通过控制电流脉冲来实现。
根据步进电机的型号和控制要求,可以选择不同的控制算法,如单相步进、双相步进或者微步控制等。
通过控制电流脉冲的频率、信号大小来控制步进电机的转动方向以及速度。
2.3交互界面设计可以通过开发板上的按键、液晶显示屏、串口等方式,设计一个交互界面,用于用户输入控制命令、设置参数以及显示系统状态等。
基于MSP430单片机的步进电机控制器的设计与实现步进电机是一种常见的电动机类型,它通过以固定的步进角度运动来驱动机械装置。
MSP430单片机是一种低功耗、高性能的微控制器,适合用于步进电机控制器的设计与实现。
本文将介绍基于MSP430单片机的步进电机控制器的设计与实现方法。
首先,我们需要了解步进电机的原理和工作方式。
步进电机的转动是通过控制电流的方向和大小来实现的。
根据步进电机的类型和设计参数,我们可以确定所需的控制电流和相位方式。
常见的步进电机类型有单相和双相两种,其中双相步进电机是最常见的。
接下来,我们需要确定MSP430单片机的引脚分配。
通常,步进电机的驱动信号需要4个引脚来控制,分别是两个控制电流的引脚(A+和A-)和两个控制电流的引脚(B+和B-)。
根据MSP430单片机的引脚数量和功能,我们可以选择适当的引脚来连接步进电机。
设计步进电机控制器的核心是编写控制算法。
在MSP430单片机上,我们可以使用C语言或汇编语言编写程序来控制步进电机的转动。
下面是一个简单的C语言程序示例:```c#include <msp430.h>#define APlus BIT0 // P1.0对应步进电机A+引脚#define AMinus BIT1 // P1.1对应步进电机A-引脚#define BPlus BIT2 // P1.2对应步进电机B+引脚#define BMinus BIT3 // P1.3对应步进电机B-引脚void delay(unsigned int ms) //延时函数unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 110; j++);void main(void)WDTCTL=WDTPW,WDTHOLD;//停止看门狗定时器P1DIR = APlus , AMinus , BPlus , BMinus; // 设置引脚为输出模式while (1)P1OUT = APlus , BPlus; // 设置两个控制电流引脚为高电平delay(500);P1OUT = AMinus , BPlus; // 设置两个控制电流引脚为高低电平delay(500);P1OUT = AMinus , BMinus; // 设置两个控制电流引脚为低电平delay(500);P1OUT = APlus , BMinus; // 设置两个控制电流引脚为高电平低电平delay(500);}```以上程序实现了一个简单的步进电机控制器。
用MSP430F149单片机实现步进电机通用控制器1.前言基于步进电机的控制系统,除了步进电机一般还需要专门的驱动电源,驱动电源仅仅完成功率驱动部分,用户并不能使整个控制系统按预定的、期望的工作状态运行,必须对它的驱动电源予以控制,用户需要再次开发。
鉴于此,设计了基于MSP430F149单片机实现的步进电机通用控制器,可以满足大多数控制场合下的要求。
控制器的主要功能为:①可控制多套步进电机驱动系统;目前可同时控制3套系统。
②工作方式灵活,可按设定的曲线运行,曲线最多达8段;可按外部检测到的控制信号运行;可按模拟调节测试功能运行;2.系统的设计 2.1系统的结构本控制器主要实现了多台步进电机在多段曲线上的运行控制。
系统结构如图1所示。
2.2微处理器的选择本设计选用了TI公司所生产的MSP系列单片机MSP430F149。
目的是应用其丰富的接口资源和强大的定时器功能,MSP430F149的性能特点如下:①6个八位并行接口;完全可以实现该系统所有信号的输入、输出,无须硬件扩展,其中P1、P2八位并行端口的每根口线都具有中断功能,使键盘的软、硬件设计变的非常简单。
②12位A/D转换器ADC;完成模拟设定功能。
③强大的定时器功能;TIMER-A3、TIMER-B7分别为带有3个和7个捕捉/比较寄存器的16位定时器,可以满足系统速度的设定及曲线定时的要求。
④液晶驱动模块;⑤内置2KB RAM、60KB的FLASH;MSP430F149所提供的丰富资源,外围硬件扩展只需做很少的工作,不仅设计变得非常简单,而且该控制器体积小、可靠性高。
2.3步进电机起动及加/减速控制方案步进电动机的最高起动频率(突跳频率)一般为0.1KHz 到3-4KHz,而最高运行频率则可以达到N*102 KHz。
以超过最高起动频率的。
基于MSP430步进电机控制器的设计附录附录:源程序清单主控程序:#include<regx51.h>#define uchar unsigned char#define uint unsigned intsbit up=P2^1; //提速sbit down=P2^2; //减速sbit rotation=P2^0; //转向sbit run=P2^3;int speed=10;static ROT=0; //正转(反转)static uint step=0; //起始步//void delay (int i){int k=100;while(i--)while(k--);}Z() //步进方向{switch(step){case 0:P1=0x01;break; case 1:P1=0x04;break; }}F() //步进方向{switch(step){case 0:P1=0x02;break; case 1:P1=0x08;break; }}Fangxiang(){if(!rotation){if(!rotation){TR0=0;ROT=!ROT;TR0=1;do{}while(!rotation);P0=0;}}}void Speed1() //速度{if(!up){delay(2);speed=speed+10;}if(!down){delay(2);speed=speed-10;}}work() //启停{if(!run){delay(100);if(!run)TR0=!TR0;do{}while(!run);}}main(){TCON=0;IE=0x82;TMOD=0x01;while(1){W ork();Speed1();Fangxiang();if(ROT==0)Z();//正转else F();//反转}}void timer0() interrupt 1 {TH0=(65535-speed)/255; TL0=(65535-speed)%255;step=++step;delay(1);if(step>=2)step=0;}测速程序:#include<regx51.h>#define uchar unsigned charuchar j,k,i,a,b,sin,A1,A2,A3,aecond;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay (uchar i){for(j=i;j>0;j--)for(k=125;k>0;k--);}void display(){P0_0=0;P1=table[A1];delay(5);p0_0=1;P0_1=0;P1=table[A2];delay(5);P0_1=1;P0_2=0;P1=table[A3];delay(5);P0_2=1;}void main(){TCON=0x11;IE=0x83;TMOD=0x01;while(1){P2=R;A1=R/100;A2=R/10%10;A3=R%10;for(a=2000;a>0;a--){for(b=10;b>0;b--) display();}}}void timer0() interrupt 1 {static uchar sin=0;TH0=(65535-50000)/255; TL0=(65535-50000)%255; sin++;if(sin>=20){sin=0;R=second;second=0;}}void cesu() interrupt 0 {second++;}。
步进电机控制器的设计研究mps430单片机构成步进电机的控制系统,控制步进电机实现三相六拍运行,启动、升减速、停车定位,以及与上位机的通信,采用串行通信模块、单片机模块和电机驱动模块来构成电机的控制系统;用定时器中断来控制I/O输出高低电平,控制驱动的通断,实现脉冲的环形分配完成三相六拍运行;控制定时时间,来控制频率的增加和减少,实现升减速。
电机的启动频率达到1000hz,最高运行频率达到20000hz。
标签:MPS430单片机;步进电机;通信本系统设计的主要内容分为硬件设计和软件设计两部分。
下面具体的说明一下系统的硬件设计和软件设计。
1 硬件系统的设计设计本系统中,硬件系统主要由电机驱动电路,电源电路,串口通信电路,单片机电路,下面就具体的电路进行分析设计介绍。
图1 硬件系统图1.1 电机驱动电路主要由驱动芯片组成,该系统的驱动部分采用了UC3717A芯片,UC3717A 芯片使用非常简单,它通过3个输入管脚(Phase、I1和I0)接受输入的参数,在2个输出管脚(AOUT和BOUT)上输出相应的控制信号。
利用外部逻辑电路构成的逻辑分配器或微处理器分配信号,由若干片这种电路和少量无源元件可组成一个完整的多相步进电动机驱动系统,可实现整步(基本步距)、半步或微步距控制。
在这里我们使用的是MSP430单片机来分配信号,控制方式是双极性、固定OFF(关断)时间的斩波电流控制。
它们是16脚双列直插塑料封装,4、5、12、13脚为地.UC3717A是UC3717的改进型,其驱动能力是双向电流1A,步进电动机供电电压范围宽,为10-46V。
H桥的功率晶体管有低饱和压降,并附有快速恢复续流二极管(见图2)。
1.2 电源电路在本設计中,整个系统要求电源既有稳压性能,和纹波小等特点,还有是硬件系统的低功耗等特点,因此本系统的电源部分选用了TI公司芯片TPS76033来实现,该芯片能很好的满足硬件系统的要求,TPS760XX芯片是针对电池供电应用的50mA输出的低压差线性稳压器,使用Bicmos工艺,使其在电池供电中显示出杰出的性能。
引言步进电机可快速启动、停止和反转,加上步进电机只有周期性的误差而无累积误差,其运行不受负载变化的影响等特点,使得在速度、位置等控制领域用步进电机来控制变得简单,因而步进电机使用非常广泛。
由于利用单片机实现的步进电机具有控制成本低、使用灵活等特点,所以越来越多地引起人们的重视。
本文介绍基于MSP430系列单片机实现的24BYJ48步进电机控制。
1步进电机1.1工作原理步进电机是一种将电脉冲转化为角位移的执行机构。
角位移与脉冲数成正比,转速与脉冲频率成正比,因此可通过改变脉冲频率实现步进电机调速。
步进电机有许多种形状和尺寸,但不论形状和尺寸如何,按照电磁转矩的产生原理可分为磁阻式(反应式BF )步进电机、永磁式步进电机BY 和感应子式(混合式)BYG 步进电机。
根据励磁绕组的相数分主要有单相、三相、四相和五相等多种[1]。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),步距角的大小反映了步进电机分辨率的大小,它与步进电机的结构和工作方式有关,可以由下式求得:Q S =360°r式中:N 为励磁绕组通电一周的状态改变次数,即为运行拍数,Z r 为步进电机转子齿数。
以三相步进电机为例,假设步进电机转子的齿数为40,以单三拍方式工作,通电顺序为A →B →C →A ,通电一周的状态改变次数为3(即3拍),则步距角为3度。
若以三相六拍方式工作,通电顺序为A →AB →B →BC →C →CA →A ,通电一周的状态改变次数为6,则步距角为1.5度,分辨率提高一倍。
三相三拍运行方式时,当通电顺序为A →B →C →A ,步进电机将不断地按顺时针方向转动,叫正转,那么当通电顺序按A →C →B →A 进行时,则电机反时针旋转,叫反转。
可见控制步进电机正反转只是三相绕组通电顺序不同而已。
同理,三相六拍运行方式时,正转通电顺序为A →AB →B →BC →C →CA →A ,反转通电顺序为A →AC →C →CB →B →BA →A 。
MSP430单片机_步进电机与直流电机控制设计步进电机和直流电机是常用于控制系统中的电机类型,它们在工业自动化、机器人、医疗设备等领域有着广泛的应用。
本文将重点介绍MSP430单片机控制步进电机和直流电机的设计。
步进电机是一种将电脉冲信号转化为角位移或线性位移的电机,它具有定步进角、驱动简单、精度高等特点。
下面是步进电机控制设计的主要步骤:1.确定电机的参数:步进电机的参数包括相数、相电阻、相感应、步距角等,这些参数决定了控制步进电机的电流大小和步进角度。
2.选择正确的驱动电路:常见的步进电机驱动电路有双极性驱动和四相八线驱动。
双极性驱动适用于电流较大的步进电机,而四相八线驱动适用于电流较小的步进电机。
3.设计控制电路:步进电机的控制电路通常是由一个逻辑电平产生器和一个驱动电路组成。
逻辑电平产生器用于产生脉冲信号,而驱动电路则根据脉冲信号控制步进电机的运行方向和速度。
4.编写控制程序:使用MSP430单片机编写控制程序,通过控制IO口输出脉冲信号,将步进电机驱动起来。
控制程序需要根据步进电机的参数来确定脉冲频率和方向,以实现步进电机的转动。
5.调试和优化:通过调试和优化控制程序,调整脉冲频率和方向,使步进电机能够按照预定的角度或线性位移进行运动。
直流电机是一种常见的电动机,在各种控制系统中被广泛应用。
下面是直流电机控制设计的主要步骤:1.确定电机的参数:直流电机的参数包括额定电压、电流和功率等,这些参数决定了控制直流电机的电流大小和速度。
2.选择正确的驱动电路:常见的直流电机驱动电路有H桥驱动和单向驱动。
H桥驱动适用于正反转控制,而单向驱动只能实现单一方向的运动。
3.设计控制电路:直流电机的控制电路通常由一个PWM信号发生器和一个驱动电路组成。
PWM信号发生器产生调制信号,控制电机的转速和转向,驱动电路则根据PWM信号给电机供电。
4.编写控制程序:使用MSP430单片机编写控制程序,通过控制IO口产生PWM信号,将直流电机驱动起来。
基于MSP430步进电机控制器的设计摘要随着微电子和计算机技术的发展,步进电机的需求量与日俱增,它广泛用于打印机、电动玩具等消费类产品以及数控机床、工业机器人、医疗器械等机电产品中,其在各个国民经济领域都有应用。
研究步进电机的控制系统,对提高控制精度和响应速度、节约能源等都具有重要意义。
本设计是采用MSP430单片机对步进电机的控制,通过I/O口输出的时序方波作为步进电机的控制信号,信号经过芯片ULN2003驱动步进电机;同时,用 4个按键来对电机的状态进行控制,并用数码管动态显示电机的转速。
系统由硬件设计和软件设计两部分组成。
其中,硬件设计包括MSP430单片机的电源模块、键盘控制模块、测速模块、步进电机驱动(集成达林顿ULN2003)模块、数码显示(SM420361K数码管)模块6个功能模块的设计,以及各模块在电路板上的有机结合而实现。
软件设计包括键盘控制、步进电机脉冲、数码管动态显示以及转速信号采集模块的控制程序,最终实现对步进电机转动方向及转动速度的控制,并将步进电机的转动速度动态显示在LED数码管上,对速度进行实时监控显示。
软件采用在IAR for MSP430软件环境下编辑的C语言。
本系统具有智能性、实用性及可靠性的特点。
关键词:步进电机 MSP430单片机角位移转速控制方向控制AbstractWith the development of microelectronics and computer technology, increasing demand for stepper motor, which is widely used in printers, electronic toys and consumer products such as CNC machine tools, industrial robots, medical equipment and electrical products, and its various national fields are applied. Of stepper motor control system to improve the control accuracy and response speed, energy conservation and so important.This design is used MSP430 of Stepping motor control, through the IO port as a square wave output of the timing of step motor control signal, the signal through the ULN2003 driver chip stepper motor; the same time, with four buttons to the status of the motor control, and dynamic display with digital control motor speed.System consists of hardware and software design of two parts. Among them, the hardware design, including minimum system MSP430 microcontroller, power supply module, keyboard control module, stepper motor drive (integrated Darlington ULN2003) module, digital display (SM420361K digital control) module, speed modules (including the Hall probe UGN3020) six function modules, and each module in the circuit board to achieve the organic combination. Software design, including keyboard control, stepping motor pulse, the digital dynamic display and speed signal acquisition module, control procedures, and ultimately to the stepper motor rotation direction and rotation speed control of stepper motor rotation speed and dynamic display in the LED digital tube, real-time monitoring of the speed display. Software used in the software environment to edit IAR for MSP430 C language. This system has the intelligence, practicality and reliability features.Key Words:Stepping motor MSP430 Angular displacement Speed control Direction control目录摘要 (I)第一章绪论 (1)1.1课题背景 (1)1.2国内外发展现状 (1)1.3本文设计的任务 (3)第二章系统概述 (4)2.1系统的总体框架 (4)2.1.1 系统的组成 (4)2.1.2系统的工作原理 (5)2.2系统的主要功能 (5)2.2.1 步进电机的主要功能 (5)2.2.2 系统的特点 (5)3.1MSP430系列单片机简介 (6)3.1.1 MSP430系列单片机功能特性 (6)3.1.2 MSP430系列单片机的应用 (8)3.2MSP430F149型单片机 (8)3.2.1 MSP430F149的引脚图 (8)3.2.2 MSP430F149的微处理器CPU (9)3.2.3工作方式 (9)3.3步进电机 (11)3.3.1 步进电机概述 (11)3.3.2 步进电机的特性 (11)3.3.3 步进电机的种类 (12)3.3.4 永磁步进电机的控制原理 (12)3.4步进电机控制器系统的组成 (14)3.4.1 电源设计 (15)3.4.2 键盘控制电路 (15)3.4.3 LED数码显示电路 (16)3.4.4 测速电路介绍 (18)3.4.5 步进电机驱动电路 (19)第4章控制系统软件的设计 (22)4.1程序设计前期准备 (22)4.1.1 程序设计平台 (22)4.1.2 程序设计思路 (24)4.2程序流程图 (25)4.2.1 主程序流程图 (25)4.2.2 读键盘子程序流程图 (26)4.2.3 键盘处理子程序流程图 (27)4.2.4 电机控制中断程序流程图 (30)第5章系统调试 (35)5.1系统的调试 (35)5.2运行结果 (35)第6章总结 (37)致谢 (38)参考文献 (39)附录 (41)南京工业大学本科生毕业设计(论文)第一章绪论1.1 课题背景当今社会,电动机在工农业生产、人们日常生活中起着十分重要的作用。
基于MSP430实现的步进电机控制步进电机是一种常见的电动机,特点是步进角固定,平稳运行,精度高,广泛应用于机械和自动控制领域。
本文主要介绍基于MSP430微控制器的步进电机控制实现。
步进电机是一种将电能转换为机械能的装置,其转子每次运动一定的角度,可以控制定位的精度。
步进电机由定子和转子组成,定子上有若干个绕组,每个绕组对应一个磁极。
转子上有若干个永磁体,与定子的磁极相对应。
定子绕组按照特定的顺序通电,可以使转子定角度运动。
MSP430是一种低功耗的微控制器,广泛应用于嵌入式系统中。
它具有丰富的外设和强大的运算能力,适用于实时控制任务。
步进电机控制的关键是按照特定的顺序给定子绕组通电。
常见的控制方式有单相全步进、双相全步进、单相半步进等。
每种控制方式具有不同的定位精度和工作效率。
在MSP430上实现步进电机控制,需要连接步进电机驱动电路并编写控制程序。
步进电机驱动电路由MSP430的IO口控制,通过输出高低电平来控制步进电机的运动。
控制程序需要按照特定的顺序将对应的IO口设置为高电平,从而达到控制步进电机运动的目的。
以下是基于MSP430实现步进电机控制的一般步骤:1.连接步进电机驱动电路:根据步进电机的型号和电路要求,连接驱动电路到MSP430的IO口。
通常需要一个或多个MOSFET或BJT来控制步进电机的相位。
2.初始化IO口:在程序开始时,需要将用来控制步进电机的IO口初始化为输出模式,并设置初始电平。
3.编写控制程序:根据步进电机的控制方式,编写相应的控制程序。
通常使用循环结构,按照特定的序列控制IO口的高低电平。
4.循环控制:在控制程序中,使用循环结构无限循环执行步进电机的运动。
根据步进电机的控制方式,确定每一步的运动方向和步长。
5.延时控制:步进电机的转动需要一定的时间间隔,控制程序中需要添加延时函数,保证每步的时间一致。
可以使用MSP430的定时器来实现精确的延时操作。
6.控制运动范围:根据需要控制步进电机的运动范围,可以通过控制循环次数或其他方式实现。
各模块的电路图如下:试验程序如下:#include <msp430x14x.h>#define DCO_FREQ 1000000 // DCO frequency#define ONE_SEC_CNT 512 // Number of WDT interrupts in 1 second#define DEBOUNCE_CNT 0x05 // (1/512)*5 = ~10 msec debounce#define DIR_MASK 0x01 // 0x01 is clockwise, 0x00 is counter-clockwise #define STEP_MASK 0x02 // 0x00 is full-stepping, 0x02 is half-stepping #define MOTION_MASK 0x04 // 0x00 is continuous, 0x04 is single-step#define DEFAULT_RA TE 0x8000 // Default stepping rate#define MIN_RATE 0x8000 // Minimum stepping rate#define MAX_RATE 0x0800 // Maximum stepping rate// Default state is full-stepping, clockwise, continuousunsigned char state = 1; // State variableunsigned char stepIndex = 0; // State table indexunsigned int rate = DEFAULT_RA TE; // Stepping rateunsigned char change_rate_flag = 0; // Flag indicating rate changeunsigned int max_rate = MAX_RA TE; // Maximum stepping rateunsigned int min_rate = MIN_RA TE; // Minimum stepping rate unsigned int SW[4];void sys_init(void);void Set_DCO(unsigned long freq);void timerA_Init(void);void uart0_Init(void);void wdt_Init(void);void toggle_stepping_mode(void);void increase_stepping_rate(void);void decrease_stepping_rate(void);void toggle_motion(void);void toggle_direction(void);//定义串口操作变量char nRev_UART0; // 串口0 的接收标志char UART0_TX_BUF[10]; // 串口0 的发送缓冲区char UART1_RX_Temp[10];char UART0_RX_BUF[10]; // 串口0 的接收缓冲区int nTX0_Len;int nRX0_Len;int nRX0_Len_temp;char nTX0_Flag;int nSend_TX0;// 整步状态表Astatic const unsigned char fullStepA[] ={0x00,0x00,0x01,0x01};// 半步状态表Bstatic const unsigned char fullStepB[] ={0x01,0x00,0x00,0x01};// 半步状态表Astatic const unsigned char HalfStepA[] = {0x01, // 001 10x06, // 110 20x00, // 000 30x00, // 000 40x00, // 000 50x07, // 111 60x01, // 001 70x01 // 001 8};// 逆时钟、半步状态表Bstatic const unsigned char CcwHalfStepB[] = {0x01, // 001 10x01, // 001 20x01, // 001 30x06, // 110 40x00, // 000 50x00, // 000 60x00, // 000 70x07 // 111 8};// 顺时钟、半步状态表Bstatic const unsigned char CwHalfStepB[] = {0x00, // 000 10x00, // 000 20x00, // 000 30x07, // 111 40x01, // 001 50x01, // 001 60x01, // 001 70x06 // 110 8};void main(void){int i;// 停止WDTWDTCTL = WDTPW + WDTHOLD;sys_init();_EINT();for(;;){if(nRev_UART0 == 1){nRev_UART0 = 0;for(i = 0;i < nRX0_Len;i++) UART1_RX_Temp[i] = UART0_RX_BUF[i];if((UART1_RX_Temp[0] == 'A') && (UART1_RX_Temp[1] == 'T')){UART0_TX_BUF[0] = 'O';UART0_TX_BUF[1] = 'K';UART0_TX_BUF[2] = 13;nTX0_Len = 3;switch(UART1_RX_Temp[2]){case 'D': // 方向toggle_direction();break;case 'C': // 运动模式toggle_motion();break;case 'M': // 步进模式toggle_stepping_mode();break;case 'F': // 增加速率increase_stepping_rate();break;case 'S': // 降低速率decrease_stepping_rate();break;default: break;}}else{UART0_TX_BUF[0] = 'E';UART0_TX_BUF[1] = 'R';UART0_TX_BUF[2] = 'O';UART0_TX_BUF[3] = 'R';UART0_TX_BUF[4] = 'R';UART0_TX_BUF[5] = 13;nTX0_Len = 6;}// 设置中断标志,进入发送中断程序IFG1 |= UTXIFG0;nRX0_Len = 0;}}}void sys_init(void){// 设置下降沿触发中断P1IES = 0x0f;P1IFG = 0x00;P1IE = 0x0f;// 设置P2.3,2,1,0 为输出// 设置P3.3,2,1,0 为输出P2OUT = 0x00;P3OUT = 0x00;P2DIR |= 0x0f;P3DIR |= 0x0f;// 设置DCOSet_DCO(DCO_FREQ);// 初始化Timer AtimerA_Init();// 初始化UART0uart0_Init();// 初始化WDTwdt_Init();}void Set_DCO(unsigned long freq){unsigned int clkCnt;unsigned int numDcoClks;unsigned int prevCnt = 0;// ACLK = LFXT1CLK/8 = 4096 HzBCSCTL1 |= DIV A_3;numDcoClks = freq/4096;TACCTL2 = CM_1 + CCIS_1 + CAP; TACTL = TASSEL_2 + MC_2 + TACLR; while(1){while( !(TACCTL2 & CCIFG) ){}TACCTL2 &= ~CCIFG;clkCnt = TACCR2 - prevCnt;prevCnt = TACCR2;if( numDcoClks == clkCnt ){break;}else if( clkCnt > numDcoClks ){DCOCTL--;if( DCOCTL == 0xFF ){if( BCSCTL1 & 0x07 ){BCSCTL1--;}else{break;}}}else{DCOCTL++;if( DCOCTL == 0x00 ){if( (BCSCTL1 & 0x07) != 0x07 ){BCSCTL1++;}else{break;}}}}// ACLK = LFXT1CLK/1 = 32768 HzBCSCTL1 &= ~DIV A_3;TACCTL2 = 0;TACTL = 0;}void wdt_Init(void){// 设置时钟源为ACLK,1秒内产生512此WDTCTL = WDTPW + WDTTMSEL + WDTCNTCL + WDTSSEL + WDTIS0 + WDTIS1; }void uart0_Init(void){//将寄存器的内容清零U0CTL = 0X00;//数据位为8bitU0CTL += CHAR;U0TCTL = 0X00;//波特率发生器选择ACLKU0TCTL += SSEL0;//波特率为9600UBR0_0 = 0X03;UBR1_0 = 0X00;UMCTL_0 = 0x4A;//使能UART0的TXD和RXDME1 |= UTXE0 + URXE0;//使能UART0的RX中断IE1 |= URXIE0;//使能UART0的TX中断IE1 |= UTXIE0;//设置P3.4为UART0的TXDP3SEL |= BIT4;//设置P3.5为UART0的RXDP3SEL |= BIT5;//P3.4为输出管脚P3DIR |= BIT4;}void timerA_Init(void){TACCR0 = rate;TACCTL0 = CCIE;TACTL = TASSEL_2 + MC_1 + TACLR;}interrupt [TIMERA0_VECTOR] void TimerA_ISR(void) {unsigned char index;unsigned char p2 = 0;unsigned char p3 = 0;// 判断步进速率是否需要改变if( change_rate_flag ){TACCR0 = rate;change_rate_flag = 0;}// 判断状态switch( (state & 0x3) ){case 0x00: // 整步、逆时钟方向index = stepIndex & 0x03;p2 |= fullStepA[index];p3 |= fullStepB[index];P2OUT = p2;P3OUT = p3;++stepIndex;break;case 0x01: // 整步、顺时钟方向index = stepIndex & 0x03;p3 |= fullStepA[index];p2 |= fullStepB[index];P3OUT = p3;P2OUT = p2;++stepIndex;break;case 0x02: // 半步、逆时钟方向index = stepIndex & 0x07;p2 |= HalfStepA[index];p3 |= CcwHalfStepB[index];P2OUT = p2;P3OUT = p3;++stepIndex;break;case 0x03: // 半步、顺时钟方向index = stepIndex & 0x07;p3 |= CwHalfStepB[index];p2 |= HalfStepA[index];P3OUT = p3;P2OUT = p2;++stepIndex;break;default: break;}// 如果单步状态下,禁止定时器中断if( state & MOTION_MASK ){TACCTL0 &= ~CCIE;}}////////////////////////////////////////// 处理来自串口0 的接收中断interrupt [UART0RX_VECTOR] void UART0_RX_ISR(void) {//接收来自的数据UART0_RX_BUF[nRX0_Len_temp] = RXBUF0;nRX0_Len_temp += 1;if(nRX0_Len_temp >= 2)if(UART0_RX_BUF[nRX0_Len_temp - 2] == '\r' && UART0_RX_BUF[nRX0_Len_temp - 1] == '\n') {// 过滤掉回车换行(\r\n)if(nRX0_Len_temp == 2){nRX0_Len_temp = 0;}else if(nRX0_Len_temp > 2){nRX0_Len = nRX0_Len_temp;nRev_UART0 = 1;nRX0_Len_temp = 0;}}}////////////////////////////////////////// 处理来自串口0 的发送中断interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void) {if(nTX0_Len != 0){// 表示缓冲区里的数据没有发送完nTX0_Flag = 0;TXBUF0 = UART0_TX_BUF[nSend_TX0];nSend_TX0 += 1;if(nSend_TX0 >= nTX0_Len){nSend_TX0 = 0;nTX0_Len = 0;nTX0_Flag = 1;}}}interrupt [WDT_VECTOR] void WDT_ISR(void){unsigned char sw_state;static unsigned char one_sec_flag = 0;// 获得P1口的输入sw_state = ~P1IN & 0x0f;// 判断是否有键按下if( sw_state == 0x00 ){// 禁止看门狗中断IE1 &= ~WDTIE;// 判断是否S2的激活状态小于1秒if( !one_sec_flag && (SW[1] >= DEBOUNCE_CNT) ){toggle_motion();}// 复位状态计数器SW[0] = 0;SW[1] = 0;SW[2] = 0;SW[3] = 0;// 复位标志one_sec_flag = 0;// 使能P1口的中断功能P1IFG = 0x00;P1IE = 0x0f;}else{// 检查是否是S1状态if( sw_state & 0x01 ){if( SW[0] < ONE_SEC_CNT ){// 增加状态计数器++SW[0];}if( SW[0] == DEBOUNCE_CNT ){toggle_direction();}}else{SW[0] = 0;}// 检查是否是S2状态if( sw_state & 0x02 ){if( SW[1] < ONE_SEC_CNT ){// 增加状态计数器++SW[1];}if( SW[1] == ONE_SEC_CNT )toggle_stepping_mode();one_sec_flag = 1;SW[1] = 0;}}else{// 判断是否S2的激活状态小于1秒if( !one_sec_flag && (SW[1] >= DEBOUNCE_CNT) ) {toggle_motion();}one_sec_flag = 0;SW[1] = 0;}// 检查是否是S3状态if( sw_state & 0x04 ){// 检查是否是连续模式if( (state & MOTION_MASK) == 0 ){if( SW[2] < ONE_SEC_CNT ){// 增加状态计数器++SW[2];}if( SW[2] == DEBOUNCE_CNT ){increase_stepping_rate();}}else // 单步模式{// 增加状态计数器++SW[2];if( (SW[2] % DEBOUNCE_CNT) == 0 ){increase_stepping_rate();}}else{SW[2] = 0;}// 检查是否是S4状态if( sw_state & 0x08 ){if( SW[3] < ONE_SEC_CNT ){// 增加状态计数器++SW[3];}if( SW[3] == DEBOUNCE_CNT ){decrease_stepping_rate();}}else{SW[3] = 0;}}}interrupt [PORT1_VECTOR] void PORT1_ISR(void) {// 禁止端口1的中断P1IE = 0x00;// 清除端口1的中断标志P1IFG = 0x00;// 使能看门狗中断IE1 |= WDTIE;}void increase_stepping_rate(void){unsigned int new_rate;// 检查是否是连续模式if( (state & MOTION_MASK) == 0 )new_rate = rate >> 1;if( new_rate >= max_rate ){rate = new_rate;change_rate_flag = 1;}}//使能定时器A的中断TACCTL0 |= CCIE;}void decrease_stepping_rate(void){// 检查是否是连续模式if( (state & MOTION_MASK) == 0 ){if( rate <= (min_rate >> 1) ){rate <<= 1;change_rate_flag = 1;}}// 使能定时器A的中断TACCTL0 |= CCIE;}void toggle_stepping_mode(void){// 切换步进模式state ^= STEP_MASK;// 检查是否是半步模式if( state & STEP_MASK ){// 从整步模式切换到半步模式// 定时器的频率加倍rate = (rate >> 1);change_rate_flag = 1;max_rate = (MAX_RA TE >> 1);min_rate = (MIN_RATE >> 1);}else // 整步模式// 从半步模式切换到整步模式// 定时器的频率减半rate = (rate << 1);change_rate_flag = 1;max_rate = MAX_RATE;min_rate = MIN_RA TE;}}void toggle_motion(void){state ^= MOTION_MASK;// 检查是否是连续步进模式if( (state & MOTION_MASK) == 0 ){// 使能定时器中断TACCTL0 |= CCIE;}}void toggle_direction(void){state ^= DIR_MASK;}。
MSP430单片机对步进电机的驱动控制设计
单片机实现的步进电机控制系统具有成本低、使用灵活的特点,广泛应用于数控机床、机器人,定量进给、工业自动控制以及各种可控的有定位要求的机械工具等应用领域。
步进电机是数字控制电机,将脉冲信号转换成角位移,电机的转速、停止的位置取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,非超载状态下,根据上述线性关系,再加上步进电机只有周期性误差而无累积误差,因此步进电机适用于单片机控制。
步进电机通过输入脉冲信号进行控制,即电机的总转动角度由输入脉冲总数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路是根据单片机产生的控制信号进行工作。
因此,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
1 系统设计原理
步进电机控制系统主要由单片机、键盘LED、驱动/放大和PC上位机等4个模块组成,其中PC机模块是软件控制部分,该控制系统可实现的功能:1)通过键盘启动/暂停步进电机、设置步进电机的转速和改变步进电机的转向;2)通过LED管显示步进的转速和转向等工作状态;3)实现三相或四相步进电机的控制:4)通过PC上位机实现对步进电机的控制(启停、转速和转向等)。
为保护单片机控制系统硬件电路,在单片机和步进电机之间增加过流保护电路。
图l为步进电机控制系统框图。
2 系统硬件电路设计
2.1 单片机模块
单片机模块主要由MSP430FG4618单片机及外围滤波、电源管理和晶振等电路组成。
MSP430FG4618单片机内部的8 KB RAM和116 KB Flash满足控制系统的存储要求,P1和P2端口在步进电机工作过程中根据按键状态判断是否跳入中断服务程序来改变步进电机的工作状态,USART模块实现单片机和PC上位机之间的通信,实现PC机对步进电机控制。
电源管理电路提供稳定的3.3 V和5 V电压,分别给单片机、晶振电路和驱动和功率放大电路供电。
32 kHz晶振给单片机、键盘/显示接口器件8279和脉冲分配器。