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.

[参考译文] CCS/TMS320F2.8054万F:将instaspin项目从TMS320F2.8027万迁移到TMS320F2.8054万微控制器

Guru**** 1555290 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/573296/ccs-tms320f28054f-migration-of-instaspin-project-from-tms320f28027-to-tms320f28054-microncontrollers

部件号:TMS320F2.8054万F
线程中讨论的其他部件:TMS320F2.8027万TMS320F2.8054万TMS320F2.8027万F

工具/软件:Code Composer Studio

尊敬的各位:

到目前为止,我一直在使用基于bootxldrv8301_RevB开发套件的TMS320F2.8027万硬件设计来控制PMSM电机。 现在,我有一个新的硬件设计,其中包括TMS320F2.8054万。 开关,按钮,SPI等工作正常,但PWM输出不正常,因此电机不旋转。 通过示波器观察信号,PWM占空比为50 % ,频率为30 KHz (正确)。 如果我修改速度参考,则不会发生任何变化,PWM也不会改变。

让我简单地解释一下我所做的事情:

  1. 为两个微控制器创建不同的构建配置。 如果程序加载到TMS320F2.8027万中,电机将旋转。
  2. 将电流,电压和直流电压(gAddcData)重定向至新ADC。

ADC

TMS320F2.8027万

TMS320F2.8054万

IA

ADCINB1

ADCINB0

IB

ADCINB3         

ADCINB2

IC

ADCINB7.

ADCINB3

VA

ADCINA3

ADCINA5

vb

ADCINA1

ADCINA2

VC.

ADCINA0

ADCINA0

DCBus

ADCINA7.

ADCINA7.

 

3. PWM配置寄存器中的任何更改,因此两个微芯的输出相同。

总之,借助全新的HW和MICRO,电机永远不会旋转。 在调试器中,我看不到gAdcData或gPwmData上的任何重要变化。

 

