// Included Files #include "driverlib.h" #include "device.h" // #define EPWM_TIMER_TBPRD 166U // PWM Frequenz 300Khz für alle ePWMs #define Dead_Band_FED 10U // dead band FED, Totzeit im Fallingedge von 50ns #define Dead_Band_RED 10U // dead band RED, Totzeit im Risingedge von 50 ns // Globals float Ud1; float dutyCycle; uint32_t epwm1TZIntCount; // Function Prototypes void initEPWM1_Configuration(void); void initTZGPIO(void); __interrupt void epwm1TZISR(void); void initEPWMGPIO(void); void initADC(void); void initEPWM(void); void initADCSOC(void); __interrupt void adcA1ISR(void); //main void main(void) { epwm1TZIntCount = 0U; Interrupt_register(INT_EPWM1_TZ, &epwm1TZISR); initTZGPIO(); Device_init(); Device_initGPIO(); Interrupt_enable(INT_EPWM1_TZ); Interrupt_initModule(); Interrupt_initVectorTable(); Interrupt_register(INT_ADCA1, &adcA1ISR); initEPWMGPIO(); SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); initEPWM1_Configuration(); initADC(); initEPWM(); initADCSOC(); SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC); Interrupt_enable(INT_ADCA1); EINT; ERTM; while(1) { EPWM_enableADCTrigger(EPWM8_BASE, EPWM_SOC_A); EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_UP); EPWM_disableADCTrigger(EPWM8_BASE, EPWM_SOC_A); EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_STOP_FREEZE); } } __interrupt void epwm1TZISR(void) { epwm1TZIntCount++; // Toggle GPIO to notify when TZ is entered GPIO_togglePin(25); // Clear the flags - we will continue to take this interrupt until the TZ // pin goes high. EPWM_clearTripZoneFlag(EPWM1_BASE, (EPWM_TZ_INTERRUPT | EPWM_TZ_FLAG_CBC)); // Acknowledge this interrupt to receive more interrupts from group 2 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP2); } void initADC(void) { ADC_setVREF(ADCA_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V); // Referenz spannung 3.3Volt ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0); //Frequenz des ADC 100Mhz/Div4 = 25Mhz ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV); ADC_enableConverter(ADCA_BASE); DEVICE_DELAY_US(1000); } void initEPWM(void) { EPWM_disableADCTrigger(EPWM8_BASE, EPWM_SOC_A); EPWM_setADCTriggerSource(EPWM8_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPA); EPWM_setADCTriggerEventPrescale(EPWM8_BASE, EPWM_SOC_A, 1); EPWM_setCounterCompareValue(EPWM8_BASE, EPWM_COUNTER_COMPARE_A, 83); EPWM_setTimeBasePeriod(EPWM8_BASE, 166); // Frequenz der PWM8 600Khz EPWM_setTimeBaseCounterMode(EPWM8_BASE, EPWM_COUNTER_MODE_STOP_FREEZE); } void initADCSOC(void) { ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER6, ADC_TRIGGER_EPWM8_SOCA, ADC_CH_ADCIN6, 10); ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER6); ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1); ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); } __interrupt void adcA1ISR(void) { Ud1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER6); // Messung der ADC if (Ud1<819) { EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_FREEZE); } else { EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE); dutyCycle =(Ud1*EPWM_TIMER_TBPRD/4095); // Formel für die Berechnung von Duty_Cycle EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, dutyCycle); //DutyCycle für ePWM1A EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, (EPWM_TIMER_TBPRD-dutyCycle)); //DutyCycle für ePWM1B } ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1); } void initEPWM1_Configuration(void) // Konfiguration von ePWM1A für MOSFET A_HS (HV-Seite) mit Totzeit { // Enable TZ1 as one cycle-by-cycle trip sources EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC1); // Action on TZ1 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); // Enable TZ interrupt EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_CBC); EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); EPWM_setTimeBaseCounter(EPWM1_BASE, 0); EPWM_setTimeBasePeriod(EPWM1_BASE, EPWM_TIMER_TBPRD); EPWM_setPeriodLoadMode(EPWM1_BASE, EPWM_PERIOD_SHADOW_LOAD); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0); // Dead-Band for ePWM1A/B EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA); EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_RED,true); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED,true ); EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_A, false); EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_B, false); EPWM_setRisingEdgeDelayCount(EPWM1_BASE, Dead_Band_RED); EPWM_setFallingEdgeDelayCount(EPWM1_BASE, Dead_Band_FED); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); //Synchronize pulse when counting to zero } void initEPWMGPIO(void) { GPIO_setPadConfig(0, GPIO_PIN_TYPE_STD); GPIO_setPinConfig(GPIO_0_EPWM1A); GPIO_setPadConfig(1, GPIO_PIN_TYPE_STD); GPIO_setPinConfig(GPIO_1_EPWM1B); } void initTZGPIO(void) { // Set GPIO 58 as as Asynchronous input with pull up enabled GPIO_setPadConfig(58, GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(GPIO_58_GPIO58); GPIO_setDirectionMode(58, GPIO_DIR_MODE_IN); GPIO_setQualificationMode(58, GPIO_QUAL_ASYNC); // Set GPIO 58 as TZ1 input XBAR_setInputPin(XBAR_INPUT1, 58); // Configure GPIO 25 as general purpose GPIO for monitoring when the TZ // Interrupt has been entered GPIO_setPadConfig(25, GPIO_PIN_TYPE_STD); GPIO_setPinConfig(GPIO_25_GPIO25); GPIO_setDirectionMode(25, GPIO_DIR_MODE_OUT); }