步进电机PWM控制程序设计论文.docx
《步进电机PWM控制程序设计论文.docx》由会员分享,可在线阅读,更多相关《步进电机PWM控制程序设计论文.docx(22页珍藏版)》请在冰豆网上搜索。
步进电机PWM控制程序设计论文
沈阳工程学院
课程设计
设计题目:
步进电机PWM控制程序设计
1.设计主要内容及要求;
1)研究步进电机PWM控制及利用DSP实现的方法。
2)编写步进电机控制程序。
3)调试程序,观察结果。
2.对设计论文撰写内容、格式、字数的要求;
(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。
(2).学生应撰写的内容为:
中文摘要和关键词、目录、正文、参考文献等。
课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。
应做到文理通顺,内容正确完整,书写工整,装订整齐。
(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。
(4).课程设计论文装订顺序为:
封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。
3.时间进度安排;
顺序
阶段日期
计划完成内容
备注
1
7月2日
教师讲解题目,学生查阅相关资料
2
7月3日
确定步进电机控制算法以及程序流程
3
7月4日
编写程序
4
7月5日
调试程序
5
7月6日
撰写论文,程序验收
沈阳工程学院
步进电机PWM控制课程设计成绩评定表
指导教师评审意见
评价
内容
具体要求
权重
评分
加权分
调研
论证
能独立查阅文献,收集资料;能制定课程设计方案和日程安排。
0.1
5
4
3
2
工作能
力态度
工作态度认真,遵守纪律,出勤情况是否良好,能够独立完成设计工作,
0.2
5
4
3
2
工作量
按期圆满完成规定的设计任务,工作量饱满,难度适宜。
0.2
5
4
3
2
说明书
的质量
说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。
0.5
5
4
3
2
指导教师评审成绩
(加权分合计乘以12)
分
加权分合计
指导教师签名:
年月日
评阅教师评审意见
评价
内容
具体要求
权重
评分
加权分
查阅
文献
查阅文献有一定广泛性;有综合归纳资料的能力
0.2
5
4
3
2
工作量
工作量饱满,难度适中。
0.5
5
4
3
2
说明书
的质量
说明书立论正确,论述充分,结论严谨合理,文字通顺,技术用语准确,符号统一,编号齐全,图表完备,书写工整规范。
0.3
5
4
3
2
评阅教师评审成绩
(加权分合计乘以8)
分
加权分合计
评阅教师签名:
年月日
课程设计总评成绩
分
引言
目前各种控制系统、通信系统、网络系统、仪器仪表等都以微处理器为核心。
几十年来,随着大规模集成电路技术的不断发展,微处理器的性能越来越高、体积越来越小、系列越来越多。
微处理器从过去单纯的中央处理单元,发展到将众多外围设备集成到片内形成单片机,由过去的8位机,发展到16位、32位机。
由于大规模集成电路技术的突破,DSP控制器的价格已和普通单片机接近,但其性能远远超过了普通单片机。
DSP控制器由DSP(DigitalSignalProcessor,数字信号处理器)发展而来,其突出特点就是采用多组总线技术实现并行机构,有独立的加法器和乘法器,有灵活的寻址方式,从而可以非常快速地实现复杂算法。
而此次是步进电机PWM控制程序设计,采用全步四相四拍控制方式,用四个控制接口为四个引脚,按一定的频率循环置高电平即可使步进电机转动。
而用户可以通过修改定时器1的周期以及PWM的比较功能调整电机运行方向与状态。
1设计任务描述
1.1设计题目
步进电机PWM控制程序设计
1.2设计目的
(1)掌握LaunchCodeComposerStudio使用方法。
(2)掌握直流电机PWM控制原理。
(3)学会用C语言编写程序。
1.3设计要求
(1)研究直流电机PWM控制及利用DSP实现的方法。
(2)编写直流电机控制程序。
(3)调试程序,观察结果。
1.4发挥部分
自由发挥
2设计思路
步进电机采用全步四相四拍的控制方式,其接口为EVA的PWM1,PWM2,PWM3,PWM4引脚。
它们分别为步进电机四相的控制端。
按照一定频率循环置高电平即可使步进电机转动。
用定时器设置周期中断,作为PWM的频率,比较寄存器里边设置两组数,作为PWM的脉宽。
当定时器中断次数达到某个值时,可以改变比较寄存器中的值,从而改变PWM的脉宽,即改变高低电平的占空比,进而改变电动机的转速。
令此程序循环进行下去就能实现电动速度的连续变化。
可以通过修改定时器1的周期以及PWM的比较功能调整电机运行方向与状态,
3设计方框图
4各部分程序设计
4.1实验程序功能与结构说明
1.stepmotor.c:
实验主程序,包含了系统初始化,步进电机控制,机调速等;
2.DSP28_EV.c:
包含了事件管理器初始化。
3.DSP28_DefaultIsr.c:
包含了异步串口接收中断服务程序。
4.DSP28_GlobalVariableDefs.c:
各个外设备全局变量定义。
5.DSP28_PieCtrl.c:
PIE中断初始化。
6.DSP28_PieVect.c:
PIE中断矢量表初始化。
7.DSP28_SysCtrl.c:
系统初始化。
8.2812.cmd:
声明了系统的存储器配置与程序各段的连接关系。
9.2812.gel:
系统初始化
10.*.h:
各个源文件的头文件
11.rts2800.l:
库函数文件
4.2头文件
#include"DSP281x_Device.h"//DSP281x头文件
DSP281x头文件包括很多子文件:
#include"DSP281x_SysCtrl.h"//SystemControl/PowerModes
#include"DSP281x_DevEmu.h"//DeviceEmulationRegisters
#include"DSP281x_Xintf.h"//ExternalInterfaceRegisters
#include"DSP281x_CpuTimers.h"//32-bitCPUTimers
#include"DSP281x_PieCtrl.h"//PIEControlRegisters
#include"DSP281x_PieVect.h"//PIEVectorTable
#include"DSP281x_Spi.h"//SPIRegisters
#include"DSP281x_Sci.h"//SCIRegisters
#include"DSP281x_Mcbsp.h"//McBSPRegisters
#include"DSP281x_ECan.h"//EnhancedeCANRegisters
#include"DSP281x_Gpio.h"//GeneralPurposeI/ORegisters
#include"DSP281x_Ev.h"//EventManagerRegisters
#include"DSP281x_Adc.h"//ADCRegisters
#include"DSP281x_XIntrupt.h"//ExternalInterrupts
#include"DSP281x_DefaultISR.h"//DefaultISR
4.3初始化
4.3.1DSP28_EV.c:
包含了事件管理器初始化。
voidInitEv(void){//设置GPIO
EALLOW;
GpioMuxRegs.GPAMUX.all=0x00ff;
EDIS;//初始化定时器控制寄存器(EVA)
EvaRegs.GPTCONA.all=0;//设置定时器1
//设置定时器1的周期和比较;
EvaRegs.T1PR=0xffff;//周期
//中断使能
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;//清除计数寄存器
EvaRegs.T1CNT=0x0000;//设置定时器控制寄存器;
EvaRegs.T1CON.all=0x1040;//连续递增/递减计数,定时器使能,关闭比较使能
//使能产生PWM1-PWM4的比较功能
EvaRegs.CMPR1=0x0c00;
EvaRegs.CMPR2=0x3c00;
//比较方式控制
//输出引脚1CMPR1-高有效输出引脚2CMPR1-低有效
//输出引脚3CMPR2-高有效输出引脚4CMPR2-低有效
//输出引脚5CMPR3-高有效输出引脚6CMPR3-低有效
EvaRegs.ACTRA.all=0x0666;
EvaRegs.DBTCONA.all=0x0Af8;//x/4,死区开,m=2,p=4,t=0.2us
EvaRegs.COMCONA.all=0xA600;
}
4.3.2DSP28_PieCtrl.c:
PIE中断初始化。
voidInitPieCtrl(void){
PieCtrl.PIECRTL.bit.ENPIE=0;
//清除所有PIE记录
PieCtrl.PIEIER1.all=0;
PieCtrl.PIEIER2.all=0;
PieCtrl.PIEIER3.all=0;
PieCtrl.PIEIER4.all=0;
PieCtrl.PIEIER5.all=0;
PieCtrl.PIEIER6.all=0;
PieCtrl.PIEIER7.all=0;
PieCtrl.PIEIER8.all=0;
PieCtrl.PIEIER9.all=0;
PieCtrl.PIEIER10.all=0;
PieCtrl.PIEIER11.all=0;
PieCtrl.PIEIER12.all=0;
//清除所有PIE记录
PieCtrl.PIEIFR1.all=0;
PieCtrl.PIEIFR2.all=0;
PieCtrl.PIEIFR3.all=0;
PieCtrl.PIEIFR4.all=0;
PieCtrl.PIEIFR5.all=0;
PieCtrl.PIEIFR6.all=0;
PieCtrl.PIEIFR7.all=0;
PieCtrl.PIEIFR8.all=0;
PieCtrl.PIEIFR9.all=0;
PieCtrl.PIEIFR10.all=0;
PieCtrl.PIEIFR11.all=0;
PieCtrl.PIEIFR12.all=0;
//PIE使能:
PieCtrl.PIECRTL.bit.ENPIE=1;
PieCtrl.PIEACK.all=0xFFFF;}
4.3.3DSP28_SysCtrl.c:
系统初始化。
voidInitSysCtrl(void){
Uint16i;
EALLOW;
//关闭看门狗
SysCtrlRegs.WDCR=0x0068;
//初始化PLL
SysCtrlRegs.PLLCR=0xA;
//等待PLL上锁
for(i=0;i<5000;i++){}
SysCtrlRegs.HISPCP.all=0x0001;
SysCtrlRegs.LOSPCP.all=0x0002;
//Peripheralclockenablessetfortheselectedperipherals.
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;
}
voidKickDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY=0x0055;
SysCtrlRegs.WDKEY=0x00AA;
EDIS;
}
4.3.42812.gel:
系统初始化
4.3.5DSP28_PieVect.c:
PIE中断矢量表初始化。
4.4实验主程序系统的初始化及使能
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
*p_ceselect=0x6;//打开ce3空间
for(i=0;i<0x100;i++);
*p_iodisable=0x1;//IO空间始能
for(i=0;i<0x100;i++);
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化EV*/
InitEv();
//重新分配中断服务的中断向量
EALLOW;
PieVectTable.T1PINT=&eva_timer1_isr;//定时器1计数中断
EDIS;
//初始化变量
EvaTimer1InterruptCount=0;
//使能PIE组2中断4--T1PINT
PieCtrl.PIEIER2.all=M_INT4;
//使能CPU中断
IER|=M_INT2;
EINT;
ERTM;
for(;;)
{
KickDog();
}}
4.5定时器1的设置与PWM的比较功能和比较方式控制
//初始化定时器控制寄存器(EVA)
EvaRegs.GPTCONA.all=0;
//设置定时器1
//设置定时器1的周期和比较;
EvaRegs.T1PR=0xffff;//周期
//中断使能
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
//清除计数寄存器
EvaRegs.T1CNT=0x0000;
//设置定时器控制寄存器;
EvaRegs.T1CON.all=0x1040;//连续递增/递减计数,定时器使能,关闭比较使能
//使能产生PWM1-PWM4的比较功能
EvaRegs.CMPR1=0x0c00;
EvaRegs.CMPR2=0x3c00;
//比较方式控制
//输出引脚1CMPR1-高有效输出引脚2CMPR1-低有效
//输出引脚3CMPR2-高有效输出引脚4CMPR2-低有效
//输出引脚5CMPR3-高有效输出引脚6CMPR3-低有效
EvaRegs.ACTRA.all=0x0666;
EvaRegs.DBTCONA.all=0x0Af8;//x/4,死区开,m=2,p=4,t=0.2us
EvaRegs.COMCONA.all=0xA600;
4.6PWM控制设置与中断
//EVGP1周期中断
interruptvoideva_timer1_isr(void)
{
EvaTimer1InterruptCount++;
if((EvaRegs.CMPR1>=0xfff3)||(EvaRegs.CMPR1==0x0011))
Direct1=(Direct1==0)?
1:
0;
if((EvaRegs.CMPR2>=0xfff3)||(EvaRegs.CMPR2==0x0011))
Direct2=(Direct2==0)?
1:
0;
if(Direct1==1)
EvaRegs.CMPR1=EvaRegs.CMPR1+0x500;
else
EvaRegs.CMPR1=EvaRegs.CMPR1-0x500;
if(Direct2==1)
EvaRegs.CMPR2=EvaRegs.CMPR2+0x500;
else
EvaRegs.CMPR1=EvaRegs.CMPR2-0x500;
//使能中断
EvaRegs.EVAIMRA.bit.T1PINT=1;
//清除中断标志
EvaRegs.EVAIFRA.all=BIT7;
//中断应答接收更多的PIE组2的中断
PieCtrl.PIEACK.all=PIEACK_GROUP2;
}
5工作过程分析
5.1.步进电机的驱动:
图是单极性步进电机翻译/驱动的典型电路,图中的方块为驱动开关。
针对
SEED-DEC中直流电机系统的动作要求,步进电机驱动电路设计思路如下:
1)电机采用15V直流电源供电;
2)4路控制信号由SEED-DTK_MBoard提供,信号为CMOS标准电平,通过排线接入并下拉;
3)使用达灵顿管TIP31C代替IRL540作为电机驱动开关,基级串接100Ω
电阻;
4)使用快速二极管1N4007完成保护功能,以免电机换向时烧毁电机;
5)使用50Ω限流电阻(半步运行时电流约为0.2A,小于电机电源额定电流);
6)电机电源/地之间跨接电容,电机地与数字地之间采用磁珠连接共地;
步进电机在这个实验中选择的是M35SP-7N,其步进角为7.5°,是一种单极性
的步进电机。
它的结构如下图所示:
实际使用时,公共端1与2是短接在一起做为电源输入,一共五个抽头。
控制每个绕组的两个抽头来实现对步进电机的控制。
步进电机的控制一般分为四相四拍与四相八拍两种方式,其中前者称为全步,后者称为半步。
5.2.步进电机的驱动接口:
步进电机的控制接口为EVA的PWM1、PWM2、PWM3、PWM4引脚。
它们分别为步进电机四相的控制端。
按一定的频率循环置高电平即可使可使步进电机转动。
引脚与步进电机的线圈对应关系如下图所示:
在步进电机为四相四拍时,其正转顺序为A->B->C->D->A,在控制器中
CNTL[3:
0]的输出依次为:
0x8->0x4->0x2->0x1.
其反转的顺序为A->D->C->B->A,在控制器中CNTL[3:
0]的输出依次为:
0x8->0x1->0x2->0x4。
6设计程序
#include"DSP28_Device.h"
/*定义扩展总线存储器空间页地址寄存器地址为0x004020*/
volatileunsignedint*p_ceselect=(volatileunsignedint*)0x004020;
/*定义交通灯IO口的地址为0x80000*/
volatileunsignedint*p_iodisable=(volatileunsignedint*)0x080007;
//子函数声明
interruptvoideva_timer1_isr(void);
//全局中断计数变量
intDirect1=0;
intDirect2=0;
Uint32EvaTimer1InterruptCount;
Uint32i;
voidmain(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER=0x0000;
IFR=0x0000;
*p_ceselect=0x6;//打开ce3空间
for(i=0;i<0x100;i++);
*p_iodisable=0x1;//IO空间始能
for(i=0;i<0x100;i++);
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化EV*/
InitEv();
//重新分配中断服务的中断向量
EALLOW;
PieVectTable.T1PINT=&eva_timer1_isr;//定时器1计数中断
EDIS;
//初始化变量
EvaTimer1InterruptCount=0;
//使能PIE组2中断4--T1PINT
PieCtrl.PIEIER2.all=M_INT4;
//使能CPU中断
IER|=M_INT2;
EINT;
ERTM;
for(;;)
{
KickDog();
}
}
/**********************************************/
//EVGP1周期中断
/**********************************************/
interruptvoideva_timer1_isr(void)
{
EvaTimer1InterruptCount++;
if((EvaRegs.CMPR1>=0xfff3)||(EvaRegs.CMPR1==0x0011))
Direct1=(Direct1==0)?
1:
0;
if((EvaRegs.CMPR2>=0xfff3)||(EvaRegs.CMPR2==0x0011))
Direct2=(Direct2==0)?
1:
0;
if(Direct1==1)
EvaRegs.CMPR1=EvaRegs.CMPR1+0x500;
else
EvaRegs.CMPR1=EvaRegs.CMPR1-0x500;
if(Direct2==1)
EvaRegs.CMPR2=EvaRegs.CMPR2+0x500;
else
EvaRegs.CMPR2=EvaRegs.CMPR2-0x500;
//使能中断
EvaRegs.EVAIMRA.bit.T1PINT=1;
//清除中断标志
EvaRegs.EVAIFRA.all=BIT7;
//中断应答接收更多的PIE组2的中断
PieCtrl.PIEACK.all=PIEACK_GROUP2;
}
小结
这一周的课设很快的就结束了。
这次课设让我过了非常充实的一周,不仅学会了很多DSP的知识,加强了动手设计能力,而且还增加了和同学们的关系,一组里面的同学互相帮助,有问题的同学会的同学帮忙讲解,而大家都不会的