提前感谢您的帮助,我们将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    澄清一下...我没有修改任何PGA注册表
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Masky:

    我将为您研究此问题。 我知道您正在使用bootxldrv8301_RevB开发套件。

    您使用的是TI示例软件还是您自己的软件?

    此致,
    克里斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kris,

    我正在使用自己的硬件和 软件。 使用旧的微控制器(TMS320F2.8027万F),我也在使用自己的硬件和软件,但这两种设计都是 基于bootxldrv8301_RevB和LaunchpadXL。

    现在,有了新的硬件,我只对硬件和GPIO模块做了一些更改,但电机不会旋转。 这些天我做了更多的测试:

    1. 我已验证V ADC通道是否正常。
    2. 在mainISR中断中,如果我在调用 HAL_writePwmData之前修复了PWM占空比,则PWM输出更改正常。  

    我想问题可能出在 CTRL_RUN函数中,所以SVGEN_RUN返回错误的占空比,但我完全丢失了:-(.

    感谢你的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    马斯基,

    感谢您提供额外信息。

    您是否能够发布以下内容:

    - PWM初始化代码
    -您在主ISR中所做的更改,可解决此问题
    来自HAL_writePwmData的相关部分

    您是否尝试过创建变量并记录代码不起作用时HAL_writePwmData使用的值?  最好能看到实际写入的内容,因为它听起来像是不正确的值或可能是坏的阴影活动负载计时。


    谢谢!
    克里斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kris,

    为了澄清,这一问题没有得到解决。 我只检查 了HAL_writePwmData是否按预期工作。 下面是您需要的信息:

    • PWM初始化代码。
    void HAL_setupPwms (HAL_HANDLE句柄,
    const uint_least16_t systemFreq_MHz,
    const float_t pwmPeriod_usec,
    const uint_least16_t numPwmTicksPerIsrTick)
    {
    HAL_Obj *obj =(hal_Obj *)句柄;
    uint16_t
    
    
    
    
    阻抗Period_cycles =(halfint16_t)((FLOW_t)systemFreq_MHz*pwmPeriod_usec)>> 1;uint_pwm将关闭高功率输出/关闭,以关闭高功率输出;
    PWM_setOneShotTrip(obj->pwmHandle[PWM_NUMBER_1]);
    PWM_setOneShotTrip(obj->pwmHandle[PWM_NUMBER_2]);
    PWM_setOneShotTrip (obj->pwmHandle[PWM_NUMBER_3]);
    
    适用于(cn=0;cnt<3;cnt+)
    {
    //设置时基控制寄存器(TBCTL)
    PWM_setCounterMode(obj->pwmHandle[cnt],PWM_CounterMode_UpDown);
    PWM_DisableCounterLoad(obj->pwmHandle[cnt]);
    PWM_setPeriodLoad(obj->pwmHandle[cnt],PWM_PeriodLoad_immediate);
    PWM_setSyncMode(obj->pwmHandle[cnt],PWM_SyncMode_EPWMxSYNC);
    PWM_setHighSpeedClkDiv (obj->pwmHandle[cnt],PWM_HspClkDiv by_1);
    PWM_setClkDiv (obj->pwmHandle[cnt],PWM_ClkDiv by_1);
    PWM_setPhaseDir(obj->pwmHandle[cnt],PWM_PhaseDir_CountUp);
    PWM_setRunMode(obj->pwmHandle[cnt],PWM_RunMode_FreeRun);
    
    //设置基于计时器的相位寄存器(TBPHS)
    pwm_setphy(obj->pwmHandle[cnt],0);
    
    //设置时基计数器寄存器(TBCTR )
    PWM_setCount(obj->pwmHandle[cnt],0);
    
    //设置时基期间寄存器(TBPRD)
    //初始设置为零
    pwm_setPeriod(obj->pwmHandle[cnt],0);
    
    //设置计数器比较控制寄存器(CMPCTL)
    PWM_setLoadMode_CmpA(obj->pwmHandle[cnt],PWM_LoadMode_Zero);
    PWM_setLoadMode_CMPB(obj->pwmHandle[cnt],PWM_LoadMode_Zero);
    PWM_setShadowMode_CmpA(obj->pwmHandle[cnt],PWM_ShadowMode_Shadow);
    PWM_setShadowMode_CMPB(obj->pwmHandle[cnt],PWM_ShadowMode_immediate);
    
    //设置Action-Qualifier输出A寄存器(AQCTLA)
    PWM_setActionQual_CntUp_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_set);
    PWM_setActionQual_CntDown_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_Clear);
    
    //设置死带发生器控制寄存器(DBCTL)
    PWM_setDeadBandOutputMode(obj->pwmHandle[cnt],PWM_DeadBandOutputMode_EPWMxA_Rising _EPWMxB_Falling);
    PWM_setDeadBandPolarity(obj->pwmHandle[cnt],PWM_DeadBandPolarity_EPWMxB_Inverted);
    
    //设置死区上升边缘延迟寄存器(DBRD)
    PWM_setDeadBandRisingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBRED_CNT);
    
    //设置死区下降边缘延迟寄存器(DBFED)
    PWM_setDeadBandFallingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBFED_CNT);
    //设置PWM斩波器控制寄存器(PCCTL)
    pwm_disableChoping(obj->pwmHandle[cnt]);
    
    //设置跳闸区域选择寄存器(TZSEL)
    pwm_disableTripZones(obj->pwmHandle[cnt]);
    }
    
    
    //设置事件触发器选择寄存器(ETSEL)
    PWM_DisableInt(obj->pwmHandle[PWM_NUMBER_1]);
    PWM_setSocAPulseSrc(obj->pwmHandle[PWM_NUMBER_1],PWM_SocPulseSrc_CounterEqualZero);PWM_enableSocAPuls(obj->pwmHandle_1]
    ;
    
    
    //设置事件触发器按键寄存器(ETPS)
    IF (numPwmTicksPerIsrTick ==3)
    {
    PWM_setIntPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_IntPeriod_ThirdEvent);
    PWM_setSocAPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_SocPeriod_ThirdEvent);
    }
    否则,如果(numPwmTicksPerIsrTick ==2)
    {
    PWM_setIntPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_IntPeriod_SecondEvent);
    PWM_setSocAPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_SocPeriod_SecondEvent);
    }
    否则
    {
    PWM_setIntPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_IntPeriod_FirstEvent);
    PWM_setSocAPeriod(obj->pwmHandle[PWM_NUMBER_1],PWM_SocPeriod_FirstEvent);
    }
    
    
    //设置事件触发器清除寄存器(ETCLR)
    PWM_clearIntFlag(obj->pwmHandle[PWM_NUMBER_1]);
    PWM_clearSocAFlag(obj->pwmHandle[PWM_NUMBER_1]);
    
    //同步PWM的第一步
    是CLK_disclbClockobj (obj->clkwmHandle[wm_half_perip_peripetle],
    
    pod_periplifetle[wm_half_perip_perip周期 数,wm_perip周期 数为wm_perip_perip周期
    
    
    
    数,wm_periplifetle] wm_perip周期 数wlift_perip_perip_perip周期 数wlifetle/pod_perip周期 数
    
    //同步PWM
    CLK_enableTbClockSync(obj->clkHandle);
    
    return;
    }// hal_setupPwms()函数结束 

    • 主ISR代码。 在注释中,用于固定占空比的行。
    中断void mainISR(void)
    {if(ThyCnt)
    
    	ThyCnt--;
    
    //确认ADC中断
    HAL_acqAdcInt(halHandle,ADC_IntNumber_1);//
    
    转换ADC数据
    HAL_readAdcData(halHandle,&gAddData)//
    
    运行控制器CTRL_run(ctrHandlHandle,AD_IntNumber_1;PAMP1.pwmp_Data/pwmwmwmwmwmwmwmwl,pwmwp_1;
    
    
    
    
    
    
    
    
    					//计算Angulo recordid0 _IQ20
    
    //设置控制器
    CTRL_setup(ctrlHandle);
    
    return;
    }//结束mainISR()函数 

    • 最后是 HAL_writePwmData。
    //! \brief 将PWM数据写入电机控制的PWM比较器
    //! \param[in]处理硬件抽象层(HAL)句柄
    //! \param[in] pPwmData PWM数据
    静态内联指针void HAL_writePwmData (HAL_handle handle,HAL_PwmData_t *pPwmData)
    {
    uint_least8_t cnt;
    HAL_Obj *obj =(PWM_Obj *) handle;
    IQ_Obj *PWM;_wsat
    _period
    Data
    
    _IQ值;
    uint16_t value_sat;
    
    用于(cnt=0;cnt<3;cnt++)
    {
    PWM =(PWM_Obj *) obj->pwmHandle[cnt];
    周期=(_IQ) PWM->TBPRD;
    pwmData_sat =_IQsat(pPwmData->TABC.value[cnt],_IQ (1.0),_IQ (- 1.0));
    pwmData_sat_dc =_IQbumpy (pwmData_sat +_IQ (1.0),_IQ (0.5));
    值=_IQbumpy (pwmData_sat_dc,句点);
    value_sat =(uint16_t)_IQsat (value,period,_IQ (0.0));
    
    //写入PWM数据
    pwm_write_cmpA(obj->pwmHandle[cnt],value_sat);
    }
    
    return;
    }// hal_writePwmData()函数结束 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉再次输入。 我做了两次检查,如果我更改了PWM占空比,gAdcData按预期工作(因此ADC HW正常,PWM初始化代码也正常),但方向不相反,我的意思是,如果gAdcData是固定的,则PWM输出永远不会改变。 我不知道,但我猜控制器会发生什么情况,可能是我错了。

    如有任何帮助,我们将不胜感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,问题已解决(cmd文件上出现错误)。 谢谢你。