这个论坛真的相当不错~~又遇到棘手问题,再次求教各位大哥
我做的是用2812去实现直接转矩控制去控制电机,通过查表方式得到矢量
现在我做了个测试,按我的要求强制输出上桥臂依次是
011,接着输出001,然后101,然后是111,然后是110,然后是010,最后是110
对应下桥臂应该是
100 110 010 000 001 101 001
并且通过CPU2 定时中断一直循环。但是死区却始终不能出现。。。
恳请高手告诉我原因,不胜感激
我做的测试程序如下:
EV 时间管理器程序如下:
void InitEv(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all=0x003f;
EDIS;
/*****************************/
/***********配置ACTR**********/
/*****************************/
EvaRegs.ACTR.bit.CMP1ACT=2;
//PW1引脚高电平有效
EvaRegs.ACTR.bit.CMP2ACT=1;
//PWM2引脚低电平有效
EvaRegs.ACTR.bit.CMP3ACT=2;
//PW1引脚高电平有效
EvaRegs.ACTR.bit.CMP4ACT=1;
EvaRegs.ACTR.bit.CMP5ACT=2;
//PW1引脚高电平有效
EvaRegs.ACTR.bit.CMP6ACT=1;
//PWM2引脚低电平有效
//PWM2引脚低电平有效
/*****************************/
/*******配置死区寄存器********/
/*****************************/
EvaRegs.DBTCONA.bit.DBT=15;
//死区定时器周期为5
EvaRegs.DBTCONA.bit.EDBT1=1;
EvaRegs.DBTCONA.bit.EDBT2=1;
EvaRegs.DBTCONA.bit.EDBT3=1;
//死区定时器1使能
EvaRegs.DBTCONA.bit.DBTPS=5;
//死区定时器预定标因子,死区时钟为HSPCLK/8
/*****************************/
/*********配置COMCONA*********/
/*****************************/
EvaRegs.COMCONA.bit.CENABLE=1;
//使能比较单元的比较操作
EvaRegs.COMCONA.bit.CLD=2;
//当给CMPR1赋新值时,立即装载
EvaRegs.COMCONA.bit.ACTRLD=2;
//行为控制寄存器,立即重载
EvaRegs.COMCONA.bit.FCOMPOE=1;
//全比较操作,PWM输出由相应的比较逻辑驱动
/*****************************/
/**********设置T1CON**********/
/*****************************/
EvaRegs.T1CON.bit.TMODE=2;
//T1工作于连续增模式
EvaRegs.T1CON.bit.TPS=3;
//输入时钟预定标因子为X/8
EvaRegs.T1CON.bit.TENABLE=1;
//禁止定时器操作
EvaRegs.T1CON.bit.TCLKS10=0;
//使用内部时钟
EvaRegs.T1CON.bit.TECMPR=1;
//使能定时器比较操作
/*****************************/
/**********设置T1PR等*********/
/*****************************/
EvaRegs.T1PR =129;
//一个周期时间为(129+1)*0.107us
EvaRegs.T1CNT=0; ///定时器1初值设为0
EvaRegs.CMPR1=0;
EvaRegs.CMPR2=0;
EvaRegs.CMPR3=0;
EvaRegs.T1CON.bit.TENABLE=1;
//启动定时器T1
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
主程序如下:
#include "DSP28_Device.h"
int i,k;
interrupt void ISRTimer2(void);
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化GPIO*/
InitGpio();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT2 = &ISRTimer2;
EDIS; // This is needed to disable write to EALLOW protected registers
/*初始化EV*/
InitEv();
InitCpuTimers();
ConfigCpuTimer(&CpuTimer2, 150, 70); //70us一次采样
StartCpuTimer2();
IER |= M_INT14;
EINT;
ERTM;
for(;;)
{
}
}
interrupt void ISRTimer2(void)
{
IFR=0x0000;
// PieCtrl.PIEIFR1.all = 0;
PieCtrl.PIEACK.all=0xffff;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x0c33;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x0cc3;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x03c3;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x0333;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x033c;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x0c3c;
for (i=0;i<0x96;i++)
{
}
EvaRegs.ACTR.all=0x033c;
}