基于dsp的磁悬浮小灯控制系统本科学位论文.docx
《基于dsp的磁悬浮小灯控制系统本科学位论文.docx》由会员分享,可在线阅读,更多相关《基于dsp的磁悬浮小灯控制系统本科学位论文.docx(19页珍藏版)》请在冰豆网上搜索。
基于dsp的磁悬浮小灯控制系统本科学位论文
摘要
我们组设计的磁悬浮小灯控制系统是基于TMS320F28377sDSP芯片。
本设计采用了上下两个霍尔元件作为感应器,通过DSP中的AD模块去采集这两路信号,然后经过PID控制后把输出通过DSP的DA模块将数据发送到驱动器控制线圈电流大小,以改变磁场来控制灯的位置使其保持悬浮,整个系统够成了一个闭环控制系统,抗干扰能力强,新颖且可广泛于教育领域,增加学生的学习兴趣。
Abstract
关键词:
TMS320F28337SPID控制闭环控制系统
目录
摘要……………………………………………………………………Ⅰ
Abstract………………………………………………………………Ⅰ
引言……………………………………………………………………1
第一章磁悬浮小灯控制系统的结构………………………………1
1.1电源部分…………………………………………………………2
1.2AD转换部分………………………………………………………2
1.3PID部分…………………………………………………………3
1.4DA转换部分………………………………………………………4
1.5驱动器部分………………………………………………………5
第二章程序流程图…………………………………………………6
结论……………………………………………………………………6
致谢……………………………………………………………………6
参考文献………………………………………………………………7
附录……………………………………………………………………8
引言
目前在现实生活中,磁悬浮技术得到了广泛的应用,本设计采用把磁悬浮技术使得小灯并发亮保持悬浮,改变了传统的照明技术,其中也用到了PID闭环控制。
非常新颖,且系统比较稳定,能够很好的应用于教育领域,增加学生的学习兴趣。
对其他领域也有广泛的启发意义。
第一章磁悬浮小灯控制系统的结构
分析仪使用DSP28377S开发平台作为基础。
整个系统可以分成5个部分:
(1)开关电源部分:
给系统提供24V电源。
(2)AD采集部分:
使用TMS320X28377S内部的AD外设,对待测的的霍尔元件两端进行模数转换。
得到数字量表示的电压值。
(3)PID部分:
在DSP中,使用AD模块采集到的外部信号,并转化为数字信号作为PID控制器的反馈信号,然后设定期望值,在DSP中经过数字PID计算后通过DA模块传送给驱动器,从而使得驱动模块能够调整电流的大小,一控制磁场的强度,是灯保持悬浮。
(4)驱动模块部分:
根据DA传送过来的信号输出相应大小电流给线圈。
(5)DA输出部分:
使用TMS320F28377S内部的DA外设,把经过PID计算的输出量传送给外部的驱动器。
磁悬浮小灯控制系统整体结构图,如图1所示。
图1磁悬浮小灯控制系统整体结构图
1.1开关电源部分
设备的电源部分的目的是为了给整个系统体提供24v的电源。
图2系统的电源部分
1.2AD转换部分
1.2.1AD转换
本设计采用TMS320F28377S内部的A/D转换器来采集外部霍尔元件的信号。
TMS320F28377S内部的A/D转换器的特性如下
1.12位或16位的转换精度
2.最高25MHz的转换速度、
3.16路独立通道。
由于控制系统的整体工作频率比这芯片内部25MHz的最高转换速度慢。
为了得到更加精确的转换值,可以采用采集10次数据,讲采集到的数据就行快速排序,去掉采集到系统的最高和最低的值,然后将这8次数据求其平均值。
把这样处理后的结果再当做一次采集的数据。
1.2.2AD转化的实现
1.配置AD转换的时钟信号ADCCLK,系统预分频。
2.配置AD转换的采样模式,本设计才用12位通道,单端模式。
3.配置AD转换的通道以及转换完成后中断标志清零。
1.3PID控制部分
1.3.1PID控制原理
PID控制器是一个在工业控制应用中常见的反馈回路部件。
这个控制器把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。
和其他简单的控制运算不同,PID控制器可以根据历史数据和差别的出现率来调整输入值,这样可以使系统更加准确,更加稳定。
可以通过数学的方法证明,在其他控制方法导致系统有稳定误差或过程反复的情况下,一个PID反馈回路却可以保持系统的稳定。
图3PID控制原理图
1.3.2PID控制的实现
在DSP中,使用AD模块采集到的外部信号,并转化为数字信号作为PID控制器的反馈信号,然后设定期望值,在DSP中经过数字PID计算后通过DA模块传送给驱动器,从而使得驱动模块能够调整电流的大小,一控制磁场的强度,是灯保持悬浮。
1.定义变量
floatek1=0;//偏差e[k-1]
floatKp=-2.2;//定义比例系数
floatKi=0;//定义积分常数
floatKd=-0.03;//定义微分常数
floatdelta=0;//定义误差
floatuk=0;//u[k]
2.采用PD控制实现程序
floatPID(floatek)
{
delta=ek-ek1;
uk=Kp*ek+Kd/T*delta;
ek1=ek;
returnuk;
}
1.4DA部分
1.4.1DA转换
1.4.2DA转换实现
1.5驱动器部分
PID转换结束后,输出的数据就被存放DA_value中,传送给驱动器,
图4驱动器图
第2章程序流程图
磁悬浮小灯系统程序流程图如下:
图5C程序流程图
结论
本设计实现了基于TMS320F28337S的磁悬浮小灯控制系统。
使用了TMS320F28377S内部的ADC、DAC资源,整个实验设计首先通过AD采集外部的信号,然后经过PID计算处理后,再通过DA将数据发送到驱动器控制线圈电流大小,以改变磁场来控制灯的位置使其保持悬浮。
致谢
感
参考文献
[1]TexasInstrumentTMS320F2837xSDelfinoMicrocontrollers[M].LiteratureNumber:
SPRUHX5C,2015
[2]TexasInstruments.UsingPWMOutputasaDigital-to-AnalogConverteronaTMS320F28377DigitalSignalController[M].ApplicationReport:
SPRAA88A,2008
[3]TexasInstruments.
附录
主程序清单:
#include"F28x_Project.h"//DeviceHeaderfileandExamplesIncludeFile
voidConfigureADC(void);
voidSetupADCSoftware(void);
voiderror(void);
unsignedlongAD_UP[10],AD_DOWN[10];
floatoffset=1;////?
?
?
?
floatExp=-1.2;////?
?
?
?
intAD_value;
floatReal;//?
?
?
?
?
?
unsignedlongAD_UP_AVE,AD_DOWN_AVE;
floatek1=0;//?
?
e[k-1]
floatKp=-2.2;//?
?
?
?
?
?
floatKi=0;//?
?
?
?
?
?
floatKd=-0.03;//?
?
?
?
?
?
floatT=0.001;//?
?
?
?
floatsum=0;
floatdelta=0;
floatuk=0;//u[k]
floatabso(floatek)
{
if(ek<0)
{
ek=(0-ek);
}
returnek;
}
floatPID(floatek)
{
delta=ek-ek1;
uk=Kp*ek+Kd/T*delta;
ek1=ek;
returnuk;
}
uint32_tsaturation(uint32_ti)
{
if(i>=65535)
{
i=65535;
}
elseif(i<=0)
{
i=0;
}
returni;
}
voidDAC_send(unsignedcharPassage,unsignedintdat)
{
unsignedchari,mode;
unsignedintj;
switch(Passage)//0x20:
?
?
A0x22:
?
?
B0x24:
?
?
C0x26:
?
?
D...?
?
?
?
?
?
?
?
{
case0:
mode=0x20;
break;
case1:
mode=0x22;
break;
case2:
mode=0x24;
break;
case3:
mode=0x26;
break;
default:
break;
}
for(i=0;i<8;i++)
{
//DA8534_DIN(mode&0x80);
j=mode&0x80;
if(j==0)
{
GpioDataRegs.GPADAT.bit.GPIO16=0;
//ioport_set_pin_level(PIO_PB8_IDX,IOPORT_PIN_LEVEL_LOW);//data=0
}
else
{
GpioDataRegs.GPADAT.bit.GPIO16=1;
//ioport_set_pin_level(PIO_PB8_IDX,IOPORT_PIN_LEVEL_HIGH);//data=1
}
DELAY_US
(2);
GpioDataRegs.GPADAT.bit.GPIO18=1;
//ioport_set_pin_level(PIO_PB10_IDX,IOPORT_PIN_LEVEL_HIGH);//clk=1
DELAY_US
(2);
mode<<=1;
DELAY_US
(2);
GpioDataRegs.GPADAT.bit.GPIO18=0;
//ioport_set_pin_level(PIO_PB10_IDX,IOPORT_PIN_LEVEL_LOW);//clk=0
DELAY_US
(2);
}
for(i=0;i<16;i++)
{
//DA8534_DIN(dat&0x8000);
j=dat&0x8000;
if(j==0)
{
GpioDataRegs.GPADAT.bit.GPIO16=0;
//ioport_set_pin_level(PIO_PB8_IDX,IOPORT_PIN_LEVEL_LOW);//data=0
}
else
{
GpioDataRegs.GPADAT.bit.GPIO16=1;
//ioport_set_pin_level(PIO_PB8_IDX,IOPORT_PIN_LEVEL_HIGH);//data=1
}
DELAY_US
(2);
GpioDataRegs.GPADAT.bit.GPIO18=1;
//ioport_set_pin_level(PIO_PB10_IDX,IOPORT_PIN_LEVEL_HIGH);//clk=1
DELAY_US
(2);
dat<<=1;
DELAY_US
(2);
GpioDataRegs.GPADAT.bit.GPIO18=0;
//ioport_set_pin_level(PIO_PB10_IDX,IOPORT_PIN_LEVEL_LOW);//clk=0
DELAY_US
(2);
}
GpioDataRegs.GPADAT.bit.GPIO19=1;
//ioport_set_pin_level(PIO_PB11_IDX,IOPORT_PIN_LEVEL_HIGH);//cs=1
}
voidquick(unsignedlong*a,inti,intj)
{
intm,n,temp;
intk;
m=i;
n=j;
k=a[(i+j)/2];
do{
while(a[m]while(a[n]>k&&n>i)n--;
if(m<=n){
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}while(m<=n);
if(mif(n>i)quick(a,i,n);
}
__interruptvoidcpu_timer0_isr(void)
{
unsignedlongi;
floatek=0;
floatOutput;//?
?
unsignedlongDA_value;
CpuTimer0.InterruptCount++;
GpioDataRegs.GPADAT.bit.GPIO12=1;//turnonled
AD_UP_AVE=0;
AD_DOWN_AVE=0;
for(i=0;i<10;i++)//ADsample10times
{
//convert,waitforcompletion,andstoreresults
//startconversionsimmediatelyviasoftware,ADCA
AdcaRegs.ADCSOCFRC1.all=0x0003;//SOC0andSOC1
//startconversionsimmediatelyviasoftware,ADCB
//waitforADCAtocomplete,thenacknowledgeflag
while(AdcaRegs.ADCINTFLG.bit.ADCINT1==0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;
AD_UP[i]=AdcaResultRegs.ADCRESULT0;
AD_DOWN[i]=AdcaResultRegs.ADCRESULT1;
}
quick(AD_UP,0,9);//sort
quick(AD_DOWN,0,9);
AD_UP[0]=0;//deletemaximun&minimun
AD_UP[9]=0;
AD_DOWN[0]=0;
AD_DOWN[9]=0;
for(i=0;i<10;i++)
{
AD_UP_AVE+=AD_UP[i];
AD_DOWN_AVE+=AD_DOWN[i];
}
AD_value=(int)(((float)(AD_DOWN_AVE)-(AD_UP_AVE))/8.0);
Real=AD_value/1000.0;//calculateRealassuspensionpositionoftheplant
ek=Exp-Real;//ekissuspensionpositionerror
Output=PID(ek)+offset;
DA_value=(unsignedlong)(Output*65535/5.0);//convertOutputtoDA_valueforDACmodule
DA_value=saturation(DA_value);//outputsaturation
DAC_send(0,DA_value);//usingDAtosendDA_valuetoDACmodule
GpioDataRegs.GPADAT.bit.GPIO12=0;//turnoffled
//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup1
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
}
//variablestostoreconversionresults
Uint16AdcaResult0;
Uint16AdcaResult1;
Uint16sdata=0x0000;//senddata
Uint16rdata;//receiveddata
voidmain(void)
{
//Step1.InitializeSystemControl:
//PLL,WatchDog,enablePeripheralClocks
//ThisexamplefunctionisfoundintheF2837xS_SysCtrl.cfile.
InitSysCtrl();
//Step2.InitializeGPIO:
//ThisexamplefunctionisfoundintheF2837xS_Gpio.cfileand
//illustrateshowtosettheGPIOtoit'sdefaultstate.
InitGpio();
//InitSpiaGpio();
//Step3.ClearallinterruptsandinitializePIEvectortable:
//DisableCPUinterrupts
DINT;
//InitializethePIEcontrolregisterstotheirdefaultstate.
//ThedefaultstateisallPIEinterruptsdisabledandflags
//arecleared.
InitPieCtrl();
//DisableCPUinterruptsandclearallCPUinterruptflags:
IER=0x0000;
IFR=0x0000;
//InitializethePIEvectortablewithpointerstotheshellInterrupt
//ServiceRoutines(ISR).
InitPieVectTable();
//Interruptsthatareusedinthisexamplearere-mappedto
//ISRfunctionsfoundwithinthisfile.
EALLOW;//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.TIMER0_INT=&cpu_timer0_isr;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
//Step4.InitializetheDevicePeripheral.Thisfunctioncanbe
//foundinF2837xS_CpuTimers.c
InitCpuTimers();//Forthisexample,onlyinitializetheCpuTimers
ConfigCpuTimer(&CpuTimer0,200,500);
CpuTimer0Regs.TCR.all=0x4000;//Usewrite-onlyinstructiontosetTSSbit
//Step5.Userspecificcode,enableinterrupts:
//EnableTINT0inthePIE:
Group1interrupt7
PieCtrlRegs.PIEIER1.bit.INTx7=1;
//ConfiguretheADCsandpowerthemup
ConfigureADC();
//SetuptheADCsforsoftwareconversions
SetupADCSoftware();
IER|=M_INT1;
//EnableglobalInterruptsandhigherpriorityreal-timedebugevents:
EINT;//EnableGlobalinterruptINTM
ERTM;//EnableGlobalrealtimeinterruptDBGM
//Step6.IDLEloop.Justsitandloopforever(optional):
while
(1)
{
}
}
//WriteADCconfigurationsandpoweruptheADCforbothADCAandADCB
voidConfigureADC(void)
{
EALLOW;
//writeconfigurations
AdcaRegs.ADCCTL2.bit.PRESCALE=6;//setADCCLKdividerto/4
//AdcbRegs.ADCCTL2.bit.PRESCALE=6;//setADCCLKdividerto/4
AdcSetMode(ADC_ADCA,ADC_RESOLUTION_12BIT,ADC_SIGNALMODE_SINGLE);
//AdcSetMode(ADC_ADCB,ADC_RESOLUTION_12BIT,ADC_SIGNALMODE_SINGLE);
//Setpulsepositionstolate
AdcaRegs.ADC