452828196 发表于 2017-9-7 16:15

F28035 用外部输入过流信号至TZ1封锁PWM慢是怎么回事

用TZ引脚接受外部输入过流信号来触发封锁PWM,但是很慢,经过排查,发现同步(Sync)貌似有问题,我用软件给OSHT置1就可以封锁,但是外部触发就是很慢,而且一点外部过流信号消失又会发出PWM,TZ配置如下:
    EALLOW;
// CPU Halt Trip
    EPwm1Regs.TZSEL.bit.CBC6=0x1;
    EPwm2Regs.TZSEL.bit.CBC6=0x1;
    EPwm3Regs.TZSEL.bit.CBC6=0x1;
    EPwm1Regs.TZSEL.bit.OSHT1   = 1;//enable TZ1 for OSHT
    EPwm2Regs.TZSEL.bit.OSHT1   = 1;//enable TZ1 for OSHT
    EPwm3Regs.TZSEL.bit.OSHT1   = 1;//enable TZ1 for OSHT

// What do we want the OST/CBC events to do?
// TZA events can force EPWMxA
// TZB events can force EPWMxB

    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // EPWMxA will go low
    EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // EPWMxB will go low

    EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // EPWMxA will go low
    EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // EPWMxB will go low

    EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // EPWMxA will go low
    EPwm3Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // EPWMxB will go low

    EDIS;

   // Clear any spurious OV trip
    EPwm1Regs.TZCLR.bit.OST = 1;
    EPwm2Regs.TZCLR.bit.OST = 1;
    EPwm3Regs.TZCLR.bit.OST = 1;

PWM配置如下:
#define PWM_INIT_MACRO(ch1,ch2,ch3,v)                                                                                \
             /* Setup Sync*/                                                                                                        \
         (*ePWM).TBCTL.bit.SYNCOSEL = 0;       /* Pass through*/                \
               (*ePWM).TBCTL.bit.SYNCOSEL = 0;       /* Pass through*/                \
               (*ePWM).TBCTL.bit.SYNCOSEL = 0;       /* Pass through*/                \
                                                                                                                                                       \
         /* Allow each timer to be sync'ed*/                                                                \
         (*ePWM).TBCTL.bit.PHSEN = 1;                                                                        \
         (*ePWM).TBCTL.bit.PHSEN = 1;                                                                        \
         (*ePWM).TBCTL.bit.PHSEN = 1;                                                                        \
                                                                                                                                                 \
         /* Init Timer-Base Period Register for EPWM1-EPWM3*/                                \
         (*ePWM).TBPRD = v.PeriodMax;                                                                        \
         (*ePWM).TBPRD = v.PeriodMax;                                                                        \
         (*ePWM).TBPRD = v.PeriodMax;                                                                        \
                                                                                                                                                        \
         /* Init Timer-Base Phase Register for EPWM1-EPWM3*/                                \
         (*ePWM).TBPHS.half.TBPHS = 0;                                                                        \
         (*ePWM).TBPHS.half.TBPHS = 0;                                                                        \
         (*ePWM).TBPHS.half.TBPHS = 0;                                                                        \
                                                                                                                                                        \
         /* Init Timer-Base Control Register for EPWM1-EPWM3*/                                \
         (*ePWM).TBCTL.all = PWM_INIT_STATE;                                                        \
               (*ePWM).TBCTL.all = PWM_INIT_STATE;                                                        \
               (*ePWM).TBCTL.all = PWM_INIT_STATE;                                                        \
                                                                                                                                                        \
         /* Init Compare Control Register for EPWM1-EPWM3*/                                        \
         (*ePWM).CMPCTL.all = CMPCTL_INIT_STATE;                                                \
         (*ePWM).CMPCTL.all = CMPCTL_INIT_STATE;                                                \
         (*ePWM).CMPCTL.all = CMPCTL_INIT_STATE;                                                \
                                                                                                                                                        \
         /* Init Action Qualifier Output A Register for EPWM1-EPWM3*/                \
         (*ePWM).AQCTLA.all = AQCTLA_INIT_STATE;                                                \
         (*ePWM).AQCTLA.all = AQCTLA_INIT_STATE;                                                \
         (*ePWM).AQCTLA.all = AQCTLA_INIT_STATE;                                                \
                                                                                                                                                        \
         /* Init Dead-Band Generator Control Register for EPWM1-EPWM3*/                \
         (*ePWM).DBCTL.all = DBCTL_INIT_STATE;                                                        \
         (*ePWM).DBCTL.all = DBCTL_INIT_STATE;                                                        \
         (*ePWM).DBCTL.all = DBCTL_INIT_STATE;                                                        \
                                                                                                                                                        \
         /* Init Dead-Band Generator for EPWM1-EPWM3*/                                                \
         (*ePWM).DBFED = v.Deadband;                                                                        \
         (*ePWM).DBRED = v.Deadband;                                                                        \
         (*ePWM).DBFED = v.Deadband;                                                                        \
         (*ePWM).DBRED = v.Deadband;                                                                        \
         (*ePWM).DBFED = v.Deadband;                                                                        \
         (*ePWM).DBRED = v.Deadband;                                                                        \
                                                                                                                                                        \
         /* Init PWM Chopper Control Register for EPWM1-EPWM3*/                                \
         (*ePWM).PCCTL.all = PCCTL_INIT_STATE;                                                        \
         (*ePWM).PCCTL.all = PCCTL_INIT_STATE;                                                        \
         (*ePWM).PCCTL.all = PCCTL_INIT_STATE;                                                        \
                                                                                                                                                  \
         EALLOW;                     /* Enable EALLOW */                                        \
                                                                                                                                                        \
         /* Init Trip Zone Select Register*/                                                                \
         (*ePWM).TZSEL.all = TZSEL_INIT_STATE;                                                        \
         (*ePWM).TZSEL.all = TZSEL_INIT_STATE;                                                        \
         (*ePWM).TZSEL.all = TZSEL_INIT_STATE;                                                        \
                                                                                                                                                        \
         EDIS;                         /* Disable EALLOW*/                       

