最新实验406DSP直流电机控制实验精品版Word文档下载推荐.docx
《最新实验406DSP直流电机控制实验精品版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新实验406DSP直流电机控制实验精品版Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
Φ为每极磁通量;
K为电动机结构参数。
所以直流电动机的转速控制方法可分为两类:
对励磁磁通进行控制的励磁控制法和对电枢电压进行控制的电枢控制法。
其中励磁控制法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少。
现在,大多数应用场合都使用电枢控制法。
绝大多数直流电机采用开关驱动方式。
开关驱动方式是使半导体功率器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。
上图是利用开关管对直流电动机进行PWM调速控制的原理图和输入输出电压波形。
图中,
当开关管MOSFET的栅极输入高电平时,开关管导通,直流电动机电枢绕组两端有电压Us。
t1秒后,栅极输入变为低电平,开关管截止,电动机电枢两端电压为0。
t2秒后,栅极输入重
新变为高电平,开关管的动作重复前面的过程。
这样,对应着输入的电平高低,直流电动机电
枢绕组两端的电压波形如图中所示。
电动机的电枢绕组两端的电压平均值Uo为
SS
S
OUU
T
t
tt
tU
U==α
+
=1
12
10
式中α为占空比,α=t1/T
占空比α表示了在一个周期T里,开关管导通的时间与周期的比值。
α的变化范围为0
≤α≤1。
由此式可知,当电源电压Us不变的情况下,电枢的端电压的平均值Uo取决于占
空比α的大小,改变α值就可以改变端电压的平均值,从而达到调速的目的,这就是PWM
调速原理。
PWM调速方法:
在PWM调速时,占空比α是一个重要参数。
以下3种方法都可以改变占空比的值:
(1)定宽调频法:
这种方法是保持t1不变,只改变t2,这样使周期T(或频率)也随之改变。
(2)调宽调频法:
这种方法是保持t2不变,只改变t1,这样使周期T(或频率)也随之改变。
(3)定频调宽法:
这种方法是使周期T(或频率)保持不变,而改变t1和t2。
前两种方法由于在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的
固有频率接近时,将会引起震荡,因此这两种方法用得很少。
目前,在直流电动机的控制中,
主要使用定频调宽法
图中PWM输入对应ICETEK–F2812-A评估板上P4外扩插座第26引脚的PWM11信
号,DSP将在此引脚上给出PWM信号用来控制直流电机的转速;
图中的DIR输入对应
ICETEK–F2812-A评估板上P1外扩插座第6引脚的P4信号,DSP将在此引脚上给出高电
平或低电平来控制直流电机的方向。
从DSP输出的PWM信号和转向信号先经过2个与门和
1个非门再与各个开关管的栅极相连。
控制原理
当电动机要求正转时,PWM11给出高电平信号,该信号分成3路:
第1路接与门Y1
的输入端,使与门Y1的输出由PWM决定,所以开关管V1栅极受PWM控制;
第2路直接
与开关管V4的栅极相连,使V4导通;
第3路经非门F1连接到与门Y2的输入端,使与门
Y2输出为0,这样使开关管V3截止;
从非门F1输出的另一路与开关管V2的栅极相连,其
低电平信号也使V2截止。
同样,当电动机要求反转时,PWM5给出低电平信号,经过2个与门和1个非门组成的
逻辑电路后,使开关管V3受PWM信号控制,V2导通,V1、V4全部截止。
4.程序编制
程序中采用定时器中断产生固定频率的PWM波,在每个中断中根据当前占空比判断应
输出波形的高低电平。
主程序用轮询方式读入键盘输入,得到转速和方向控制命令。
在改变电机方向时为减少电压和电流的波动采用先减速再反转的控制顺序。
实验设计及调试:
(1)对实验内容和实验原理进行分析,理出完成实验的设计思路。
通过C语言编程改变pwm波的占空比,将此pwm波从I/O口输出到直流电动机,从而改变其转速,通过引脚上给出高电平或低电平和逻辑电路来控制直流电机的方向。
(2)列出设计所需的特殊环节…
1.pwm初始化
2.电机使能
3.键盘实时监测
4.中断调用
(3)画出设计流程图。
(4)调试程序
#include"
DSP281x_Device.h"
//DSP281xHeaderfileIncludeFile
DSP281x_Examples.h"
//DSP281xExamplesIncludeFile
//Prototypestatementsforfunctionsfoundwithinthisfile.
interruptvoidcpu_timer0_isr(void);
voidDelay(unsignedintnTime);
voidGpio_select(void);
voiderror(int);
voidprogram_stop();
voidGpio_PortA(void);
voidGpio_PortB(void);
voidGpio_PortF(void);
voidGpio_PortDEG(void);
charConvertScanToChar(unsignedcharcScanCode);
voidRefreshLEDArray();
//刷新显示
voidSetLEDArray(intnNumber);
//修改显示内容
#defineT46uS0x0d40
#defineSCANCODE_00x70
#defineSCANCODE_10x69
#defineSCANCODE_20x72
#defineSCANCODE_30x7A
#defineSCANCODE_40x6B
#defineSCANCODE_50x73
#defineSCANCODE_60x74
#defineSCANCODE_70x6C
#defineSCANCODE_80x75
#defineSCANCODE_90x7D
#defineSCANCODE_Del0x49
#defineSCANCODE_Enter0x5A
#defineSCANCODE_Plus0x79
#defineSCANCODE_Minus0x7B
#defineSCANCODE_Mult0x7C
#defineSCANCODE_Divid0x4A
#defineSCANCODE_Num0x77
#defineCTRGR*(int*)0x108000
#defineCTRLCDCMDR*(int*)0x108001
#defineCTRKEY*(int*)0x108001
#defineCTRLCDCR*(int*)0x108002
#defineCTRCLKEY*(int*)0x108002
#defineCTRLCDLCR*(int*)0x108003
#defineCTRLCDRCR*(int*)0x108004
#defineCTRLA*(int*)0x108005
#defineCTRLR*(int*)0x108007
Uint16var1=0;
Uint16var2=0;
Uint16var3=0;
Uint16test_count=0;
Uint16Test_flag=0;
Uint16Test_var=0;
Uint16Test_status[32];
Uint16PASS_flag=0;
unsignedintuWork;
intjishu=0;
unsignedintuWork,nCount=0,uN,uN1,nCount1,nDir;
unsignedintuPort8000;
unsignedintnScreenBuffer[1024];
unsignedcharledbuf[8],ledx[8];
unsignedcharledkey[10][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}
};
voidmain(void)
{
//intnCount=0;
charcKey,cOldKey;
unsignedintnScanCode,nKeyCode;
unsignedintnSpeed;
//Step1.InitializeSystemControl:
//PLL,WatchDog,enablePeripheralClocks
//ThisexamplefunctionisfoundintheDSP281x_SysCtrl.cfile.
InitSysCtrl();
//Step2.InitalizeGPIO:
//ThisexamplefunctionisfoundintheDSP281x_Gpio.cfileand
//illustrateshowtosettheGPIOtoit'
sdefaultstate.
//InitGpio();
//Skippedforthisexample
//Step3.ClearallinterruptsandinitializePIEvectortable:
//DisableCPUinterrupts
DINT;
//InitializethePIEcontrolregisterstotheirdefaultstate.
//ThedefaultstateisallPIEinterruptsdisabledandflags
//arecleared.
//ThisfunctionisfoundintheDSP281x_PieCtrl.cfile.
InitPieCtrl();
StopCpuTimer0();
//DisableCPUinterruptsandclearallCPUinterruptflags:
IER=0x0000;
IFR=0x0000;
//InitializethePIEvectortablewithpointerstotheshellInterrupt
//ServiceRoutines(ISR).
//Thiswillpopulatetheentiretable,eveniftheinterrupt
//isnotusedinthisexample.Thisisusefulfordebugpurposes.
//TheshellISRroutinesarefoundinDSP281x_DefaultIsr.c.
//ThisfunctionisfoundinDSP281x_PieVect.c.
InitPieVectTable();
//Interruptsthatareusedinthisexamplearere-mappedto
//ISRfunctionsfoundwithinthisfile.
EALLOW;
//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.TINT0=&
cpu_timer0_isr;
EDIS;
//ThisisneededtodisablewritetoEALLOWprotectedregisters
//Step4.InitializealltheDevicePeripherals:
//ThisfunctionisfoundinDSP281x_InitPeripherals.c
//InitPeripherals();
//Notrequiredforthisexample
/////InitCpuTimers();
//Forthisexample,onlyinitializetheCpuTimers
CpuTimer0.RegsAddr=&
CpuTimer0Regs;
//Initializetimerperiodtomaximum:
//CpuTimer0Regs.PRD.all=music[nCount][0]*450;
CpuTimer0Regs.PRD.all=0x3000;
//Initializepre-scalecountertodivideby1(SYSCLKOUT):
CpuTimer0Regs.TPR.all=0;
CpuTimer0Regs.TIM.all=0;
CpuTimer0Regs.TPRH.all=0;
//Makesuretimerisstopped:
CpuTimer0Regs.TCR.bit.TSS=1;
CpuTimer0Regs.TCR.bit.SOFT=1;
CpuTimer0Regs.TCR.bit.FREE=1;
//Reloadallcounterregisterwithperiodvalue:
CpuTimer0Regs.TCR.bit.TRB=1;
CpuTimer0Regs.TCR.bit.TIE=1;
//Resetinterruptcounters:
CpuTimer0.InterruptCount=0;
//Step5.Userspecificcode,enableinterrupts:
//EnableCPUINT1whichisconnectedtoCPU-Timer0:
IER|=M_INT1;
//EnableTINT0inthePIE:
Group1interrupt7
PieCtrlRegs.PIEIER1.bit.INTx7=1;
//EnableglobalInterruptsandhigherpriorityreal-timedebugevents:
EINT;
//EnableGlobalinterruptINTM
ERTM;
//EnableGlobalrealtimeinterruptDBGM
CTRGR=0x80;
//初始化ICETEK-CTR
CTRGR=0x0;
CTRLR=0;
//关闭东西方向的交通灯
CTRLR=0x40;
//关闭南北方向的交通灯
CTRLR=0xC0;
CTRGR=0x81;
uPort8000=CTRCLKEY;
Gpio_PortA();
Gpio_PortB();
nSpeed=T46uS;
uN=60;
nCount=nCount1=0;
nDir=0;
cKey=cOldKey=0;
StartCpuTimer0();
//启动定时器
while
(1)
{
nScanCode=*(int*)0x108001;
//读扫描码
nScanCode&
=0x0ff;
//低8位
uPort8000=*(int*)0x108002;
//Delay(5);
if(nScanCode!
=0)
{
if(nScanCode==9)break;
else
{
cKey=nScanCode;
if(cKey!
=0&
&
cOldKey!
=cKey)
{
cOldKey=cKey;
switch(cKey)
{
case1:
uN=10;
break;
case2:
uN=50;
case3:
case4:
uN=70;
case5:
uN=80;
case6:
uN=100;
case7:
uN1=uN;
uN=60;
//降速
Delay(128);
GpioDataRegs.GPADAT.bit.GPIOA4=1;
////CpuTimer0Regs.PRD.all=nSpeed;
//CpuTimer0Regs.PRD.all=182*50;
nDir=0;
Delay(128);
uN=uN1;
break;
case8:
GpioDataRegs.GPADAT.bit.GPIOA4=0;
Delay(128);
//CpuTimer0Regs.PRD.all=nSpeed;
nDir=1;
}
}
}
}
//Delay(4);
}
CTRGR=0;
}
interruptvoidcpu_timer0_isr(void)
CpuTimer0.InterruptCount++;
//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
CpuTimer0Regs.TCR.bit.TIF=1;
GpioDataRegs.GPBSET.bit.GPIOB4=1;
GpioDataRegs.GPBDAT.bit.GPIOB4=(nCount1<
uN)?
1:
0;
nCount1++;
nCount1%=100;
}
voidDelay(unsignedintnDelay)
intii,jj,kk=0;
for(ii=0;
ii<
nDelay;
ii++)
for(jj=0;
jj<
64;
jj++)
{
//RefreshLEDArray();
kk++;
}
voidRefreshLEDArray()
inti;
for(i=0;
i<
8;
i++)
CTRGR=ledx[i];
CTRLA=ledbuf[i];
voidGpio_PortA(void)
//GPIOTest#2:
//ConfigureUpper8bitsofPortasinputsandlower8bitsasoutputs
//Loopbackbits[7:
0]tobits[15:
8]
//Don'
tsetanyinputqualifier
var1=0x0000;
//setsGPIOMuxsasI/Os
var2=0x00FF;
//setsGPIO15-8DIRasinputs,7-0DIRasoutputs
var3=0x0000;
//Don'
Gpio_select();
test_count=