基于DSP的电机控制设计报告 - 图文

更新时间:2023-10-06 04:15:01 阅读量: 综合文库 文档下载

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

基于DSP的电机控制

前言

随着科学技术的飞速发展,人们对控制模型、控制算法要求越来越高,传统意义上的处理器很难满足发展的需求,而数字信号处理器DSP经历了20多年的发展与普及,应用领域几乎涵盖了所有的行业:通信、信息处理、自动控制、雷达、航空航天、医疗、日常消费品等。德州仪器(TI)占据了整个DSP市场的50%左右,很多高校、研究所、公司大量采用TI的方案与芯片进行开发与研究。

为了更好地配合学校的理论教学,达到理论与实践完美的结合,合众达公司总结了10多年在DSP领域中的开发与应用经验,推出了双DSP教学系统SEED-DTK教学实验箱系列产品。它设计新颖、独特,为师生提供了一个完整的教学实验平台,为学生加速学习与系统掌握DSP的开发与应用提供了强有力的手段。SEED-DTK教学实验箱采用模块化设计理念,涵盖了TI所有的主流DSP系列:C2000、C3X、C5000和C6000系列。其中SEED-DTK实验箱中的主控板SEED-DECxxxx采用统一的系统结构、模块结构、机械结构和标准的总线接口以及相同的物理尺寸,实验箱上的主控板可以替换为不同系列SEED-DECxxxx,以适应不同院系在同一实验箱上开展不同的实验内容,大大节省了校方的设备经费。本次课题正是基于合众达公司的一整套设备得以完成。

一、实验目标

新建一个工程,编写相应的程序,以实现如下功能:通过串口调试助手向DSP发送相应的指令,实现对直流电机和步进电机不同运动状态的控制,并在CCS中显示相应的运行状态,同时发送给上位机。

二、 实验前准备及操作步骤

1. 将DSP仿真器与计算机连接好;

2. 将DSP仿真器的JTAG插头与SEED-DEC6437单元的J9相连接;

3. 打开SEED-DTK6437的电源。观察SEED-DTK_Mboard单元的+5V、+3.3V、+15V、-15V的电源指示灯以及SEED-DEC6437单元电源指示灯D4是否均亮;若有不亮的,断开电源,检查电源。

4. 用串口线将SEED-DEC6437 的J13 与PC 机相连。

三、实验的关键

该实验的核心在于,由于该实验要求当串口软件向DSP发送数据之后,实验箱上的直流电机和步进电机要按所接收的数据的不同,显示出不同的运行状态,所以在程序中需要将DSP接收的串口发送的数据所存放的变量与控制电机运行模式的变量对应统一,这样才能够实现由串口来控制电机运行模式的功能。

四、实验具体内容

对于本实验,我们小组讨论后认为,要实现实验目标,首先要明确整个程序的组成部分。我们的程序主要包括三部分:步进电机控制部分,直流电机控制部分以及串口通信部分。编程所需要解决的关键问题是将DSP接收的串口发送的数据所存放的变量与控制电机运行模式的变量对应统一,这样才能达到实验目标所要求的串口指令控制电机。

根据讨论确定的程序主要组成部分,我们确定了编程所需的宏定义,包括控制步进电机、

直流电机所需的各项宏定义,具体如下:

#define ce *( volatile Uint8* )0x44000002

#define DEC6437_CNTL *( volatile Uint8* )0x44000001 #define DEC6437_DTK_BASE 0x46000000

#define DEC6437_DTK_ENABLE 0x0A>>1 //DTK写使能位 #define DEC6437_DTK_STEP 2 //步进电机地址 #define DEC6437_DTK_TRF 2>>1 //交通灯地址 #define DEC6437_DTK_DC 4 //直流电机地址 #define DCMTRRUN 0xAA28//直流电机运行 #define DCMTRBRK 0xAA39//直流电机刹车 #define DCMTRRVS 0xAA3B//直流电机反向 #define MTRCONFIG 0xAA3C//电机设置 #define FULLSTEP 0x0 //步进电机全步 #define HALFSTEP 0x1 //步进电机半步 #define CLOCKWISE 0x0 //电机正向 #define ANTICLOCKWISE 0x1 //电机反向 #define ROTATE 0x0 //旋转 #define LOCATE 0x1 //定位 /*电机运行方式*/

#define STPMTRHALT 0xAA24 //步进电机停止 #define STPMTRRUN 0xAA25 //步进电机运行 #define STPMTRRVS 0xAA26 //步进电机反向 同时,要实现程序的整体功能,需包含如下头文件: #include \

