This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28069 InstaSPIN-FOC PWM配置

Other Parts Discussed in Thread: DRV8301

各位老师好,我有个问题想请教一下。我用的自己的板子,然后核心控制卡是F28069 InstaSPIN FOC。TI高压控制套件上的PWM输出是GPIO0到6,而我板子上的输出是2到7,如下图所示。

我把PWM配置成如下定义

发现只有两路输出有PWM信号,然后我把GPIO0配置成pwm输出,结果在D_Brake_ON引脚检测到了pwm信号。

GPIO_setMode(obj->gpioHandle,GPIO_Number_0,GPIO_0_Mode_EPWM1A);

那么我的板子上是不是该配制成EPWM2、EPWM3、EPWM4这三路作为输出呢?我试着改了下hal.c中的HAL_setupPwms,结果还是没有得到三路输出,而且核心板上表示中断的红灯也不闪了。请问一下到底该怎么配置呢,谢谢!

  • 在HAL_init(&hal,sizeof(hal));函数里面,更改成下面内容::

    // initialize PWM handles
    obj->pwmHandle[0] = PWM_init((void *)PWM_ePWM2_BASE_ADDR,sizeof(PWM_Obj));
    obj->pwmHandle[1] = PWM_init((void *)PWM_ePWM3_BASE_ADDR,sizeof(PWM_Obj));
    obj->pwmHandle[2] = PWM_init((void *)PWM_ePWM4_BASE_ADDR,sizeof(PWM_Obj));

  • 谢谢CHen老师的回复!我这样改了之后的确三路都有PWM输出,但是占空比都是不变的。而且核心板上的LED2没有闪烁,说明没有进入中断。是不是还有其他中断配置和EPWM1有关系?

  • chen老师,在这一部分里面是用EPWM1_INT作为中断触发源,那么能否改为EPWM1_INT呢?lab里的代码风格看着不是很习惯,

    都是用的结构体对寄存器进行操作,书上都是直接写寄存器的值。

  • 程序里面是通过ADC转换完成来产生中断的,中断使能是通过HAL_enableAdcInts()函数,因此不用关PWM1_INT.

    你要做的是将ADC 转换的触发源改到EPWM1,请修改HAL_setupAdcs()里面下面所用SOC的触发源为ADC_SocTrigSrc_EPWM2_ADCSOCA:

    ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM2_ADCSOCA);

  • Johnson Chen1 说:

    程序里面是通过ADC转换完成来产生中断的,中断使能是通过HAL_enableAdcInts()函数,因此不用关PWM1_INT.

    你要做的是将ADC 转换的触发源改到EPWM1,��修改HAL_setupAdcs()里面下面所用SOC的触发源为ADC_SocTrigSrc_EPWM2_ADCSOCA:

    ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM2_ADCSOCA);

    改为用ADC_SocTrigSrc_EPWM2_ADCSOCA来触发,结果中断还是不能正常运行。在mainisr中设了一个变量发现加了1就停止了,而且电机的状态停留在了CTRL_State_OffLine。

  • 有把所有的SOC触发源设置为ADC_SocTrigSrc_EPWM2_ADCSOCA吗?

  • 所有的都改过了

  • HAL_setTrigger函数里也把PWM_Number_1改为了PWM_Number_2

    PWM_Obj *pwm1 = (PWM_Obj *)obj->pwmHandle[PWM_Number_2];//PWM_Number_1
    PWM_Obj *pwm2 = (PWM_Obj *)obj->pwmHandle[PWM_Number_3];//PWM_Number_2
    PWM_Obj *pwm3 = (PWM_Obj *)obj->pwmHandle[PWM_Number_4];//PWM_Number_3

    if(ignoreShunt == use_all)
    {
    if(pwm->CMPAM >= (pwm->CMPA + pwm->DBFED))
    {
    pwm1->CMPB = (pwm->CMPAM - (pwm->CMPA + pwm->DBFED)) / 2 + 1;
    PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_2],PWM_SocPulseSrc_CounterEqualCmpBDecr);//PWM_Number_1
    }
    else
    {
    pwm1->CMPB = ((pwm->CMPA + pwm->DBFED) - pwm->CMPAM ) / 2 + 1;
    PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_2],PWM_SocPulseSrc_CounterEqualCmpBIncr);//PWM_Number_1
    }
    }
    else
    {
    pwm1->CMPB = offset;
    PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_2],PWM_SocPulseSrc_CounterEqualCmpBIncr);//PWM_Number_1
    }

  • ADC_SocTrigSrc_EPWM2_ADCSOCA不能触发中断

      

    PWM handles设置如下

     然后我改为ADC_SocTrigSrc_EPWM3_ADCSOCA之后就可以触发中断了。但是只有ePWM3ePWM4有输出,但是ePWM2没有输出。

     

    如果触发源为ADC_SocTrigSrc_EPWM2_ADCSOCA,而PWM Handle改为如下设置

    只有ePWM2ePWM4有输出,但是ePWM3没有输出。导致这种现象的原因是中断优先级还是其他什么的,该怎么处理?

  • 请确保下面配置:

    PWM_Obj *pwm1 = (PWM_Obj *)obj->pwmHandle[PWM_Number_1];//PWM_Number_1
    PWM_Obj *pwm2 = (PWM_Obj *)obj->pwmHandle[PWM_Number_2];//PWM_Number_2
    PWM_Obj *pwm3 = (PWM_Obj *)obj->pwmHandle[PWM_Number_3];//PWM_Number_3

    // initialize PWM handles
    obj->pwmHandle[0] = PWM_init((void *)PWM_ePWM2_BASE_ADDR,sizeof(PWM_Obj));
    obj->pwmHandle[1] = PWM_init((void *)PWM_ePWM3_BASE_ADDR,sizeof(PWM_Obj));
    obj->pwmHandle[2] = PWM_init((void *)PWM_ePWM4_BASE_ADDR,sizeof(PWM_Obj));

    所有SOC都改成ADC_SocTrigSrc_EPWM2_ADCSOCA。

    ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM2_ADCSOCA);

    HAL_setTrigger函数里使用PWM_Number_1,不要改为PWM_Number_2

  • 谢谢chen老师,问题已经解决,我再总结一下供网友参考。

    ePWM2、3、4输出配置方法

    触发源都改为ADC_SocTrigSrc_EPWM2_ADCSOCA

     

    注意HAL_setupPwms里的参数不变

    注意HAL_setTrigger里的参数不变

  • 谢谢楼主的总结

  • 请问自己设计驱动板,是不是只要考虑PWM和ADC?

  • 当然是需要考虑了, 一是硬件上面的最大最小值,二是你具体使用的是那些PWM模块和ADC 通道要进行修改,如果想要简单那改动小的话,尽量ADC和PWM电机相关大通道不要动。

  • 谢谢。还有不太明白的是我的板子对应了六路PWM输出,但程序中将ePWM4A作为8301的使能信号没有用到,是否要屏蔽掉?还有就是ADC采样通道的修改具体在hal.c中应该怎么做呢,不能只是将ADC_ResultNumber的编号修改一下吧?最后一个问题是如果不采用SPI,是不是可以将于SPI相关的输出不连接?

  • 如果你没有用DRV8301,那么可以不用配置SPI 和 DRV8301使能。