嵌入式 步进电机(环形分配器)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程数控实验

题目基于LPC2114的直流电机控制系统学院信息工程学院

专业13计算机测控

学号3113002316、3113002317、

3113002318、3113002319

姓名谢志鹏、杨光、叶国康、曾晖

基于LPC2114的步进电机控制器

一.实验要求

1.用一片LPC2000处理器或单片机设计步进电机驱动器,实现脉冲环形分配器和放大驱动电路功能,驱动步进电机运行。

2.用另外一片LPC2000处理器设计数控系统,设置步进电机步进运动方向选择开关、电位器输入步进运动速度、键盘输入步进运动步数,设置运动脉冲和方向信号输出给步进电机驱动器,实现对步进电机的运动控制信号给定。

二.实验原理

1.LPC2103部分(步进电机驱动部分):

(1)脉冲输入:利用LPC2103芯片的脉宽调制器(PWM)产生占空比为50%的方波信号。

(2)正反转:把L297的CW/CCW接到LPC2103的一个引脚,通过控制该引脚电平的高低即可实现控制电机正反转。

(3)步进步数控制:把步进电机控制器的定时器0设置成捕获计数模式,当捕获到一个脉冲时,TC 加1,直到TC等于给定步数时,停止方波输出。

2.LPC2114(信号输入部分)

(1)步进运动速度输入:通过调节电位器,再经过LPC2114的AD转换,得到电位器触点的电压值。将电压值按照一定的比例换算成速度值,通过串口发送到LPC2103(步进电机控制器),以改变方波的频率。

(2)步进步数输入:通过键盘输入步进步数,将结果通过串口发送到LPC2103(步进电机控制器)。

三.硬件电路

图3.1 电路图

L297是步进电机控制器,适用于双极性两相步进电机或单极性四相步进电机的控制,可有半步、整步和波状三种驱动模式。片内斩波电路允许开关式控制绕组电流。该器件的一个显著特点是仅需时钟、方向和模式输入信号。步进电机所需相位由电路内部产生,大大减轻了的负担。

L297的引脚端功能如下:

◆引脚端10(使能端EN)为芯片的片选信号,高电平有效;

◆引脚端20(复位RST),低电平有效;

◆引脚端19(HALF/FULL)和引脚端17(CW/CCW)都通过上拉电阻链接到高电平;

◆引脚端18(时钟输入CLK)的最大输入时钟频率不能超过5KHz,控制时钟的频率,即可控制电机转

动速率;

◆引脚端19(HALF/FULL)决定电机的转动方式,HALF/FULL=0,电机按整步方式运转,HALF/FULL=1,

电机按半步方式运转;

◆引脚端17(CW/CCW)控制电机转动方向;CW/CCW=1,电机顺时针旋转;CW/CCW=0,电机逆时针

旋转。

◆当L297的复位引脚RST输入电平时,L297复位。

具体控制状态如表5.57所示:

表3.1 控制电机状态表

端口名称光耦输入端L297端口电机响应状态

RST 低电平低电平停止高电平高电平启动

使能端EN 低电平高电平输入控制信号旋转高电平低电平停止旋转并保持

HF/FF 低电平高电平半步工作模式高电平低电平全部工作模式

CW/CCW 低电平高电平顺时针旋转高电平低电平逆时针旋转

图3.3 采用L297+L298N构成的步进电机驱动电路

控制信号CW/CCW经L297处理后,产生的四相A、B、C、D或INH1和INH2输入到L298N进行功率放大,经L298N功率放大后的四相控制信号输出到步进电机,控制步进电机运动。

L298是内含两个桥的高电压大电流双全桥式驱动器,接受标准逻辑电平信号,可驱电压46V、每相2.5A

及以下的步进电机。每个桥都具有一个使能输入端,在不受输入信号影响的情况下允许或禁止器件工作,每个桥的两个桥臂低端三极管的发射极接在一起并引出,用以外接检测电阻。它设置了一附加电源输入端使逻辑部分在低电压下工作。

使用L298+L297可以做成两相双极性的步进电机驱动电路,它是采用定电流方式驱动,每相电流峰值可达2A,L297是步进电机控制器,用来产生两相双极性驱动信号(A、B、C、D)与电机电流设定,L298是用来驱动步进电机的电力输出,是双全桥接方式驱动,由于采用双极性驱动,因此电机线圈完全利用,使步进电机可以达到最佳的驱动。

四.软件设计

1.驱动器部分主要程序

#include "lpc2103.h"

#include “uart.h”

/* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/

#define Fosc 5529600

#define Fcclk (Fosc * 6)

#define Fcco (Fcclk * 4)

#define Fpclk (Fcclk / 4) * 1

uint8 speed,step,dir,spee;

uint8 Buf[3] = {0}; /* 串口接收数据缓冲区*/

void Timer0Init()

{

T0TCR = 0x02; /* 定时器1 复位*/

T0PR = 0; /* 不设时钟分频*/

T0CTCR = 0x06; //计数功能

T0TCR = 0x01; /* 启动定时器1 */

}

void PWMInit(void)

{

T1TCR = 0x02; /* 定时器1 复位*/

T1PR = 0; /* 不设时钟分频*/

T1PWMCON= 0x02; /* 使能MA T1.1 PWM 输出*/

T1MCR = 0x02; /* 设置T1MR0 匹配后复位T0TC */

T1MR0 = 1500; /* 设置PWM 输出的周期*/

T1MR1 = 0; /* 设置PWM1.1 输出占空比为100%*/

T1TCR = 0x01; /* 启动定时器1 */

}

int main (void)

{

IOCLR = 1<<13;

PINSEL0 = PINSEL0 & (~0x0F);

PINSEL0 = PINSEL0 | 0x05; /* 设置I/O 连接到UART */

PINSEL0 = (PINSEL0 & (~(0x03 << 8))) | (0x02 << 8); //设置I/O连接到CAP0.1

IODIR |= 1 << 2;IOSET = 1 << 2;

PINSEL0 = (PINSEL0 & (~(0x03 << 26)))| (0x02 << 26);/* 选择MA T1.1 输出*/

PWMInit(); /* 定时器 1 初始化*/

Timer0Init();

UARTInit (); /* 串口初始化*/

while (1)

{

spee = speed;

UART0GetStr(Buf, 3); /* 从串口接收字符串*/

DelayNS(10);

UART0SendStr(Buf);

if( Buf[2]==1 || Buf[2]==0 )

{

if(spee!=Buf[0])

{

speed = Buf[0];

相关文档
最新文档