直流无刷电机控制综合实验概要.docx
- 文档编号:23142224
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:23
- 大小:307.85KB
直流无刷电机控制综合实验概要.docx
《直流无刷电机控制综合实验概要.docx》由会员分享,可在线阅读,更多相关《直流无刷电机控制综合实验概要.docx(23页珍藏版)》请在冰豆网上搜索。
直流无刷电机控制综合实验概要
东南大学自动化学院
实验报告
课程名称:
DSP原理及C程序开发
实验名称:
直流无刷电机控制综合实验
院(系):
自动化学院专业:
自动化
姓名:
杨明亮学号:
08009117
实验室:
实验组别:
同组人员:
实验时间:
2012年5月20日
评定成绩:
审阅教师:
直流无刷电机综合控制实验
一、实验目的
利用F28335核心板与ICETEK-MOTOR-E运动控制板,实现直流无刷电机的驱动与转速控制,利用小键盘或电位器对直流无刷电机进行转速调节,并利用液晶屏显示转速等状态信息。
二、实验要求
1.基本功能
①掌握F28335核心板与ICETEK-MOTOR-E运动控制板的使用方法,接线正确,能捕获并证实霍尔传感器状态变化规律(表1);
②能正确总结出正/反转控制表(表2),从而控制电机正转/反转;
③能通过修改占空比,用示波器观察pwm口输出波形的变化。
2.提高功能
①能通过阅读学习“ICETEK-Motor-E使用说明书.pdf”,发现ICETEK-MOTOR-E运动控制板中的电位器信号,编制程序从DSP相应的ADC输入端口采集该电位器信号,能用CCS图形显示AD变换结果曲线;
②能编制程序,利用AD变换结果调节PWM占空比,从而对直流无刷电机进行调速;
③能设计基本的人机接口软件,即编制程序,利用小键盘进行正转、反转、停止功能选择,利用液晶屏显示(示意)正转、反转、停止等状态信息,并可自行扩展其它辅助功能。
三、实验原理
1.直流无刷电动机
ICETEK-F2812-BCM实验箱采用的直流无刷电机是三相方波控制型直流无刷电机(BLDCM),如果按照一定顺序给电机的各相通入方波即可使电机转动,转动的速度及力矩与通入电机定子绕组的电压、电流成正比关系。
2.电机驱动与控制
通过ICETEK-F2812-BCM实验箱,ICETEK-F2812-A板与电机驱动板及直流无刷电机连接,通过编程,TMS320F2812输出的控制信号能够控制电机转动。
具体控制信号连接如下所示:
电机驱动模块的内部结构如下所示:
各PWM管脚按如下顺序完成信号的输出可使电机转动:
其中,PWM代表输出一定占空比的PWM波,0常关或强制低,1常开或强制高。
PhaseA、PhaseB和PhaseC的相应输出为:
PWM1-6控制:
如果要电机转动则连接电机的PhaseA、PhaseB和PhaseC的输出需要满足上面图2-2给出的波形,每相电压在±24V之间变动并满足上述时序关系。
而要实现这一输出,需要在PWM1-6管脚上输出满足上面图描述的波形和时序关系。
3.D4、D5、D6的变化顺序决定电机正反转。
D6D5D4正转(俯视电机主轴,顺时针转动)
100
101
001
011
010
110
D6D5D4反转(俯视电机主轴,逆时针转动)
100
110
010
011
001
101
转速控制:
如上所述,电机转动需要安装一定频率送状态0-5控制字,而送电机控制信号的速度(频率)则在一定程度上决定了电机转速,0-5各状态切换得快,则电机可以快些运行。
但还有一个因素,即送电机输出的电流,送给电机定子的三相绕组的电流直接决定了电机转子能产生多大的转矩。
当控制状态由一种切换到下一种时,电流发生的力矩是否能让转子转动到位,这决定了电机在下一个状态电流到来时是否能顺利转动下去。
如果电流弱,不足以使转子转动到位,电机将“失步”或根本无法转动;如果电流过大,在下一个状态到来前早就到位,电机转子将在当前电流控制下在此位置“刹车”,如果在惯性的驱动下稍微转动过位时,就会反向转回来,导致电机转子在运行时会产生不同程度的震动,甚至电机绕组发热。
由此,我们需要选择好电机状态切换的频率,也要控制好送电机驱动信号的电流大小,亦即控制好切换PWM控制字的频率。
四、实验内容及结果
1、插好电机驱动板,连接好霍尔传感器接头,先不连接驱动电源和电机的abc三项电源,给dsp试验板上电,则霍尔传感器即可工作。
手动转动电机,电机不加电,观察正转和反转时指示灯D4、D5、D6等的变化顺序。
(1)先进行霍尔传感器的状态读入测试,在工程管理器的include下面找到build.h文件,将编译开关#defineBUILDLEVELLEVEL?
的设置设为LEVEL0,然后编译程序、运行程序测试。
注意在中断服务程序的LEVEL0处理分支下,使用变量nNowStatus给pwm指针赋值。
程序生成PWM的原理参见“准备实验2”:
pwm1.CmtnPointer=nNowStatus;//0-5
pwm1.DutyFunc=(int16)rmp2.Out;
pwm1.update(&pwm1);
在变量观察窗口中改变nNowStatus的值(0-5之间),在变量观察窗口里观察变量hallcap的变化。
观察指示灯的状态和hallcap的数值的变化对应关系,总结出指示灯和霍尔传感器读入的状态的对应关系,然后总结出正转hallcap的变化顺序,和反转时的变化顺序。
D6D5D4正转(俯视电机主轴,顺时针转动)
100
101
001
011
010
110
D6D5D4反转(俯视电机主轴,逆时针转动)
100
110
010
011
001
101
(2)总结对应关系填写下表,:
俯视电机主轴,顺时针转动.(D6~D4灯亮为1,灭为0)
表1正转关系
nNowStatus
Hallcap
对应捕获端口数据
D6
D5
D4
0
4
1
0
0
1
5
1
0
1
2
1
0
0
1
3
3
0
1
1
4
2
0
1
0
5
6
1
1
0
2.根据捕获状态驱动电机运转
(1)目的:
在程序中添加内容完成使电机正/反方向转动。
(2)分析:
根据实验原理,我们只需要控制送给PWM波形发生模块pwm1的状态输入顺序即可改变电机转动方向。
根据准备实验1中总结出的正反转顺序可知,如果当前电机锁定状态为5状态,欲正转,则电机须锁定到1状态,所以pwm.Cmtnpointer赋值为2,若想反转,则电机须锁定到4状态,所以pwm指针赋值为0。
因此得出正反转数组下标(下标为当前霍尔传感器读入状态,数组值为向下一状态转动pwm所赋数值),与pwm指针对应数组为:
表2正/反转控制表
转向
正
反
正
反
正
反
正
反
正
反
正
反
霍尔状态
1
2
3
4
5
6
Pwm指针
4
1
0
3
5
2
2
5
3
0
1
4
(3)修改程序:
以上表为参考修改BLDCMControl.c程序中的相关变量定义:
Uint16fanzhuan[6]={1,3,2,5,0,4};
Uint16zhengzhuan[6]={4,0,5,2,3,1};
//注意BLDCMControl.c中的代码,并尝试让电机反转。
nISRWork1=(int16)hall1.HallGpio;
bISRWork=(nISRWork1>0&&nISRWork1<7)?
(1):
(0);
if(bISRWork)
{
nNowStatus=zhengzhuan[nISRWork1-1];//正转
nNowStatus=fanzhuan[nISRWork1-1];//反转
//补充代码,以nISRWork1为索引,查找表zhengzhuan或fanzhuan,并将值赋给nNowStatus
}
3.能通过修改PWM的周期,即改变pwm1.DutyFunc的值来调速,并用示波器观察pwm口输出波形的变化。
4.能通过阅读学习“ICETEK-Motor-E使用说明书.pdf”,发现ICETEK-MOTOR-E运动控制板中的电位器信号,编制程序从DSP相应的ADC输入端口采集该电位器信号,能用CCS图形显示AD变换结果曲线;
5.能编制程序,利用AD变换结果调节PWM占空比,从而对直流无刷电机进行调速;
6.设计基本的人机接口软件,即编制程序,利用小键盘进行正转、反转、停止功能选择,利用液晶屏显示(示意)正转、反转、停止等状态信息,并可自行扩展其它辅助功能。
按“1”电机正转,第一行显示速度值,第二行显示状态,“1”表示正转
按“2”电机正转,第一行显示速度值,第二行显示状态,“2”表示反转
按“3”电机停转,第一行显示速度值为,第二行显示状态,“0”表示停转
五、实验程序
主要代码:
1.main函数
voidmain(void)
{
//*************************************************************************
#if(DSP_TARGET==F28335)
InitSysCtrl();
InitXintf16Gpio();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;
EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters
SysCtrlRegs.HISPCP.all=0x0000;//SYSCLKOUT/1
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
//DisableandclearallCPUinterrupts:
DINT;
IER=0x0000;
IFR=0x0000;
nISRWork1=0;
InitPieCtrl();
InitPieVectTable();
InitCpuTimers();
ConfigCpuTimer(&CpuTimer0,100,SYSTEM_FREQUENCY*10/ISR_FREQUENCY);
StartCpuTimer0();
EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.TINT0=&MainISR;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
PieCtrlRegs.PIEIER1.all=M_INT7;
IER|=M_INT1;
#endif
//*************************************************************************
//InitializePWMmodule
pwm1.PeriodMax=(SYSTEM_FREQUENCY/PWM_FREQUENCY)*1000;//AsymmetricPWM
pwm1.DutyFunc=DFuncDesired;//DutyFunc=Q15
pwm1.init(&pwm1);
//InitializeDATALOGmodule
dlog.iptr1=&DlogCh1;
dlog.iptr2=&DlogCh2;
dlog.iptr3=&DlogCh3;
dlog.iptr4=&DlogCh4;
dlog.trig_value=0x01;
dlog.size=0x400;
dlog.prescalar=1;
dlog.init(&dlog);
//InitializeADCmodule
adc1.ChSelect=0x7777;//6543;//forDMC1500andeZdsp2812/eZdsp2808boards
adc1.init(&adc1);
//Initializeenabledrivemodule
//drv1.init(&drv1);
//InitializetheSPEED_PRmodule(150MHz,N=1eventperiod/rev)
speed1.InputSelect=0;
speed1.BaseRpm=120*(BASE_FREQ/P);
speed1.SpeedScaler=(Uint32)(ISR_FREQUENCY/(1*BASE_FREQ*0.001));
//InitializeRMPCNTLmodule
rc1.RampDelayMax=20;
rc1.RampLowLimit=_IQ(0);
rc1.RampHighLimit=_IQ
(1);
//InitializeHallmodule
hall1.DebounceAmount=5;
hall1.Revolutions=-10;
hall1.init(&hall1);
//InitializeRMP2module
rmp2.Out=(int32)DFuncDesired;
rmp2.Ramp2Delay=0x00000050;
rmp2.Ramp2Max=0x00007FFF;
rmp2.Ramp2Min=0x0000000F;
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
//*****************************************************************************
CTRGR=0x80;//初始化ICETEK-CTR
CTRGR=0x0;
CTRGR=0x80;
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
CTRLR=0xc1;
uPort8000=CTRLCDCR;//清键盘缓冲区
TurnOnLCD();//打开显示
LCDCLS();//清除显示内存
for(nCount=0;nCount<8;nCount++)
{
ledbuf[nCount]=0x0ff;//显示为空白
ledx[nCount]=(nCount<<4);//生成显示列控制字
}
control=0;
nSpeed=0;
direction=0;
DFuncDesired=0;
h=0;
RefreshLEDArray();
nCount=nCursorCount=0;
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
cKey=0;cOldKey=0;
//*****************************************************************************
for(;;)
{
nScanCode=CTRLCDCMDR;
nScanCode&=0x0ff;
uPort8000=CTRLCDCR;
if(nScanCode!
=0)
{
cKey=nScanCode;
/*在此编程*/
if(cKey!
=cOldKey){
//readKey=ConvertScanToChar(nScanCode);
switch(cKey){
case1:
direction=1;break;
case2:
direction=2;break;
case3:
direction=0;break;
}
}
}
CTRLCDCMDR=LCDCMDPAGE;//设置操作页=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
if(direction!
=0)
tempSpeed=lnADCValues;
else
tempSpeed=0;
sx0=tempSpeed/1000%10;
sx1=tempSpeed/100%10;
sx2=tempSpeed/10%10;
sx3=tempSpeed%10;
for(i=0;i<8;i++)
{
CTRLCDLCR=ledkey[sx0][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
for(i=0;i<8;i++)
{
CTRLCDLCR=ledkey[sx1][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
for(i=0;i<8;i++)
{
CTRLCDLCR=ledkey[sx2][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
for(i=0;i<8;i++)
{
CTRLCDLCR=ledkey[sx3][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDPAGE+1;//设置操作页=0显示电机转的方向
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS;//起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for(i=0;i<8;i++)
{
CTRLCDLCR=ledkey[direction][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
}
2.定时中断
interruptvoidMainISR(void)
{
#if(BUILDLEVEL==LEVEL0)
rmp2.DesiredInput=(int32)DFuncDesired;
rmp2.calc(&rmp2);
hall1.read(&hall1);
hallcap=hall1.HallGpio;
i=0;
pwm1.CmtnPointer=nNowStatus;//0-5
pwm1.DutyFunc=(int16)rmp2.Out;
pwm1.update(&pwm1);
#endif//(BUILDLEVEL==LEVEL0)
//********************************************************************
#if(BUILDLEVEL==LEVEL1)
#endif//(BUILDLEVEL==LEVEL1)
//**********************************************************************
#if(BUILDLEVEL==LEVEL2)
adc1.read(&adc1);
lnADCValues=adc1.Ch1Out;
lnADCValues+=adc1.Ch2Out;
lnADCValues+=adc1.Ch3Out;
lnADCValues+=adc1.Ch4Out;
lnADCValues/=4;
SampleTable[array_index++]=lnADCValues;
if(array_index==1024)
{
array_index=0;
}
lnADCValues=(lnADCValues-2150)*10;
if(lnADCValues<100)lnADCValues=0;
hall1.HallMapPointer=(int16)mod1.Counter;
hall1.read(&hall1);
mod1.TrigInput=(int32)hall1.CmtnTrigHall;
mod1.Counter=(int32)hall1.HallMapPointer;
mod1.calc(&mod1);
rmp2.DesiredInput=(int32)DFuncDesired;
rmp2.calc(&rmp2);
nISRWork1=(int16)hall1.HallGpio;
bISRWork=(nISRWork1>0&&nISRWork1<7)?
(1):
(0);
if(bISRWork)
{
if(direction==1)
nNowStatus=zhengzhuan[nISRWork1-1];
elseif(direction==2)
nNowStatus=fanzhuan[nISRWork1-1];
}
if(bISRWork)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 直流 电机 控制 综合 实验 概要