#include \

#include \

由于我们需要在程序中要将DSP所接收的数据所存放的变量与控制相应电机运行模式的变量相统一,针对实验所要控制的两个电机,设置如下测试变量:

Uint32 TestCommand=0,TestCommand1=0; //测试命令变量

TestCommand表示步进电机,TestCommand1表示直流电机,根据命令变量的不同指令值确定相应电机的运行状态。

此外,我们还需要先定义一个函数如下:

void DEC6437_DTK_rset(Int8 regnum, Uint8 regval) {

Uint8 *pdata;

/* Write lower 16 bits of register */

pdata = (Uint8 *)(DEC6437_DTK_BASE + regnum); *pdata = (regval & 0xFFFF);

}

此函数有两个形参,左边的形参在该实验中一开始取DEC6437_DTK_ENABLE为实参,该实参在源文件初始处进行了宏定义 #define DEC6437_DTK_ENABLE 0x0A>>1 //DTK写使能位。在主函数的一开始,调用此函数,使能其写功能。

程序流程图如下图所示:

初始化条件编译实现电机运行模式的选择TestCommand步进电机TestCommand1直流电机正转反转刹车Default运行刹车DefaultBreak电机输出 对于步进电机和直流电机运行状态的定义及控制,我们定义了子函数void dianji(void),当接收到上位机所发送的指令判断相应状态后调用此函数即可控制电机的运行。该函数在源文件通过switch-case语句,由TestCommand和TestCommand1作为中间变量,由DEC6437_DTK_TRF和之前对电机的不同模式所进行的宏定义所指代的地址做为左右实参,通过调用此函数,得以实现两个电机不同的运行模式,详见附录源程序。

此外,实验程序编写的关键就是TestCommand及TestCommand1这两个中间变量与串口接收的数据如何相对应起来。

首先,我们定义如下变量: int stepkz = 0,dckz = 0; unsigned char jieshou =0, qjieshou = 0;

通过EVMDM6437_UART_getChar( uart1, &jieshou );命令读取串口中接收的命令,通过for循环实现不同运行状态的控制,通过printf语句在CCS中显示相应的运行状态。可以判断并选定所接收到数据之后,TestCommand和TestCommand1做为中间变量,而取到不同的地址值。从而由下方的for循环来选择两个电机的运行方式。此外,接收数据,与控制电机运行模式需要不断地进行,以下for循环语句实现此功能。

For循环具体如下: for(;;) { EVMDM6437_UART_getChar( uart1, &jieshou );

if(jieshou == 1) { stepkz = 1; EVMDM6437_UART_putChar( uart1, 1 ); printf(\ if(dckz == 1) { TestCommand = STPMTRRUN; TestCommand1 = DCMTRRUN; dianji(); } if(dckz == 0) { TestCommand = STPMTRRUN; TestCommand1 = DCMTRBRK; dianji(); } }

if(jieshou == 2) { stepkz = 2; EVMDM6437_UART_putChar( uart1, 2 ); printf(\ if(dckz == 1) { TestCommand = STPMTRRVS; TestCommand1 = DCMTRRUN; dianji(); } if(dckz == 0) { TestCommand = STPMTRRVS; TestCommand1 = DCMTRBRK; dianji(); } }

if(jieshou == 3) { stepkz = 3; EVMDM6437_UART_putChar( uart1, 3 ); printf(\ if(dckz == 1) { TestCommand = STPMTRHALT;

TestCommand1 = DCMTRRUN; dianji(); } if(dckz == 0) { TestCommand = STPMTRHALT; TestCommand1 = DCMTRBRK; dianji(); } }

if(jieshou == 4) { dckz = 1; EVMDM6437_UART_putChar( uart1, 4 ); printf(\ if(stepkz == 1) { TestCommand = STPMTRRUN; TestCommand1 = DCMTRRUN; dianji(); } if(stepkz == 2) { TestCommand = STPMTRRVS; TestCommand1 = DCMTRRUN; dianji(); } if(stepkz == 3) { TestCommand = STPMTRHALT; TestCommand1 = DCMTRRUN; dianji(); } }

if(jieshou == 5) { dckz = 0; EVMDM6437_UART_putChar( uart1, 5 ); printf(\ if(stepkz == 1) { TestCommand = STPMTRRUN; TestCommand1 = DCMTRBRK; dianji();

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

Top