带有锁相环的SPWM算法程序Word格式文档下载.docx
《带有锁相环的SPWM算法程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《带有锁相环的SPWM算法程序Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;
//Setupshadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
//LoadonZero
EPwm1Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
//Setactions
EPwm1Regs.AQCTLA.bit.CAU=AQ_SET;
//SetPWM1AoneventA,upcount
EPwm1Regs.AQCTLA.bit.CAD=AQ_CLEAR;
//ClearPWM1AoneventA,downcount
EPwm1Regs.AQCTLB.bit.CBU=AQ_CLEAR;
//SetPWM1BoneventB,upcount
EPwm1Regs.AQCTLB.bit.CBD=AQ_SET;
//ClearPWM1BoneventB,downcount
EPwm1Regs.DBCTL.bit.OUT_MODE=0x3;
//输出B,A翻转看原理图
EPwm1Regs.DBCTL.bit.POLSEL=0x2;
//B取反逻辑
EPwm1Regs.DBFED=50;
EPwm1Regs.DBRED=70;
//InterruptwherewewillchangetheCompareValues
EPwm1Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
//SelectINTonZeroevent
EPwm1Regs.ETSEL.bit.INTEN=1;
//EnableINT
EPwm1Regs.ETPS.bit.INTPRD=ET_3RD;
//GenerateINTon3rdevent
}
voidInitEPwm2Example(void)
EPwm2Regs.TBPRD=sp;
//SettimerperiodspTBCLKs
EPwm2Regs.TBPHS.half.TBPHS=0x0000;
EPwm2Regs.TBCTR=0x0000;
EPwm2Regs.CMPA.half.CMPA=sp/2;
//SetcompareAvalue
EPwm2Regs.CMPB=0;
//SetCompareBvalue
EPwm2Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN;
EPwm2Regs.TBCTL.bit.PHSEN=TB_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;
EPwm2Regs.TBCTL.bit.CLKDIV=TB_DIV1;
EPwm2Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE=CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
EPwm2Regs.AQCTLA.bit.CAU=AQ_SET;
EPwm2Regs.AQCTLA.bit.CAD=AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CBU=AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CBD=AQ_SET;
EPwm2Regs.DBCTL.bit.OUT_MODE=0x3;
//输出B,A翻转看原理图
EPwm2Regs.DBCTL.bit.POLSEL=0x2;
//B取反逻辑
EPwm2Regs.DBFED=50;
EPwm2Regs.DBRED=70;
EPwm2Regs.ETSEL.bit.INTSEL=ET_CTR_ZERO;
EPwm2Regs.ETSEL.bit.INTEN=1;
EPwm2Regs.ETPS.bit.INTPRD=ET_3RD;
<
/pre>
prename="
code"
class="
objc"
>
/*#defineAD_BUSYGpioDataRegs.GPADAT.bit.GPIO6
#defineAD_STARTGpioDataRegs.GPADAT.bit.GPIO5
#defineAD_RESETGpioDataRegs.GPADAT.bit.GPIO4
*/
voidRESET_AD(void);
voidCONVERT(void);
//voidREAD_AD(void);
voidRESET_AD(void)
AD_RESET=0;
asm("
RPT#10||NOP"
);
AD_RESET=1;
AD_START=1;
DELAY_US
(1);
voidCONVERT(void)
AD_START=0;
DELAY_US(3);
while(AD_BUSY==1);
/*voidREAD_AD(void)
}*/
voidInit4Gpio(void);
voidInit5Gpio(void);
voidInit6Gpio(void);
voidInit4Gpio(void)
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO4=1;
//disablepulluponGPIO4
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;
//GPI04=GPI04
GpioCtrlRegs.GPADIR.bit.GPIO4=1;
//GPIO4=output
EDIS;
voidInit5Gpio(void)
GpioCtrlRegs.GPAPUD.bit.GPIO5=1;
//disablepulluponGPIO5
GpioCtrlRegs.GPAMUX1.bit.GPIO5=0;
//GPI05=GPI05
GpioCtrlRegs.GPADIR.bit.GPIO5=1;
//GPIO5=output
voidInit6Gpio(void)
GpioCtrlRegs.GPAPUD.bit.GPIO6=1;
//disablepulluponGPIO6
GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;
//GPI06=GPI06
GpioCtrlRegs.GPADIR.bit.GPIO6=0;
//GPIO6=input
stdio.h"
math.h"
float.h"
//#include"
InitEPwmXExample.c"
#defineADC_DATA*(Uint16*)0x004000
//Uint16*AddrStart=(Uint16*)0x100000;
//宏定义
#definePI3.1415926
#defineNX120
//函数申明
voidsintable(void);
float32READ_AD(void);
interruptvoidepwm1_isr(void);
interruptvoidepwm2_isr(void);
interruptvoidcpu_timer1_isr(void);
//参数定义
longdoublea[NX];
unsignedintk0,k1;
Uint16ADC_TMP[6];
Uint16simpletmp[6];
float32simpledata[80];
voidmain(void)
InitSysCtrl();
//初始化系统函数
InitEPwm1Gpio();
//初始化io口为epwm功能
InitEPwm2Gpio();
//初始化gpio,即AD的一些控制信号
Init4Gpio();
Init5Gpio();
Init6Gpio();
//InitXintf16Gpio();
InitXintf();
DINT;
IER=0x0000;
//禁止CPU中断
IFR=0x0000;
//清除CPU中断标志
/*************************************************************************/
InitPieCtrl();
//初始化PIE控制寄存器
InitPieVectTable();
//初始化PIE中断向量表
/************************************************************************/
PieVectTable.EPWM1_INT=&
epwm1_isr;
//中断服务程序入口地址
PieVectTable.EPWM2_INT=&
epwm2_isr;
//PieVectTable.XINT13=&
cpu_timer1_isr;
//================================================
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
InitEPwm1Example();
//产生epwm的配置
InitEPwm2Example();
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
//InitCpuTimers();
//ConfigureCPU-Timer0,1,and2tointerrupteverysecond:
//100MHzCPUFreq,1secondPeriod(inuSeconds)
//ConfigCpuTimer(&
CpuTimer1,100,250);
//4000hz
//CpuTimer1Regs.TCR.all=0x4001;
//Usewrite-onlyinstructiontosetTSSbit=0
//EnableCPUINT3whichisconnectedtoEPWM1-3INT:
IER|=M_INT3;
//IER|=M_INT13;
tint1
//EnableEPWMINTninthePIE:
Group3interrupt1-3
PieCtrlRegs.PIEIER3.bit.INTx1=1;
PieCtrlRegs.PIEIER3.bit.INTx2=1;
//====================================================
sintable();
RESET_AD();
EINT;
//开全局中断
ERTM;
//开实时中断
for(;
;
)
{
Uint16n;
//第一次转换
CONVERT();
simpledata[0]=READ_AD();
DELAY_US(217);
AD_START=1;
DELAY_US
(1);
AD_RESET=0;
for(n=1;
n<
80;
n++)
{
CONVERT();
simpledata[n]=READ_AD();
if(simpledata[n]>
0&
simpledata[n-1]<
0)
{
k0=0;
k1=0;
}
DELAY_US(217);
AD_START=1;
DELAY_US
(1);
AD_RESET=0;
}
n=1;
}
}
interruptvoidepwm1_isr(void)
if(k0<
=NX)
EPwm1Regs.CMPA.half.CMPA=a[k0];
k0=k0+1;
else
k0=0;
EPwm1Regs.ETCLR.bit.INT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;
interruptvoidepwm2_isr(void)
if(k1<
EPwm2Regs.CMPA.half.CMPA=a[k1];
//EPwm2Regs.CMPB=a[k1];
k1=k1+1;
else
k1=0;
EPwm2Regs.ETCLR.bit.INT=1;
//Acknowledgethisinterrupttoreceivemoreinterruptsfromgroup3
/*
interruptvoidcpu_timer1_isr(void)
{
AD_START=0;
}
*/
voidsintable()
float32M=0.8;
float32q,j;
float64l;
Uint16n;
for(n=0;
NX;
a[n]=0;
n=0;
while(n<
q=(n+0.75);
q=q*2*PI;
q/=120;
j=sin(q);
//l=sp*(1+M*j);
//M为调制比//计算占空比表达式
l=sp*(0.5+0.5*M*j);
if(l>
=100&
l<
=sp-100)
a[n]=l;
sp-100)
a[n]=sp-100;
a[n]=100;
n=n+1;
//=====================AD7656======================================
float32READ_AD(void)
float32ADC_F[6];
//Uint16ADC_TMP;
ADC_TMP[0]=ADC_DATA&
0XFFFF;
//读取通道1的数值
ADC_TMP[1]=ADC_DATA&
//读取通道2的数值
ADC_TMP[2]=ADC_DATA&
//读取通道3的数值
ADC_TMP[3]=ADC_DATA&
//读取通道4的数值
ADC_TMP[4]=ADC_DATA&
//读取通道5的数值
ADC_TMP[5]=ADC_DATA&
//读取通道6的数值
if((ADC_TMP[0]&
0X8000)!
=0X8000)//转换通道1结果
ADC_F[0]=((float)ADC_TMP[0])/((float)0X7FFF)*(10.0);
ADC_F[0]=((float)(0XFFFF-ADC_TMP[0]))/((float)0X7FFF)*(-10.0);
if((ADC_TMP[1]&
=0X8000)//转换通道2结果
ADC_F[1]=((float)ADC_TMP[1])/((float)0X7FFF)*(10.0);
ADC_F[1]=((float)(0XFFFF-ADC_TMP[1]))/((float)0X7FFF)*(-10.0);
i