TI中文支持网
TI专业的中文技术问题搜集分享网站

关于28335芯片的CAP功能实现

TI专家你好

       关于CAP功能实现有关问题向你们请教,我想用CAP功能实现无刷直流电机的换相,用CAP1,CAP2,CAP3,分别捕获电机霍尔信号,CAP1,2,3单独测试,功能一切正常,当CAP1,2,3三路同时工作,捕获的数据是错误。也不知道是什么原因,以下是相关代码以及寄存器信息。搞了一个星期了。也没有搞定,特请教专家解答。非常感谢

CAP初始化

void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap1Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap1Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap1Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
ECap2Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap3Mode(void)
{
ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap3Regs.ECEINT.all = 0x0000;//stop all interrupt
ECap3Regs.ECCLR.all = 0xffff;//clare all flag
ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap3Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap3Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap3Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap3Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

以下为中断代码

interrupt void ISRCap1(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed1[capdata1]=capstastus;
capdata1++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

// Acknowledge this interrupt to receive more interrupts from group 1
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
EDIS;
}

interrupt void ISRCap2(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed2[capdata2]=capstastus;
capdata2++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

/*************************/

// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;
EDIS;
}

单路测试 工作正常 以下是寄存器信息

CAP1 2两路同时工作  出现错误。以下出错寄存器信息

Johnson Chen1:

是否hall信号频率太高?是否有可能是你的HALL信号到芯片有噪音导致?另外你测试时是实际HALL信号还是其他信号来模拟HALL信号(如用信号发生器)?

其实在中里面没有必要把GPIO24-26设置成输入模式,在这几个口做外设功能时,GPxDATA寄存器还是可以用来读取I/O口状态的。你可以去掉下面指令试一下。

GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpioGpioCtrlRegs.GPAMUX2.bit.GPIO25=0;GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;

GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为capGpioCtrlRegs.GPAMUX2.bit.GPIO25=1;GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

TI专家你好

       关于CAP功能实现有关问题向你们请教,我想用CAP功能实现无刷直流电机的换相,用CAP1,CAP2,CAP3,分别捕获电机霍尔信号,CAP1,2,3单独测试,功能一切正常,当CAP1,2,3三路同时工作,捕获的数据是错误。也不知道是什么原因,以下是相关代码以及寄存器信息。搞了一个星期了。也没有搞定,特请教专家解答。非常感谢

CAP初始化

void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap1Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap1Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap1Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
ECap2Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap3Mode(void)
{
ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap3Regs.ECEINT.all = 0x0000;//stop all interrupt
ECap3Regs.ECCLR.all = 0xffff;//clare all flag
ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap3Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap3Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap3Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap3Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

以下为中断代码

interrupt void ISRCap1(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed1[capdata1]=capstastus;
capdata1++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

// Acknowledge this interrupt to receive more interrupts from group 1
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
EDIS;
}

interrupt void ISRCap2(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed2[capdata2]=capstastus;
capdata2++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

/*************************/

// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;
EDIS;
}

单路测试 工作正常 以下是寄存器信息

CAP1 2两路同时工作  出现错误。以下出错寄存器信息

Jiang YanJun:

回复 Johnson Chen1:

谢谢你Johnson Chen1,HALL的信号频率不到1K,我是用实际信号来测试的,波形通过示波器检查过了,没有什么干扰的,现在把CAP模式改成one-shot模式现在是可以正常工作了,只是程序的效率不是很高,你上面说的代码,我后来也去掉了,谢谢你的百忙之中的解答。另有一事请教,可以发个EPwm驱动DLDC电机的例程给俺学习学习不,谢谢了。

TI专家你好

       关于CAP功能实现有关问题向你们请教,我想用CAP功能实现无刷直流电机的换相,用CAP1,CAP2,CAP3,分别捕获电机霍尔信号,CAP1,2,3单独测试,功能一切正常,当CAP1,2,3三路同时工作,捕获的数据是错误。也不知道是什么原因,以下是相关代码以及寄存器信息。搞了一个星期了。也没有搞定,特请教专家解答。非常感谢

CAP初始化

void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap1Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap1Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap1Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
ECap2Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap3Mode(void)
{
ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap3Regs.ECEINT.all = 0x0000;//stop all interrupt
ECap3Regs.ECCLR.all = 0xffff;//clare all flag
ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap3Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap3Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap3Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap3Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

以下为中断代码

interrupt void ISRCap1(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed1[capdata1]=capstastus;
capdata1++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

// Acknowledge this interrupt to receive more interrupts from group 1
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
EDIS;
}

interrupt void ISRCap2(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed2[capdata2]=capstastus;
capdata2++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

/*************************/

// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;
EDIS;
}

单路测试 工作正常 以下是寄存器信息

CAP1 2两路同时工作  出现错误。以下出错寄存器信息

Jiang YanJun:

回复 Jiang YanJun:

是不是今天休息了,Johnson Chen1。能帮俺找个EPwm驱动DLDC电机的例程不,要求是速度和电流闭环控制的,谢谢你了。网上说http://www.ti.com.cn/tool/cn/controlSUITET,可是我下载不了,可以单独发个文件包么,亲。

TI专家你好

       关于CAP功能实现有关问题向你们请教,我想用CAP功能实现无刷直流电机的换相,用CAP1,CAP2,CAP3,分别捕获电机霍尔信号,CAP1,2,3单独测试,功能一切正常,当CAP1,2,3三路同时工作,捕获的数据是错误。也不知道是什么原因,以下是相关代码以及寄存器信息。搞了一个星期了。也没有搞定,特请教专家解答。非常感谢

CAP初始化

void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap1Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap1Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap1Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
ECap2Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap3Mode(void)
{
ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap3Regs.ECEINT.all = 0x0000;//stop all interrupt
ECap3Regs.ECCLR.all = 0xffff;//clare all flag
ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap3Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap3Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap3Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap3Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

以下为中断代码

interrupt void ISRCap1(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed1[capdata1]=capstastus;
capdata1++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

// Acknowledge this interrupt to receive more interrupts from group 1
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
EDIS;
}

interrupt void ISRCap2(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed2[capdata2]=capstastus;
capdata2++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

/*************************/

// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;
EDIS;
}

单路测试 工作正常 以下是寄存器信息

CAP1 2两路同时工作  出现错误。以下出错寄存器信息

Jason Wu4:

回复 Jiang YanJun:

这个文件包太大,没法附件传送,上述链接下载有啥问题,建议下载zip离线安装文件再试试,里面你要的实例工程都很齐全。

TI专家你好

       关于CAP功能实现有关问题向你们请教,我想用CAP功能实现无刷直流电机的换相,用CAP1,CAP2,CAP3,分别捕获电机霍尔信号,CAP1,2,3单独测试,功能一切正常,当CAP1,2,3三路同时工作,捕获的数据是错误。也不知道是什么原因,以下是相关代码以及寄存器信息。搞了一个星期了。也没有搞定,特请教专家解答。非常感谢

CAP初始化

void SetCap1Mode(void)
{
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECEINT.all=0x0000;//stop all interrupt
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap1Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap1Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap1Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap1Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap2Mode(void)
{
ECap2Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap2Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap2Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap2Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap2Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap2Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap2Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap2Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap2Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap2Regs.ECEINT.all=0x0000;//stop all interrupt
ECap2Regs.ECCLR.all=0xFFFF;//clare all flag
ECap2Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启
ECap2Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
ECap2Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
ECap2Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
ECap2Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

void SetCap3Mode(void)
{
ECap3Regs.ECCTL1.bit.CAP1POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP2POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap3Regs.ECCTL1.bit.CAP4POL = EC_FALLING;
ECap3Regs.ECCTL1.bit.CTRRST1 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST2 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST3 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CTRRST4 = EC_DELTA_MODE;
ECap3Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE;
ECap3Regs.ECCTL1.bit.PRESCALE = EC_DIV1;
ECap3Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
ECap3Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS;
ECap3Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap3Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap3Regs.ECEINT.all = 0x0000;//stop all interrupt
ECap3Regs.ECCLR.all = 0xffff;//clare all flag
ECap3Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN;// 启动
// ECap3Regs.ECEINT.bit.CEVT1=1;// Enable cevt1 interrupt
// ECap3Regs.ECEINT.bit.CEVT2=1;// Enable cevt2 interrupt
// ECap3Regs.ECEINT.bit.CEVT3=1;// Enable cevt3 interrupt
// ECap3Regs.ECEINT.bit.CEVT4=1;// Enable cevt4 interrupt
}

以下为中断代码

interrupt void ISRCap1(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed1[capdata1]=capstastus;
capdata1++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

// Acknowledge this interrupt to receive more interrupts from group 1
ECap1Regs.ECCLR.all=0xFFFF;//clare all flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
EDIS;
}

interrupt void ISRCap2(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;//设定cap1~3为gpio
GpioCtrlRegs.GPAMUX2.bit.GPIO25=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=0;
capstastus=(GpioDataRegs.GPADAT.all&0x07000000)>>24;
speed2[capdata2]=capstastus;
capdata2++;
GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//设定cap1~3为cap
GpioCtrlRegs.GPAMUX2.bit.GPIO25=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO26=1;

/*************************/

// Acknowledge this interrupt to receive more interrupts from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
ECap2Regs.ECCLR.all=0xFFFF;
EDIS;
}

单路测试 工作正常 以下是寄存器信息

CAP1 2两路同时工作  出现错误。以下出错寄存器信息

YAOTING XUE:

回复 Johnson Chen1:

你好,我使用28335同时控制两个无刷直流电机,cap1,cap2和cap3捕获一组霍尔信号,cap4,cap5和cap6捕获另一组霍尔信号,两个电机同时只有一个转动时没有问题,但是两个一起运转时,捕获就会出现问题,请问怎么解决?

赞(0)
未经允许不得转载:TI中文支持网 » 关于28335芯片的CAP功能实现
分享到: 更多 (0)