TMSF28335程序设计实例解析.docx
《TMSF28335程序设计实例解析.docx》由会员分享,可在线阅读,更多相关《TMSF28335程序设计实例解析.docx(9页珍藏版)》请在冰豆网上搜索。
TMSF28335程序设计实例解析
TMSF28335程序设计实例
实现功能:
AD采样+PI调节+一阶惯性
headfile
#include"DSP2833x_Device.h"
#include"DSP2833x_Examples.h"
macro
#defineS1AdcRegs.ADCST.bit.lNT_SEQ1
/***************globa|variablefloatthis_zl;
floatupon_zl;
intPln=0;//symbolparameter
intSCn=0;//symbolparameter
floatadclo=0;//ADrefereneedvoltage
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_timerO_isr(void;
interruptvoidad_isr(void;
voidInit_TimerO(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」sr;//用AD中断函数更新PIE向量表
EDIS;//使能寄存器保护
ConfigCpuTimer(&CpuTimer0,150,500;//timing500us
StartCpuTimer0(;
PieCtrlRegs.PIEIER1.all=0x60;〃使能PIE内的CUP_TimerO和AD
〃中断
IER|=OxOOO1;//使能CPUINT1
EINT;
}
*****************
CPUtimer
initialization
***********************************
voidInit_Timer0(void
{
CpuTimer0Regs.PRD.all=75000;//settimerperiodtiming:
500us
CpuTimerORegs.TPR.all=O;
CpuTimerORegs.TPRH.all=O;
〃CpuTimer0Regs.TCR.bit.TSS=1;//stoptimer
}
********************A/D
|;re*;n**********************************
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.lNT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位排序器1
AdcRegs.ADCTRL2.bit.lNT_ENA_SEQ仁1;//SEQ1interrupt
AdcRegs.ADCTRL2.bit.lNT_M0D_SEQ仁0;//chooseinterruptstyle
*********************externalperipherals
initialization
******************************
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;
******************************
initialization*******************************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,2asDAsignaladdress
EDIS;
PI
function
******************************************
portalparameter:
power_sd
****************************
andpow_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(Pln==0
{
error_2=4.0;//avoiderror_2toolarge
Pin++;
this_zl=KP_wr*error_sg+Kl_wr*error_2;
error_sg=error_1;
returnthis_zl;
Delay
function
***********************************
voiddelay_ys(void
longi;
for(i=0;i<100000;i++{};
***********************
**timer0interruptdeal
function
***********************
*******************************
interruptvoidcpu_timer0_isr(void
{
DINT;
StopCpuTimerO(;
CpuTimerORegs.TCR.bit.TIF=1;〃清CPU定时器0的中断标志
PieCtrIRegs.PIEACK.all|=OxOOO1;〃使能第一组中断以使AD产生的中断能
//被CPU响应
AdcRegs.ADCTRL2.bit.SOC_SEQ仁1;〃使能排序器,启动AD转换
EINT;
while(S仁=0{};//等待AD转换的完成
delay_ys(;
}
***********************
*ADinterrupt
function
*********************************
interruptvoidad_isr(void
{
DINT;
AdcRegs.ADCTRL2.bit.RST_SEQ仁1;
power_get=((floatAdcRegs.ADCRESULT0*3.0/adcres+adclo;//X寸采样数据进行
转换
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.lNT_SEQ1_CLR=1;
PieCtrIRegs.PIEACK.all|=0x0001;〃使能第一组中断EINT;
StartCpuTimer0(;〃启动定时器0,开始下一次采样