基本上都是参考TI官方的程序做的,查了寄存器也看不出什么问题

zhangmangui 发表于 2017-9-7 22:49

过流到封锁是MCU的硬件完成的吧    有个特殊的引脚需要控制一下   
等软件检测关断 太慢了

airwill 发表于 2017-9-10 08:38

对啊, 这是硬件完成的, 应该速度很快. 是不是引入了信号滤波?

太不专一 发表于 2017-9-14 11:48

CBC触发是在EPWM 计数器等于0时自动清0
OHST不自动清零,但最好选异步,不然等时钟会延时

452828196 发表于 2017-9-14 17:24

zhangmangui 发表于 2017-9-7 22:49
过流到封锁是MCU的硬件完成的吧    有个特殊的引脚需要控制一下   
等软件检测关断 太慢了 ...

对,应该是硬件完成,只需要配置成OST模式就行,但是目前就是很慢,需要100--200us才能关断,太慢了,我用的时TZ1引脚,不知道问题出在哪

452828196 发表于 2017-9-14 17:25

airwill 发表于 2017-9-10 08:38
对啊, 这是硬件完成的, 应该速度很快. 是不是引入了信号滤波?

GPIO没有配置信号滤波,目前就是需要100-200us才能关断输出,与我们预期的几微妙相差太多了,不知道怎么回事

452828196 发表于 2017-9-14 17:27

太不专一 发表于 2017-9-14 11:48
CBC触发是在EPWM 计数器等于0时自动清0
OHST不自动清零,但最好选异步,不然等时钟会延时 ...

意思就是OST模式也不会很快关断?我们想要在2-3微秒关断输出
页: [1]
查看完整版本: F28035 用外部输入过流信号至TZ1封锁PWM慢是怎么回事