Hello, i am using Instaspin MCU TMS320F28027F and want to use small MCU to sample voltages and currents on a hot side, i have an idea how to make it, but i want someone more experienced to check it. PWM will generate interrupt instead of SOC, in interrupt i notify ADC to start conversion by setting GPIO pin high, waiting 2uS (to complete conversion) and then start receiving 16 bytes by SPI, but i dont know how to implement it better, because DMA doesnt work with SPI and SPI FIFO is only 4 half-words deep. I have an idea to receive each byte in interrupt until we receive all 16, and then run FOC.
Here is what i changed. Changes in main()
HAL_enableAdcInts(halHandle); to HAL_enablePwmInt(halHandle);
In HAL_setupPwms()
PWM_disableInt(obj->pwmHandle[PWM_Number_1]); PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualZero); PWM_enableSocAPulse(obj->pwmHandle[PWM_Number_1]); to PWM_disableSocAPulse(obj->pwmHandle[PWM_Number_1]); PWM_enableInt(obj->pwmHandle[PWM_Number_1]); PWM_setIntMode(obj->pwmHandle[PWM_Number_1], PWM_IntMode_CounterEqualZero);
Changed HAL_SetTrigger()
static inline void HAL_setTrigger(HAL_Handle handle,const SVGENCURRENT_IgnoreShunt_e ignoreShunt,const int16_t minwidth, const int16_t cmpOffset) { HAL_Obj *obj = (HAL_Obj *)handle; PWM_Obj *pwm1 = (PWM_Obj *)obj->pwmHandle[PWM_Number_1]; PWM_Obj *pwm2 = (PWM_Obj *)obj->pwmHandle[PWM_Number_2]; PWM_Obj *pwm3 = (PWM_Obj *)obj->pwmHandle[PWM_Number_3]; PWM_Obj *pwm; uint16_t nextPulse1 = (pwm1->CMPA + pwm1->CMPAM) / 2; uint16_t nextPulse2 = (pwm2->CMPA + pwm2->CMPAM) / 2; uint16_t nextPulse3 = (pwm3->CMPA + pwm3->CMPAM) / 2; uint16_t pwmCMPA1 = pwm1->CMPA; uint16_t pwmCMPA2 = pwm2->CMPA; uint16_t pwmCMPA3 = pwm3->CMPA; int16_t offset; if(ignoreShunt == use_all) { if((nextPulse1 <= nextPulse2) && (nextPulse1 <= nextPulse3)) { pwm = pwm1; } else if((nextPulse2 <= nextPulse1) && (nextPulse2 <= nextPulse3)) { pwm = pwm2; } else { pwm = pwm3; } } else if(ignoreShunt == ignore_a) { offset = pwmCMPA1 + cmpOffset; } else if(ignoreShunt == ignore_b) { offset = pwmCMPA2 + cmpOffset; } else if(ignoreShunt == ignore_c) { offset = pwmCMPA3 + cmpOffset; } else if(ignoreShunt == ignore_ab) { if(pwmCMPA1 > pwmCMPA2) { offset = pwmCMPA1 + cmpOffset; } else { offset = pwmCMPA2 + cmpOffset; } } else if(ignoreShunt == ignore_ac) { if(pwmCMPA1 > pwmCMPA3) { offset = pwmCMPA1 + cmpOffset; } else { offset = pwmCMPA3 + cmpOffset; } } else // when ignoreShunt == ignore_bc { if(pwmCMPA2 > pwmCMPA3) { offset = pwmCMPA2 + cmpOffset; } else { offset = pwmCMPA3 + cmpOffset; } } 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_1],PWM_SocPulseSrc_CounterEqualCmpBDecr); PWM_setIntMode(obj->pwmHandle[PWM_Number_1], PWM_IntMode_CounterEqualCmpBDecr); } else { pwm1->CMPB = ((pwm->CMPA + pwm->DBFED) - pwm->CMPAM ) / 2 + 1; //PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBIncr); PWM_setIntMode(obj->pwmHandle[PWM_Number_1], PWM_IntMode_CounterEqualCmpBIncr); } } else { pwm1->CMPB = offset; //PWM_setSocAPulseSrc(obj->pwmHandle[PWM_Number_1],PWM_SocPulseSrc_CounterEqualCmpBIncr); PWM_setIntMode(obj->pwmHandle[PWM_Number_1], PWM_IntMode_CounterEqualCmpBIncr); } return; }
Added PWM interrupt vector
static inline void HAL_initIntVectorTable(HAL_Handle handle) { HAL_Obj *obj = (HAL_Obj *)handle; PIE_Obj *pie = (PIE_Obj *)obj->pieHandle; ENABLE_PROTECTED_REGISTER_WRITE_MODE; //pie->ADCINT1 = &mainISR; // Dont know yet what will trigger mainISR pie->EPWM1_INT = &startConvISR; DISABLE_PROTECTED_REGISTER_WRITE_MODE; return; }
Also created ISR for PWM int
interrupt void startConvISR(void) { HAL_acqPwmInt(halHandle, PWM_Number_1); // Notify external ADC return; }