嵌入式 步进电机(环形分配器)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];