我使用的28068FFPT芯片,自己做的硬件,运行SPIN_FOC例程lab10c的程序,发现AD运行一次三相电流电压就不更新了,dcBus的值时有时无(如下图),中断运行都正常,请问这是什么原因。
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.
跟编译器的版本有关系吗,编译时有个警示需要6.2.3的版本,我用的CCS5.5,编译器是6.2.0的
还有就是gMotorVars.Flag_enableSys标志不使能的情况下,AD是否持续转换?
建议检查下你的ADC中断的触发源是否有相应改变:
// configure the interrupt sources
ADC_disableInt(obj->adcHandle,ADC_IntNumber_1);
ADC_setIntMode(obj->adcHandle,ADC_IntNumber_1,ADC_IntMode_ClearFlag);
ADC_setIntSrc(obj->adcHandle,ADC_IntNumber_1,ADC_IntSrc_EOC7);
Jianwei,
你用哪个lab程序试的?建议用lab3a不带电机,先试下offset计算,一般电流的三个值一样,在0.9~1.05左右,电压三个值一样,220V输入则为0.38左右,则证明是正常的;按照你的截图,说明ADC采样不对,具体是软件还是硬件,需要排查,先检查ADC和PWM的初始化程序和user.h的设置。
你是哪的客户?可以联系当地的代理商或TI的FAE帮忙。
Jianwei,
lab3a跑出来的值不对的,应该还是ADC和PWM的配置方面。你把这部分的原理图截图和配置代码发上来看看。你是哪里的,最好联系支持贵司的代理商的FAE现场帮你看看,这样效率高些。
Martin Yu 你好,
我的电压采样对技术文档差不多,电阻降压后经过运放,850V输出3.3V,正常输入是380V。母线就是540V。测量板子上母线电压输入到芯片引脚是1.805V
三相输出电压到芯片引脚是0V,电流采样用的霍尔传感器正负4V出0-3.3V。现在无电流时进芯片是1.65V。ADC和PWM改动较少,主要是通道,寄存器配置没怎么动。修改了几个地方做有注示,用lab03试验时PWM波形很正常,会连续变动,主要还是看不到AD转的值。
void HAL_setupAdcs(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// disable the ADCs
ADC_disable(obj->adcHandle);
// power up the bandgap circuit
ADC_enableBandGap(obj->adcHandle);
// set the ADC voltage reference source to internal
ADC_setVoltRefSrc(obj->adcHandle,ADC_VoltageRefSrc_Int);
// enable the ADC reference buffers
ADC_enableRefBuffers(obj->adcHandle);
// Set main clock scaling factor (max45MHz clock for the ADC module)
ADC_setDivideSelect(obj->adcHandle,ADC_DivideSelect_ClkIn_by_2);
// power up the ADCs
ADC_powerUp(obj->adcHandle);
// enable the ADCs
ADC_enable(obj->adcHandle);
// set the ADC interrupt pulse generation to prior
ADC_setIntPulseGenMode(obj->adcHandle,ADC_IntPulseGenMode_Prior);
// set the temperature sensor source to external
ADC_setTempSensorSrc(obj->adcHandle,ADC_TempSensorSrc_Ext);
// configure the interrupt sources
ADC_disableInt(obj->adcHandle,ADC_IntNumber_1);
ADC_setIntMode(obj->adcHandle,ADC_IntNumber_1,ADC_IntMode_ClearFlag);
ADC_setIntSrc(obj->adcHandle,ADC_IntNumber_1,ADC_IntSrc_EOC7);
//configure the SOCs for hvkit_rev1p1
// EXT IA-FB
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_0,ADC_SocChanNumber_A1);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_0,ADC_SocChanNumber_A0); //changed by xjw
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_0,ADC_SocSampleDelay_9_cycles);
// EXT IA-FB
// Duplicate conversion due to ADC Initial Conversion bug (SPRZ342)
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,ADC_SocChanNumber_A1);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,ADC_SocChanNumber_A0); //changed by xjw IA=ADCA0
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_1,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_1,ADC_SocSampleDelay_9_cycles);
// EXT IB-FB
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_2,ADC_SocChanNumber_B1);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_2,ADC_SocChanNumber_A1); //changed by xjw IB=ADCA1
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_2,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_2,ADC_SocSampleDelay_9_cycles);
// EXT IC-FB
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_3,ADC_SocChanNumber_A3);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_3,ADC_SocChanNumber_A2); //changed by xjw IC=ADCA2
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_3,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_3,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb1
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_4,ADC_SocChanNumber_B7);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_4,ADC_SocChanNumber_A4); //changed by xjw UA=ADCA4
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_4,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_4,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb2
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_5,ADC_SocChanNumber_B6);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_5,ADC_SocChanNumber_A5); //changed by xjw UB=ADCA5
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_5,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_5,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb3
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_6,ADC_SocChanNumber_B4);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_6,ADC_SocChanNumber_A6); //changed by xjw UC=ADCA6
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_6,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_6,ADC_SocSampleDelay_9_cycles);
// VDCBUS
//ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_7,ADC_SocChanNumber_A7);
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_7,ADC_SocChanNumber_A3); //changed by xjw UDCBUS=ADCA3
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_7,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_7,ADC_SocSampleDelay_9_cycles);
return;
} // end of HAL_setupAdcs() function
void HAL_setupPwms(HAL_Handle handle,
const uint_least16_t systemFreq_MHz,
const float_t pwmPeriod_usec,
const uint_least16_t numPwmTicksPerIsrTick)
{
HAL_Obj *obj = (HAL_Obj *)handle;
uint16_t halfPeriod_cycles = (uint16_t)((float_t)systemFreq_MHz*pwmPeriod_usec) >> 1;
uint_least8_t cnt;
// turns off the outputs of the EPWM peripherals which will put the power switches
// into a high impedance state.
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_1]);
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_2]);
PWM_setOneShotTrip(obj->pwmHandle[PWM_Number_3]);
for(cnt=0;cnt<3;cnt++)
{
// setup the Time-Base Control Register (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);
// setup the Timer-Based Phase Register (TBPHS)
PWM_setPhase(obj->pwmHandle[cnt],0);
// setup the Time-Base Counter Register (TBCTR)
PWM_setCount(obj->pwmHandle[cnt],0);
// setup the Time-Base Period Register (TBPRD)
// set to zero initially
PWM_setPeriod(obj->pwmHandle[cnt],0);
// setup the Counter-Compare Control Register (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);
// setup the Action-Qualifier Output A Register (AQCTLA)
PWM_setActionQual_CntUp_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_Set);
PWM_setActionQual_CntDown_CmpA_PwmA(obj->pwmHandle[cnt],PWM_ActionQual_Clear);
// setup the Dead-Band Generator Control Register (DBCTL)
PWM_setDeadBandOutputMode(obj->pwmHandle[cnt],PWM_DeadBandOutputMode_EPWMxA_Rising_EPWMxB_Falling);
// PWM_setDeadBandPolarity(obj->pwmHandle[cnt],PWM_DeadBandPolarity_EPWMxB_Inverted);
PWM_setDeadBandPolarity(obj->pwmHandle[cnt],PWM_DeadBandPolarity_EPWMxA_Inverted); //changed by xjw
// setup the Dead-Band Rising Edge Delay Register (DBRED)
PWM_setDeadBandRisingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBRED_CNT);
// setup the Dead-Band Falling Edge Delay Register (DBFED)
PWM_setDeadBandFallingEdgeDelay(obj->pwmHandle[cnt],HAL_PWM_DBFED_CNT);
// setup the PWM-Chopper Control Register (PCCTL)
PWM_disableChopping(obj->pwmHandle[cnt]);
// setup the Trip Zone Select Register (TZSEL)
PWM_disableTripZones(obj->pwmHandle[cnt]);
}
// setup the Event Trigger Selection Register (ETSEL)
PWM_disableInt(obj->pwmHandle[PWM_Number_1]);
PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualZero);
PWM_enableSocAPulse(obj->pwmHandle[PWM_Number_1]);
// setup the Event Trigger Prescale Register (ETPS)
if(numPwmTicksPerIsrTick == 3)
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_ThirdEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_ThirdEvent);
}
else if(numPwmTicksPerIsrTick == 2)
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_SecondEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_SecondEvent);
}
else
{
PWM_setIntPeriod(obj->pwmHandle[PWM_Number_1],PWM_IntPeriod_FirstEvent);
PWM_setSocAPeriod(obj->pwmHandle[PWM_Number_1],PWM_SocPeriod_FirstEvent);
}
// setup the Event Trigger Clear Register (ETCLR)
PWM_clearIntFlag(obj->pwmHandle[PWM_Number_1]);
PWM_clearSocAFlag(obj->pwmHandle[PWM_Number_1]);
// first step to synchronize the pwms
CLK_disableTbClockSync(obj->clkHandle);
// since the PWM is configured as an up/down counter, the period register is set to one-half
// of the desired PWM period
PWM_setPeriod(obj->pwmHandle[PWM_Number_1],halfPeriod_cycles);
PWM_setPeriod(obj->pwmHandle[PWM_Number_2],halfPeriod_cycles);
PWM_setPeriod(obj->pwmHandle[PWM_Number_3],halfPeriod_cycles);
// last step to synchronize the pwms
CLK_enableTbClockSync(obj->clkHandle);
return;
} // end of HAL_setupPwms() function