#include "DSP2833x_Device.h"
void SysCtrl(void);
//
/*与ECana模块相关的函数*/
void En_ECanaModeClk(void);
void Confi_ECanaGpio(void);
void Init_ECana(void);
void Confi_ECanaMbox1_Tr(void);
void Confi_ECanaInterrupt(void);
void Confi_PieECana(void);
void interrupt ISR_ECana(void);
/*与定时中断相关的函数*/
void Confi_LedGpio(void); //中断正常检测引脚
#define LED1 GpioDataRegs.GPBDAT.bit.GPIO60
#define LED2 GpioDataRegs.GPBDAT.bit.GPIO61
void En_CpuTimer(void);
void En_CpuTimer(void);
//
void Confi_CpuTimer0(float PRD,float TDDR);
void Confi_PieTimer0(void);
//
void Confi_CpuTimer1(float PRD,float TDDR);
//
void interrupt ISR_Timer0(void);
void interrupt ISR_Timer1(void);
//
/*与EPwm产生相关的定义的函数*/
void En_EPwmModeClk(void);
void En_TBCLKSYNC(void);
void Dis_TBCLKSYNC(void);
//
void Confi_EPwmGpio(void);
void Init_EPwmMode(void);
//
#define Duty1 EPwm1Regs.CMPA.half.CMPA
#define Duty2 EPwm2Regs.CMPA.half.CMPA
#define Duty3 EPwm3Regs.CMPA.half.CMPA
#define Duty4 EPwm4Regs.CMPA.half.CMPA
#define Duty5 EPwm5Regs.CMPA.half.CMPA
#define Duty6 EPwm6Regs.CMPA.half.CMPA
//
/*与Hall位置检测相关的定义的函数*/
void Confi_HallGpio(void);
Uint16 hall_a;
Uint16 hall_b;
Uint16 hall_c; //Hall 位置传感器的缓存器
#define Hall_A GpioDataRegs.GPADAT.bit.GPIO24
#define Hall_B GpioDataRegs.GPADAT.bit.GPIO25
#define Hall_C GpioDataRegs.GPADAT.bit.GPIO26
//
/*设置外部按键*/
void Confi_KeyGpio(void);
#define Key1 GpioDataRegs.GPBDAT.bit.GPIO58
#define Key2 GpioDataRegs.GPBDAT.bit.GPIO59
//
Uint16 ct;
Uint32 Speed; //定义速度符号
//
Uint16 count_dir; //定义定时器0的计数方向
Uint16 running_dir; //定义电机转动方向
int16 count; //定时器定时个数
int16 count_buf; //定时计数器缓存器
//#define count_max = 100; //定时器定时个数最大计数值
//
/*与捕获模块相关的函数*/
void En_ECapModeClk(void);
#define T1 ECap1Regs.CAP1
#define T2 ECap1Regs.CAP2
#define T3 ECap1Regs.CAP3
#define T4 ECap1Regs.CAP4
//
Uint32 t1; Uint32 t2; Uint32 t3; Uint32 t4;
//
Uint32 Period1; Uint32 Period2; Uint32 Period3;
///
void Init_ECapMode(void);
//
void main(void)
{
Speed = 0;Period1 = Period2 = Period3 = 0;
//
t1=t2=t3=t4=0;
count = 0;
count_dir = 0; //定时计数值为加计数
running_dir = 0; //电机转向初始为正方向旋转
//
ct = 0;
//
SysCtrl();
En_ECanaModeClk(); //ECana模块的时钟使能
En_ECapModeClk(); //ECap模块的时钟使能
En_EPwmModeClk(); //EPwm模块的时钟使能
En_CpuTimer(); //使能定时器的时钟模块
Dis_TBCLKSYNC(); //与epwm模块相关
//
//
Confi_LedGpio(); //设置LED灯的功能引脚
Confi_EPwmGpio(); //设置pwm功能相关的引脚
Confi_HallGpio(); //设置位置模块外部引脚功能
Confi_ECanaGpio(); //设置ECana模块引脚功能
Init_ECana(); //初始化ECana
Confi_ECanaMbox1_Tr(); //设置邮箱1为发送邮箱
//
DINT;
//
IFR = 0x0000; IER = 0x0000;
//
Confi_CpuTimer0(100000,150); //定时周期为 0.1s
Confi_PieTimer0();
Confi_CpuTimer1(10000,150); //设置定时器1
Confi_ECanaInterrupt(); //设置ECana发送中断
Confi_PieECana();
//
EALLOW;
PieVectTable.TINT0 = & ISR_Timer0;
PieVectTable.XINT13 = & ISR_Timer1;
PieVectTable.ECAN0INTA = & ISR_ECana;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
//
Init_EPwmMode();
En_TBCLKSYNC();
//
Init_ECapMode();
//
IER = 0x1101; //启动定时器0 和1,已经ECana模块的中断
//
EINT;ERTM; //CpuTimer1Regs.TCR.bit.TSS = 0;
LED1 = 1; LED2 = 1;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
//ECanaRegs.CANMC.bit.CDR = 1;
ECanaMboxes.MBOX1.MDL.all = Speed;
//ECanaRegs.CANMC.bit.CDR = 0;
ECanaRegs.CANTRS.bit.TRS1 = 1;
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
while(1)
{
if(Key1 == 0 && Key2 == 1) //启动按键是否按下
{
CpuTimer0Regs.TCR.bit.TSS = 0; //有键按下时启动定时器0
CpuTimer1Regs.TCR.bit.TSS = 0;
//
count_dir = 0; //启动键按下后,设定为计数加计数方式
do
{
//
hall_a = Hall_A ;hall_b = Hall_B;hall_c = Hall_C;
if(running_dir == 0) //判断电机方向
{
/*六路位置判断*/
if(hall_a == 0 && hall_b == 1 && hall_c ==1) //判断霍尔位置确定开关管的导通启动电机 1
{
if(count ==0 || count<50) //电机调速占空比的确定
{
Duty2 = 50000 - 500* count;
Duty3 = 50000 - 500* count; //电机的启动运行
}
else if(count>=50)
{
Duty2 = 25000;Duty3 = 25000; //电机的正常运行
}
EPwm1Regs.AQCTLA.bit.CAU = 1;
EPwm2Regs.AQCTLA.bit.CAU = 2;
EPwm3Regs.AQCTLA.bit.CAU = 2;
EPwm4Regs.AQCTLA.bit.CAU = 1;
EPwm5Regs.AQCTLA.bit.CAU = 1;
EPwm6Regs.AQCTLA.bit.CAU = 1;
//
}
else if(hall_a == 0 && hall_b == 1 && hall_c == 0) //2
{
if(count==0 || count<=50)
{
Duty3 = 50000 - 500 * count;
Duty6 = 50000 - 500* count;
}
else if(count>50)
{
Duty3 = 25000;Duty6 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 1;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm3Regs.AQCTLA.bit.CAU = 2;
EPwm4Regs.AQCTLA.bit.CAU = 1;
EPwm5Regs.AQCTLA.bit.CAU = 1;
EPwm6Regs.AQCTLA.bit.CAU = 2;
//
}
else if(hall_a == 1 && hall_b ==1 && hall_c ==0) //3
{
if(count== 0 || count<=50)
{
Duty1 = 50000 - 500* count;
Duty6 = 50000 - 500 * count;
}
else if (count >50)
{
Duty1 = 25000;Duty6 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 2;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm3Regs.AQCTLA.bit.CAU = 1;
EPwm4Regs.AQCTLA.bit.CAU = 1;
EPwm5Regs.AQCTLA.bit.CAU = 1;
EPwm6Regs.AQCTLA.bit.CAU = 2;
}
else if(hall_a == 1 && hall_b == 0 && hall_c == 0) // 4
{
if(count == 0 || count <=50)
{
Duty1 = 50000- 500 * count;Duty4 = 50000 - 500* count;
}
else if(count >50)
{
Duty1 = 25000;Duty4 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 2;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm3Regs.AQCTLA.bit.CAU = 1;
EPwm4Regs.AQCTLA.bit.CAU = 2;
EPwm5Regs.AQCTLA.bit.CAU = 1;
EPwm6Regs.AQCTLA.bit.CAU = 1;
////
}
else if(hall_a == 1 && hall_b == 0 && hall_c == 1) //5
{
if(count == 0 || count<=50)
{
Duty5 = 50000 - 500* count;
Duty4 = 50000 - 500* count;
}
else if(count >50)
{
Duty5 = 25000;Duty4 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 1;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm3Regs.AQCTLA.bit.CAU = 1;
EPwm4Regs.AQCTLA.bit.CAU = 2;
EPwm5Regs.AQCTLA.bit.CAU = 2;
EPwm6Regs.AQCTLA.bit.CAU = 1;
//
}
else if(hall_a == 0 && hall_b ==0 && hall_c ==1) //6
{
if(count == 0 || count <=50)
{
Duty5 = 50000- 500 * count;
Duty2 = 50000- 500* count;
}
else if(count >50)
{
Duty5 = 25000;Duty2 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 1;
EPwm2Regs.AQCTLA.bit.CAU = 2;
EPwm3Regs.AQCTLA.bit.CAU = 1;
EPwm4Regs.AQCTLA.bit.CAU = 1;
EPwm5Regs.AQCTLA.bit.CAU = 2;
EPwm6Regs.AQCTLA.bit.CAU = 1;
///
}
//
ECanaMboxes.MBOX1.MDL.all = Speed;
ECanaRegs.CANTRS.bit.TRS1 = 1; //启动ECana通讯
} ///正转启动设置完成
else if(running_dir ==1) //电机反转标定
{ /*反向转动时的,位置信号所对应的开关管导通顺序*/
if(hall_a == 0 && hall_b == 1 && hall_c == 1) //位置信号 1 Q1 Q4 导通
{
if(count == 0 || count<50 )
{
Duty4 = 50000 - 500 * count;
Duty1 = 50000 - 500 * count;
}
else if(count >= 50)
{
Duty4 = 25000;Duty1 = 25000;
}
EPwm1Regs.AQCTLA.bit.CAU = 2;
EPwm2Regs.AQCTLA.bit.CAU = 1;
EPwm3Regs.AQCTLA.bit.CAU = 1;
EPwm4Regs.AQCTLA.bit.CAU = 2;
EPwm5Regs.AQCTLA.bit.CAU = 1;
EPwm6