/************************************************************
**描述:利用GP定时器1的比较器在产生一路PWM波,外设时钟37.5M**
**同时用全比较器产生1路PWM波信号,GP定时器2作采样频率时钟,开关频率4K***
************************************************************/
#include "math.h"
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//#include "IQmathLIB.h"
#include "device.h"
#include "math.h"
#define Uo 40 // 给定电压
#define dw 0.01
//变量声明
Uint16 iii;
Uint16 u[4],i[4];
float Ihe, Uhe ,Iav ,Uav, Iav1, Uav1;
int counter,iii1;
float D, C;
//内部函数调用声明
void init_cputime0(void);
void init_eva(void);
interrupt void ADC_FIR_INT_ISR(void); // ADC 服务中断
void EVA_PWM()
{
EvaRegs.EXTCONA.bit.INDCOE = 1; //单独使能比较输出模式
EvaRegs.ACTRA.all = 0x0aaa; //空间矢量不动作
EvaRegs.DBTCONA.all = 0x0000; //死区定时器不启动
EvaRegs.CMPR1 = 0x03D1; // 没有用到
EvaRegs.CMPR2 = 0x01E8; // 没有用到
EvaRegs.CMPR3 = C; // 更新占空比,DSP发出脉冲低有效。
EvaRegs.COMCONA.all = 0xa4e0; //空间向量禁止,全比较使能,陷阱禁止
}
void EVA_Timer1()
{
EvaRegs.EXTCONA.bit.INDCOE = 1; //单独使能比较输出模式
EvaRegs.GPTCONA.all =0x0111; //GP定时器1比较输出低有效,不用时为高电平。IGBT低电平导通,高电平截止,T1PWM输出。T2下溢中断启动ADC
EvaRegs.T1PR = 0x0091; // 定时周期为5.12us*(T1PR+1)//10k 0x003A
EvaRegs.T1CMPR = 0x0003; // GP定时器的比较寄存器
EvaRegs.T1CNT = 0x0000; // 定时器初值
EvaRegs.T1CON.all = 0x1742; //连续增计数,128分频,使能比较,打开定时器
EvaRegs.T2PR=0x06DE; //3ms定时/1.706微妙
EvaRegs.T2CNT=0x0000;
}
void inti_cputime0(void)
{CpuTimer0Regs.PRD.all = 0x000005DC;// 定时周期1500,30ms
CpuTimer0Regs.TPR.bit.TDDR=0x0BB8;//3000分频器20微秒
CpuTimer0Regs.TPRH.bit.TDDRH=0x0;
CpuTimer0Regs.TCR.bit.TRB = 1;//重新装载控制
CpuTimer0Regs.TCR.bit.TIE=0;//禁止中断
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有GPIO设置为I/O
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 1; // T1PWM 有效
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0x0;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPBDIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT配置为输入
GpioMuxRegs.GPAQUAL.all = 0x0004; // 设置GPIO输入量化值为0
GpioMuxRegs.GPBQUAL.all = 0x0004;
GpioMuxRegs.GPDQUAL.all = 0x0004;
GpioMuxRegs.GPEQUAL.all = 0x0004;
EDIS;
}
//采样后求平均值
void ADpj (void)
{
Ihe=0,Uhe=0;
for(iii1=0;iii1<=4;iii1++)
{Ihe=Ihe+i[iii1];
Uhe=Uhe+u[iii1];}
Iav=Ihe/5;
Uav=Uhe/5;
//AD精度校正
Iav1=Iav*3.633-5543.629-2047;
Uav1=Uav*3.633-5543.629-2047;
counter=9375;//37.5M 4K
//占空比计算
D=1-Uav1/Uo;
C=D*counter;
}
//AD采样程序
void AD_sample(void)
{ AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位SEQ1到CONV00
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //启动AD转换
loop:if(AdcRegs.ADCST.bit.INT_SEQ1!=1)
{goto loop;
}//等待AD转换完成
//while ((AdcRegs.ADCRESULT0&0x0fff)==0x0fff);
i[iii]=AdcRegs.ADCRESULT0>>4&0x0fff; //读取AD转换结果
u[iii] = AdcRegs.ADCRESULT8>>4&0x0fff;
}
// AdcInit()结束
void main(void)
{ int i;
InitSysCtrl(); //初始化系统控制寄存器, 时钟频率150M
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0002; //高速时钟的工作频率=37.5M
//SysCtrlRegs.HISPCP.all=0x6; //HSPCLK=SYSCLKOUT/12=150M/12=12.5MHz
//SysCtrlRegs.HISPCP.all=0x1; //HSPCLK=SYSCLKOUT/2=150M/2=75MHz
EDIS;
DINT;
AdcRegs.ADCTRL1.bit.RESET = 1; // 复位ADC模块
for(i=0;i<100;i++);
InitAdc();// Adc初始化(上电)
/***配置ADC寄存器 ***/
AdcRegs.ADCMAXCONV.all = 0x0001;//设置两个转换通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // B0B1作为转换通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x9; //i ADCINA01-->RESULT1
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x8; //u ADCINA08-->RESULT8
AdcRegs.ADCTRL1.bit.CPS = 0x1;
AdcRegs.ADCTRL3.bit.SMODE_SEL=1;//同步采样//0为顺序采样
AdcRegs.ADCTRL1.bit.SEQ_CASC=0;//双排序
AdcRegs.ADCTRL3.bit.ADCCLKPS=0xA;//HSPCLK
AdcRegs.ADCTRL1.bit.CONT_RUN=1;//连续运动,“0”为开始停止模式
//关闭总中断,清除中断标志
inti_cputime0();//还未启动
InitPieCtrl();
IER = 0x0000; //关闭外围中断
IFR = 0x0000; //清中断标志
InitPieVectTable();
Gpio_selectinit();
EVA_PWM();
EVA_Timer1();
//重新映射EVA-T1比较和ADC中断
/* EALLOW;
PieVectTable.ADCINT= &ADC_FIR_INT_ISR;
EDIS;*/
//使能EVA-T1CMPR INT(位于租2中断5)
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//使能外设计中断ADCINT1.6
PieCtrlRegs.PIEIER2.bit.INTx6 = 1;//使能T2定时器下溢中断
IER |= M_INT1;//使能cpu级中断group1
IER|=0x0009;
Gpio_select();
InitAdc();
//init_evb();
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;//使能EVASOC启动SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;//使能INT_ENA_SEQ1申请中断
EINT;//使能全局中断
ERTM;//使能全局实时中断调试
for(;;){;}
}
interrupt void ADC_FIR_INT_ISR(void)
{
for(iii=0;iii<=4;iii++)
{//重新初始化下一个ADC排序
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
pieCtrlRegs.PIEACK.all=PIEACK_GROUP;
AD_sample();
}
ADpj();
}