Part Number: CCSTUDIO
I'm now trying to use eCAP1 to capture the period of ePWM1 and trigger an interrupt to read the captured value. Meanwhile, I want to use eCAP4 to capture the value of ePWM2, so as to calculate the phase difference between ePWM1 and ePWM2. However, the value captured by eCAP4 is always zero – when I debug online after entering the interrupt, both freq2 and duty2 are 0. Why is this happening?
main
#include "board.h"
#include "driverlib.h"
#include "device.h"
volatile uint16_t myADC0Result0;
volatile uint16_t myADC0Result1;
volatile float32_t ADC_ac;
volatile float32_t ADC_bus;
volatile float32_t ADC_ac_real;
volatile float32_t ADC_bus_real;
volatile float32_t ADC_ac_real_Abs;
volatile uint32_t cap1Count_pwm1 = 0;
volatile uint32_t cap2Count_pwm1 = 0;
volatile uint32_t cap3Count_pwm1= 0;
volatile uint32_t cap4Count_pwm1 = 0;
volatile uint32_t cap1Count_pwm2 = 0;
volatile uint32_t cap2Count_pwm2 = 0;
volatile uint32_t cap3Count_pwm2= 0;
volatile uint32_t cap4Count_pwm2= 0;
volatile uint32_t T1_pwm1;
volatile uint32_t T2_pwm1;
volatile uint32_t T1_pwm2;
volatile uint32_t T2_pwm2;
volatile uint32_t freq1=0;
volatile uint32_t duty1=0;
volatile uint32_t freq2=0;
volatile uint32_t duty2=0;
volatile uint32_t ECap1IntCount;
volatile uint32_t ECap1IntCount;
volatile uint32_t phase = 0;
/**
* main.c
*/
void main(void)
{
//
// 1. 设备基础初始化(时钟、看门狗、Flash)
//
Device_init();
//
// 2. 中断模块初始化 & 关闭全局中断
//
Interrupt_initModule();
Interrupt_initVectorTable();
//
// 3. SysConfig 自动生成的外设初始化
// (GPIO / EPWM / ADC / CPUTIMER / INTERRUPT 映射)
//
Board_init();
//
// 4. 初始化你自己的软件变量 / 状态机
//
//
// 5. 使能 CPU 中断
//
EINT; // Enable Global Interrupts
ERTM; // Enable Realtime Interrupts
// DINT;
//
// 6. 主循环(轻量逻辑 or 空转)
//
while(1)
{
}
}
__interrupt void INT_myECAP0_period_ISR(void)
{
uint32_t c1_1, c2_1, c3_1, c4_1;
uint32_t c1_2, c2_2, c3_2, c4_2;
uint32_t t1_1, t2_1, t1_2, t2_2;
uint32_t f1, d1, f2, d2;
int32_t ph;
ECap1IntCount++;
c1_1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_1);
c2_1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_2);
c3_1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_3);
c4_1 = ECAP_getEventTimeStamp(ECAP1_BASE, ECAP_EVENT_4);
c1_2 = ECAP_getEventTimeStamp(ECAP4_BASE, ECAP_EVENT_1);
c2_2 = ECAP_getEventTimeStamp(ECAP4_BASE, ECAP_EVENT_2);
c3_2 = ECAP_getEventTimeStamp(ECAP4_BASE, ECAP_EVENT_3);
c4_2 = ECAP_getEventTimeStamp(ECAP4_BASE, ECAP_EVENT_4);
t1_1 = c3_1 - c1_1;
t2_1 = c2_1 - c1_1;
t1_2 = c3_2 - c1_2;
t2_2 = c2_2 - c1_2;
if(t1_1 != 0U)
{
f1 = 50000000UL / t1_1;
d1 = (t2_1 * 100UL) / t1_1;
}
else
{
f1 = 0U;
d1 = 0U;
}
if(t1_2 != 0U)
{
f2 = 50000000UL / t1_2;
d2 = (t2_2 * 100UL) / t1_2;
}
else
{
f2 = 0U;
d2 = 0U;
}
ph = (int32_t)c1_2 - (int32_t)c1_1;
// 最后一次性写回全局变量
cap1Count_pwm1 = c1_1;
cap2Count_pwm1 = c2_1;
cap3Count_pwm1 = c3_1;
cap4Count_pwm1 = c4_1;
cap1Count_pwm2 = c1_2;
cap2Count_pwm2 = c2_2;
cap3Count_pwm2 = c3_2;
cap4Count_pwm2 = c4_2;
T1_pwm1 = t1_1;
T2_pwm1 = t2_1;
T1_pwm2 = t1_2;
T2_pwm2 = t2_2;
freq1 = f1;
duty1 = d1;
freq2 = f2;
duty2 = d2;
phase = ph;
//EPWM_setPhaseShift(myEPWM1_BASE, 0);
//EPWM_setPhaseShift(myEPWM1_BASE, 833);1667/2
ECAP_clearInterrupt(ECAP1_BASE, ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
ECAP_clearGlobalInterrupt(ECAP1_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP4);
}
board.c
/*
* Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "board.h"
//*****************************************************************************
//
// Board Configurations
// Initializes the rest of the modules.
// Call this function in your application if you wish to do all module
// initialization.
// If you wish to not use some of the initializations, instead of the
// Board_init use the individual Module_inits
//
//*****************************************************************************
void Board_init()
{
EALLOW;
PinMux_init();
INPUTXBAR_init();
SYNC_init();
ASYSCTL_init();
ECAP_init();
EPWM_init();
INTERRUPT_init();
EDIS;
}
//*****************************************************************************
//
// PINMUX Configurations
//
//*****************************************************************************
void PinMux_init()
{
//
// PinMux for modules assigned to CPU1
//
//
// EPWM1 -> myEPWM0 Pinmux
//
GPIO_setPinConfig(myEPWM0_EPWMA_PIN_CONFIG);
GPIO_setPadConfig(myEPWM0_EPWMA_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myEPWM0_EPWMA_GPIO, GPIO_QUAL_SYNC);
GPIO_setPinConfig(myEPWM0_EPWMB_PIN_CONFIG);
GPIO_setPadConfig(myEPWM0_EPWMB_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myEPWM0_EPWMB_GPIO, GPIO_QUAL_SYNC);
//
// EPWM2 -> myEPWM1 Pinmux
//
GPIO_setPinConfig(myEPWM1_EPWMA_PIN_CONFIG);
GPIO_setPadConfig(myEPWM1_EPWMA_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myEPWM1_EPWMA_GPIO, GPIO_QUAL_SYNC);
GPIO_setPinConfig(myEPWM1_EPWMB_PIN_CONFIG);
GPIO_setPadConfig(myEPWM1_EPWMB_GPIO, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(myEPWM1_EPWMB_GPIO, GPIO_QUAL_SYNC);
}
//*****************************************************************************
//
// ASYSCTL Configurations
//
//*****************************************************************************
void ASYSCTL_init(){
//
// asysctl initialization
//
// Disables the temperature sensor output to the ADC.
//
ASysCtl_disableTemperatureSensor();
//
// Set the analog voltage reference selection to external.
//
ASysCtl_setAnalogReferenceExternal( ASYSCTL_VREFHIA | ASYSCTL_VREFHIB | ASYSCTL_VREFHIC );
}
//*****************************************************************************
//
// ECAP Configurations
//
//*****************************************************************************
void ECAP_init(){
myECAP0_period_init();
myECAP1_phase_init();
}
void myECAP0_period_init(){
//
// Disable ,clear all capture flags and interrupts
//
ECAP_disableInterrupt(myECAP0_period_BASE,
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
ECAP_clearInterrupt(myECAP0_period_BASE,
(ECAP_ISR_SOURCE_CAPTURE_EVENT_1 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_2 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_3 |
ECAP_ISR_SOURCE_CAPTURE_EVENT_4 |
ECAP_ISR_SOURCE_COUNTER_OVERFLOW |
ECAP_ISR_SOURCE_COUNTER_PERIOD |
ECAP_ISR_SOURCE_COUNTER_COMPARE));
//
// Disables time stamp capture.
//
ECAP_disableTimeStampCapture(myECAP0_period_BASE);
//
// Stops Time stamp counter.
//
ECAP_stopCounter(myECAP0_period_BASE);
//
// Sets eCAP in Capture mode.
//
ECAP_enableCaptureMode(myECAP0_period_BASE);
//
// Sets the capture mode.
//
ECAP_setCaptureMode(myECAP0_period_BASE,ECAP_CONTINUOUS_CAPTURE_MODE,ECAP_EVENT_4);
//
// Sets the Capture event prescaler.
//
ECAP_setEventPrescaler(myECAP0_period_BASE, 0U);
//
// Sets the Capture event polarity.
//
ECAP_setEventPolarity(myECAP0_period_BASE,ECAP_EVENT_1,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(myECAP0_period_BASE,ECAP_EVENT_2,ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity(myECAP0_period_BASE,ECAP_EVENT_3,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(myECAP0_period_BASE,ECAP_EVENT_4,ECAP_EVNT_FALLING_EDGE);
//
// Configure counter reset on events
//
ECAP_disableCounterResetOnEvent(myECAP0_period_BASE,ECAP_EVENT_1);
ECAP_disableCounterResetOnEvent(myECAP0_period_BASE,ECAP_EVENT_2);
ECAP_disableCounterResetOnEvent(myECAP0_period_BASE,ECAP_EVENT_3);
ECAP_disableCounterResetOnEvent(myECAP0_period_BASE,ECAP_EVENT_4);
//
// Select eCAP input.
//
ECAP_selectECAPInput(myECAP0_period_BASE,ECAP_INPUT_INPUTXBAR1);
//
// Sets a phase shift value count.
//
ECAP_setPhaseShiftCount(myECAP0_period_BASE,0U);
//
// Disable counter loading with phase shift value.
//
ECAP_disableLoadCounter(myECAP0_period_BASE);
//
// Configures Sync out signal mode.
//
ECAP_setSyncOutMode(myECAP0_period_BASE,ECAP_SYNC_OUT_DISABLED);
//
// Configures emulation mode.
//
ECAP_setEmulationMode(myECAP0_period_BASE,ECAP_EMULATION_STOP);
//
// Starts Time stamp counter for myECAP0_period.
//
ECAP_startCounter(myECAP0_period_BASE);
//
// Enables time stamp capture for myECAP0_period.
//
ECAP_enableTimeStampCapture(myECAP0_period_BASE);
//
// Re-arms the eCAP module for myECAP0_period.
//
ECAP_reArm(myECAP0_period_BASE);
//
// Enables interrupt source for myECAP0_period.
//
ECAP_enableInterrupt(myECAP0_period_BASE,(ECAP_ISR_SOURCE_CAPTURE_EVENT_4));
}
void myECAP1_phase_init(){
//
// Disables time stamp capture.
//
ECAP_disableTimeStampCapture(myECAP1_phase_BASE);
//
// Stops Time stamp counter.
//
ECAP_stopCounter(myECAP1_phase_BASE);
//
// Sets eCAP in Capture mode.
//
ECAP_enableCaptureMode(myECAP1_phase_BASE);
//
// Sets the capture mode.
//
ECAP_setCaptureMode(myECAP1_phase_BASE,ECAP_CONTINUOUS_CAPTURE_MODE,ECAP_EVENT_4);
//
// Sets the Capture event prescaler.
//
ECAP_setEventPrescaler(myECAP1_phase_BASE, 0U);
//
// Sets the Capture event polarity.
//
ECAP_setEventPolarity(myECAP1_phase_BASE,ECAP_EVENT_1,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(myECAP1_phase_BASE,ECAP_EVENT_2,ECAP_EVNT_FALLING_EDGE);
ECAP_setEventPolarity(myECAP1_phase_BASE,ECAP_EVENT_3,ECAP_EVNT_RISING_EDGE);
ECAP_setEventPolarity(myECAP1_phase_BASE,ECAP_EVENT_4,ECAP_EVNT_FALLING_EDGE);
//
// Configure counter reset on events
//
ECAP_disableCounterResetOnEvent(myECAP1_phase_BASE,ECAP_EVENT_1);
ECAP_disableCounterResetOnEvent(myECAP1_phase_BASE,ECAP_EVENT_2);
ECAP_disableCounterResetOnEvent(myECAP1_phase_BASE,ECAP_EVENT_3);
ECAP_disableCounterResetOnEvent(myECAP1_phase_BASE,ECAP_EVENT_4);
//
// Select eCAP input.
//
ECAP_selectECAPInput(myECAP1_phase_BASE,ECAP_INPUT_INPUTXBAR2);
//
// Sets a phase shift value count.
//
ECAP_setPhaseShiftCount(myECAP1_phase_BASE,0U);
//
// Disable counter loading with phase shift value.
//
ECAP_disableLoadCounter(myECAP1_phase_BASE);
//
// Configures Sync out signal mode.
//
ECAP_setSyncOutMode(myECAP1_phase_BASE,ECAP_SYNC_OUT_DISABLED);
//
// Configures emulation mode.
//
ECAP_setEmulationMode(myECAP1_phase_BASE,ECAP_EMULATION_STOP);
//
// Starts Time stamp counter for myECAP1_phase.
//
ECAP_startCounter(myECAP1_phase_BASE);
//
// Enables time stamp capture for myECAP1_phase.
//
ECAP_enableTimeStampCapture(myECAP1_phase_BASE);
//
// Re-arms the eCAP module for myECAP1_phase.
//
ECAP_reArm(myECAP1_phase_BASE);
}
//*****************************************************************************
//
// EPWM Configurations
//
//*****************************************************************************
void EPWM_init(){
EPWM_setClockPrescaler(myEPWM0_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);
EPWM_setTimeBasePeriod(myEPWM0_BASE, 1667);
EPWM_setTimeBaseCounter(myEPWM0_BASE, 0);
EPWM_setTimeBaseCounterMode(myEPWM0_BASE, EPWM_COUNTER_MODE_UP);
EPWM_disablePhaseShiftLoad(myEPWM0_BASE);
EPWM_setPhaseShift(myEPWM0_BASE, 0);
EPWM_setSyncOutPulseMode(myEPWM0_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, 833);
EPWM_setCounterCompareShadowLoadMode(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, 0);
EPWM_setCounterCompareShadowLoadMode(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_disableActionQualifierShadowLoadMode(myEPWM0_BASE, EPWM_ACTION_QUALIFIER_A);
EPWM_setActionQualifierShadowLoadMode(myEPWM0_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_disableActionQualifierShadowLoadMode(myEPWM0_BASE, EPWM_ACTION_QUALIFIER_B);
EPWM_setActionQualifierShadowLoadMode(myEPWM0_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(myEPWM0_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM0_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM0_BASE);
EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM0_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM0_BASE);
EPWM_setClockPrescaler(myEPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_2);
EPWM_setTimeBasePeriod(myEPWM1_BASE, 1667);
EPWM_setTimeBaseCounter(myEPWM1_BASE, 0);
EPWM_setTimeBaseCounterMode(myEPWM1_BASE, EPWM_COUNTER_MODE_UP);
EPWM_enablePhaseShiftLoad(myEPWM1_BASE);
EPWM_setPhaseShift(myEPWM1_BASE, 0);
EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 833);
EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0);
EPWM_setCounterCompareShadowLoadMode(myEPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_disableActionQualifierShadowLoadMode(myEPWM1_BASE, EPWM_ACTION_QUALIFIER_A);
EPWM_setActionQualifierShadowLoadMode(myEPWM1_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_disableActionQualifierShadowLoadMode(myEPWM1_BASE, EPWM_ACTION_QUALIFIER_B);
EPWM_setActionQualifierShadowLoadMode(myEPWM1_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
EPWM_setActionQualifierAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
EPWM_setRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_disableRisingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);
EPWM_setFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_disableFallingEdgeDelayCountShadowLoadMode(myEPWM1_BASE);
}
//*****************************************************************************
//
// INPUTXBAR Configurations
//
//*****************************************************************************
void INPUTXBAR_init(){
epwm1a_init();
epwm2a_init();
}
void epwm1a_init(){
XBAR_setInputPin(epwm1a_INPUT, epwm1a_SOURCE);
}
void epwm2a_init(){
XBAR_setInputPin(epwm2a_INPUT, epwm2a_SOURCE);
}
//*****************************************************************************
//
// INTERRUPT Configurations
//
//*****************************************************************************
void INTERRUPT_init(){
// Interrupt Settings for INT_myECAP0_period
// ISR need to be defined for the registered interrupts
Interrupt_register(INT_myECAP0_period, &INT_myECAP0_period_ISR);
Interrupt_enable(INT_myECAP0_period);
}
//*****************************************************************************
//
// SYNC Scheme Configurations
//
//*****************************************************************************
void SYNC_init(){
SysCtl_setSyncOutputConfig(SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT);
//
// For EPWM1, the sync input is: SYSCTL_SYNC_IN_SRC_EXTSYNCIN1
//
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM4, SYSCTL_SYNC_IN_SRC_EXTSYNCIN1);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_EPWM7, SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_ECAP1, SYSCTL_SYNC_IN_SRC_EXTSYNCIN1);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_ECAP4, SYSCTL_SYNC_IN_SRC_EXTSYNCIN1);
SysCtl_setSyncInputConfig(SYSCTL_SYNC_IN_ECAP6, SYSCTL_SYNC_IN_SRC_EPWM1SYNCOUT);
//
// SOCA
//
SysCtl_enableExtADCSOCSource(0);
//
// SOCB
//
SysCtl_enableExtADCSOCSource(0);
}
board.h
/*
* Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef BOARD_H
#define BOARD_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//
// Included Files
//
#include "driverlib.h"
#include "device.h"
//*****************************************************************************
//
// PinMux Configurations
//
//*****************************************************************************
//
// EPWM1 -> myEPWM0 Pinmux
//
//
// EPWM1_A - GPIO Settings
//
#define GPIO_PIN_EPWM1_A 0
#define myEPWM0_EPWMA_GPIO 0
#define myEPWM0_EPWMA_PIN_CONFIG GPIO_0_EPWM1_A
//
// EPWM1_B - GPIO Settings
//
#define GPIO_PIN_EPWM1_B 1
#define myEPWM0_EPWMB_GPIO 1
#define myEPWM0_EPWMB_PIN_CONFIG GPIO_1_EPWM1_B
//
// EPWM2 -> myEPWM1 Pinmux
//
//
// EPWM2_A - GPIO Settings
//
#define GPIO_PIN_EPWM2_A 2
#define myEPWM1_EPWMA_GPIO 2
#define myEPWM1_EPWMA_PIN_CONFIG GPIO_2_EPWM2_A
//
// EPWM2_B - GPIO Settings
//
#define GPIO_PIN_EPWM2_B 3
#define myEPWM1_EPWMB_GPIO 3
#define myEPWM1_EPWMB_PIN_CONFIG GPIO_3_EPWM2_B
//*****************************************************************************
//
// ASYSCTL Configurations
//
//*****************************************************************************
//*****************************************************************************
//
// ECAP Configurations
//
//*****************************************************************************
#define myECAP0_period_BASE ECAP1_BASE
#define myECAP0_period_SIGNAL_MUNIT_BASE ECAP1SIGNALMONITORING_BASE
void myECAP0_period_init();
#define myECAP1_phase_BASE ECAP4_BASE
#define myECAP1_phase_SIGNAL_MUNIT_BASE ECAP4SIGNALMONITORING_BASE
void myECAP1_phase_init();
//*****************************************************************************
//
// EPWM Configurations
//
//*****************************************************************************
#define myEPWM0_BASE EPWM1_BASE
#define myEPWM0_TBPRD 1667
#define myEPWM0_COUNTER_MODE EPWM_COUNTER_MODE_UP
#define myEPWM0_TBPHS 0
#define myEPWM0_CMPA 833
#define myEPWM0_CMPB 0
#define myEPWM0_CMPC 0
#define myEPWM0_CMPD 0
#define myEPWM0_DBRED 0
#define myEPWM0_DBFED 0
#define myEPWM0_TZA_ACTION EPWM_TZ_ACTION_HIGH_Z
#define myEPWM0_TZB_ACTION EPWM_TZ_ACTION_HIGH_Z
#define myEPWM0_INTERRUPT_SOURCE EPWM_INT_TBCTR_DISABLED
#define myEPWM1_BASE EPWM2_BASE
#define myEPWM1_TBPRD 1667
#define myEPWM1_COUNTER_MODE EPWM_COUNTER_MODE_UP
#define myEPWM1_TBPHS 0
#define myEPWM1_CMPA 833
#define myEPWM1_CMPB 0
#define myEPWM1_CMPC 0
#define myEPWM1_CMPD 0
#define myEPWM1_DBRED 0
#define myEPWM1_DBFED 0
#define myEPWM1_TZA_ACTION EPWM_TZ_ACTION_HIGH_Z
#define myEPWM1_TZB_ACTION EPWM_TZ_ACTION_HIGH_Z
#define myEPWM1_INTERRUPT_SOURCE EPWM_INT_TBCTR_DISABLED
//*****************************************************************************
//
// INPUTXBAR Configurations
//
//*****************************************************************************
#define epwm1a_SOURCE 0
#define epwm1a_INPUT XBAR_INPUT1
void epwm1a_init();
#define epwm2a_SOURCE 2
#define epwm2a_INPUT XBAR_INPUT2
void epwm2a_init();
//*****************************************************************************
//
// INTERRUPT Configurations
//
//*****************************************************************************
// Interrupt Settings for INT_myECAP0_period
// ISR need to be defined for the registered interrupts
#define INT_myECAP0_period INT_ECAP1
#define INT_myECAP0_period_INTERRUPT_ACK_GROUP INTERRUPT_ACK_GROUP4
extern __interrupt void INT_myECAP0_period_ISR(void);
//*****************************************************************************
//
// SYNC Scheme Configurations
//
//*****************************************************************************
//*****************************************************************************
//
// Board Configurations
//
//*****************************************************************************
void Board_init();
void ASYSCTL_init();
void ECAP_init();
void EPWM_init();
void INPUTXBAR_init();
void INTERRUPT_init();
void SYNC_init();
void PinMux_init();
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // end of BOARD_H definition