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.
工具/软件:Code Composer Studio
尊敬的各位:
到目前为止,我一直在使用基于bootxldrv8301_RevB开发套件的TMS320F2.8027万硬件设计来控制PMSM电机。 现在,我有一个新的硬件设计,其中包括TMS320F2.8054万。 开关,按钮,SPI等工作正常,但PWM输出不正常,因此电机不旋转。 通过示波器观察信号,PWM占空比为50 % ,频率为30 KHz (正确)。 如果我修改速度参考,则不会发生任何变化,PWM也不会改变。
让我简单地解释一下我所做的事情:
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上的任何重要变化。
提前感谢您的帮助,我们将不胜感激。
您好,Kris,
我正在使用自己的硬件和 软件。 使用旧的微控制器(TMS320F2.8027万F),我也在使用自己的硬件和软件,但这两种设计都是 基于bootxldrv8301_RevB和LaunchpadXL。
现在,有了新的硬件,我只对硬件和GPIO模块做了一些更改,但电机不会旋转。 这些天我做了更多的测试:
我想问题可能出在 CTRL_RUN函数中,所以SVGEN_RUN返回错误的占空比,但我完全丢失了:-(.
感谢你的帮助。
马斯基,
感谢您提供额外信息。
您是否能够发布以下内容:
- PWM初始化代码
-您在主ISR中所做的更改,可解决此问题
来自HAL_writePwmData的相关部分
您是否尝试过创建变量并记录代码不起作用时HAL_writePwmData使用的值? 最好能看到实际写入的内容,因为它听起来像是不正确的值或可能是坏的阴影活动负载计时。
谢谢!
克里斯
您好,Kris,
为了澄清,这一问题没有得到解决。 我只检查 了HAL_writePwmData是否按预期工作。 下面是您需要的信息:
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()函数结束
中断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()函数
//! \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()函数结束