基于dsp的磁悬浮小灯控制系统本科学位论文.docx

上传人:b****8 文档编号:10646129 上传时间:2023-02-22 格式:DOCX 页数:19 大小:146.07KB
下载 相关 举报
基于dsp的磁悬浮小灯控制系统本科学位论文.docx_第1页
第1页 / 共19页
基于dsp的磁悬浮小灯控制系统本科学位论文.docx_第2页
第2页 / 共19页
基于dsp的磁悬浮小灯控制系统本科学位论文.docx_第3页
第3页 / 共19页
基于dsp的磁悬浮小灯控制系统本科学位论文.docx_第4页
第4页 / 共19页
基于dsp的磁悬浮小灯控制系统本科学位论文.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于dsp的磁悬浮小灯控制系统本科学位论文.docx

《基于dsp的磁悬浮小灯控制系统本科学位论文.docx》由会员分享,可在线阅读,更多相关《基于dsp的磁悬浮小灯控制系统本科学位论文.docx(19页珍藏版)》请在冰豆网上搜索。

基于dsp的磁悬浮小灯控制系统本科学位论文.docx

基于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(m

if(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1