TMSF28335程序设计实例解析.docx
《TMSF28335程序设计实例解析.docx》由会员分享,可在线阅读,更多相关《TMSF28335程序设计实例解析.docx(8页珍藏版)》请在冰豆网上搜索。
TMSF28335程序设计实例解析
TMSF28335程序设计实例
实现功能:
AD采样+PI调节+一阶惯性
/*****************headfile********************/
#include"DSP2833x_Device.h"
#include"DSP2833x_Examples.h"
/****************macro*****************/
#defineS1AdcRegs.ADCST.bit.INT_SEQ1
/***************globalvariable************/
floatthis_zl;
floatupon_zl;
intPIn=0;//symbolparameter
intSCn=0;//symbolparameter
floatadclo=0;//ADreferencedvoltage
floatadcres=65536;
floatTa;//一阶系统时间常数
floattemp=0.950213;
intsc_D;
floatmf_scz;
floatmf_sc;//output
unsignedint*Sda;
floatpower_set;
floatpower_get;//actualoutputvoltage
floatKP_wr;//PIproportioncoefficient
floatKI_wr;//PIintegralcoefficient
floaterror_sg;//PIcorrelativeparameter
floaterror_1;
floaterror_2;
/****************function*******************/
interruptvoidcpu_timer0_isr(void;
interruptvoidad_isr(void;
voidInit_Timer0(void;
voidInit_Xintf(void;
voidInit_Gpio(void;//GPIOinitializationprogramvoidInitadc(void;//ADinitialize
floatPI_T(floatpower_sd,floatpow_in;//PIcontrolfunction
voiddelay_ys(void;//delaysubprogram
/***************mainfunction**********************/
voidmain(void
{
unsignedint*Sda=(unsignedint*0x200000;//defineDAaddress,XINTFZone7InitSysCtrl(;//initializesystemsubprogram
Init_Timer0(;
DINT;
InitPieCtrl(;
IER=0x0000;
IFR=0x0000;
InitPieVectTable(;
Init_Gpio(;
Initadc(;
Init_Xintf(;
CpuTimer0Regs.TCR.bit.TIE=1;
EALLOW;//解除寄存器保护
PieVectTable.TINT0=&cpu_timer0_isr;//用CUP_Timer0中断函数入口更新
//PIE向量表
PieVectTable.ADCINT=&ad_isr;//用AD中断函数更新PIE向量表
EDIS;//使能寄存器保护
ConfigCpuTimer(&CpuTimer0,150,500;//timing500us
StartCpuTimer0(;
PieCtrlRegs.PIEIER1.all=0x60;//使能PIE内的CUP_Timer0和AD
//中断
IER|=0x0001;//使能CPUINT1
EINT;
}
*****************CPUtimerinitialization***********************************
voidInit_Timer0(void
{
CpuTimer0Regs.PRD.all=75000;//settimerperiodtiming:
500us
CpuTimer0Regs.TPR.all=0;
CpuTimer0Regs.TPRH.all=0;
//CpuTimer0Regs.TCR.bit.TSS=1;//stoptimer
}
********************A/Dinitialization**********************************
voidInitadc(void
{
longi;//ADinitialize
AdcRegs.ADCTRL1.bit.RESET=1;
for(i=0;i<100;i++{};
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SUSMOD=0;
AdcRegs.ADCTRL1.bit.ACQ_PS=0;//settingsamplewindow
AdcRegs.ADCTRL1.bit.CPS=0;
AdcRegs.ADCTRL1.bit.CONT_RUN=0;//启动-停止模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;//给ADC模块的内部基准电路上电for(i=0;i<400000;i++{};//delaymorethan7ms
AdcRegs.ADCTRL3.bit.ADCPWDN=1;//给ADC模块的其余模拟电路上电for(i=0;i<10000;i++{};//delaymorethan20us
AdcRegs.ADCTRL3.bit.ADCCLKPS=10;
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;//choosesamplestyle
AdcRegs.ADCMAXCONV.all=0x0000;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0000;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位排序器1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//SEQ1interrupt
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;//chooseinterruptstyle
}
*********************externalperipheralsinitialization******************************voidInit_Xintf(void
{
EALLOW;
XintfRegs.XINTCNF2.bit.XTIMCLK=1;
XintfRegs.XTIMING6.bit.XWRLEAD=3;
XintfRegs.XTIMING6.bit.XWRACTIVE=7;
XintfRegs.XTIMING6.bit.XWRTRAIL=3;
XintfRegs.XTIMING6.bit.XRDLEAD=3;
XintfRegs.XTIMING6.bit.XRDACTIVE=7;
XintfRegs.XTIMING6.bit.XRDTRAIL=3;
XintfRegs.XTIMING6.bit.X2TIMING=0;
XintfRegs.XTIMING6.bit.USEREADY=0;
XintfRegs.XTIMING6.bit.XSIZE=3;
EDIS;
}
********************************I/Oinitialization*******************************voidInit_Gpio(void
{
EALLOW;//GPIOinitialize
GpioCtrlRegs.GPBMUX1.all=0xFFFFFC00;//设置B口为地址线以及DAC片选信号GpioCtrlRegs.GPCMUX1.all=0xFFFFFFFF;//setCPortasdateaddress
GpioCtrlRegs.GPAMUX1.all=0x0000;
GpioCtrlRegs.GPADIR.all=0x0003;
GpioDataRegs.GPADAT.all=0x0003;
GpioDataRegs.GPACLEAR.all=0x0003;//chooseGPIO1,2asDAsignaladdressEDIS;
}
****************************PIfunction******************************************portalparameter:
power_sdandpow_in
exportparameter:
this_zl
floatPI_T(floatpower_sd,floatpower_in
{
error_1=error_sg;
error_sg=power_sd-power_in;
error_2=error_sg-error_1;
if(PIn==0
{
error_2=4.0;//avoiderror_2toolarge
PIn++;
}
this_zl=KP_wr*error_sg+KI_wr*error_2;
error_sg=error_1;
returnthis_zl;
}
*******************************Delayfunction***********************************voiddelay_ys(void
{
longi;
for(i=0;i<100000;i++{};
}
*************************timer0interruptdealfunction***********************
interruptvoidcpu_timer0_isr(void
{
DINT;
StopCpuTimer0(;
CpuTimer0Regs.TCR.bit.TIF=1;//清CPU定时器0的中断标志
PieCtrlRegs.PIEACK.all|=0x0001;//使能第一组中断以使AD产生的中断能
//被CPU响应
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//使能排序器,启动AD转换
EINT;
while(S1==0{};//等待AD转换的完成
delay_ys(;
}
************************ADinterruptfunction*********************************
interruptvoidad_isr(void
{
DINT;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
power_get=((floatAdcRegs.ADCRESULT0*3.0/adcres+adclo;//对采样数据进行转换
if(SCn==0
{
mf_scz=2.5;
SCn++;
}
mf_sc=mf_scz;
upon_zl=PI_T(power_get,mf_sc;//调用PI环节的函数
mf_sc=1/Ta*upon_zl*temp;//通过一阶惯性环节的处理
delay_ys(;
mf_scz=mf_sc;
sc_D=(int(mf_sc*4096/5;
*(Sda=sc_D;//写数据到DA的数据线
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
PieCtrlRegs.PIEACK.all|=0x0001;//使能第一组中断
EINT;
StartCpuTimer0(;//启动定时器0,开始下一次采样
}