TimerA: ¿Cómo obtener PWM en la configuración de upMode? (TI MSP432 Launchpad)

0

Intento usar la configuración del temporizador UpModeA en MSP para obtener PWM con Duty Cyle. Así que aquí está mi código a continuación:

#include "msp432.h"
#include "driverlib.h"

void SetConfiguation(void);

int main(void) 
{
    WDT_A_holdTimer();
    SetConfiguation();
    while(1);
}

void SetConfiguation(void)
{

    Interrupt_disableMaster();

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);
    CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_128);

    /* TimerA UpMode Configuration Parameter */
    Timer_A_UpModeConfig upConfig =
    {
            TIMER_A_CLOCKSOURCE_SMCLK,              // SMCLK Clock SOurce
            TIMER_A_CLOCKSOURCE_DIVIDER_64,          // SCLK/64 = 24MHz/128/64 = 2929 Hz
            24,                           // 50000 tick period
            TIMER_A_TAIE_INTERRUPT_ENABLE,         // Enable Timer interrupt
            TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // Enable CCR0 interrupt
            //TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,     // Disable CCR0 interrupt
            TIMER_A_DO_CLEAR                      // Clear value
    };

    P1DIR |= BIT0;
    P1OUT &= ~BIT0;

    Timer_A_configureUpMode(TIMER_A0_MODULE, &upConfig);

    Timer_A_CompareModeConfig compConfig =
    {
        //uint_fast16_t compareRegister;
        TIMER_A_CAPTURECOMPARE_REGISTER_1,
        //uint_fast16_t compareInterruptEnable;
        TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
        //uint_fast16_t compareOutputMode;
        //TIMER_A_OUTPUTMODE_SET_RESET,
        TIMER_A_OUTPUTMODE_TOGGLE_RESET,
        //uint_fast16_t compareValue;
        6
    };

    Timer_A_initCompare(TIMER_A0_MODULE, &compConfig);

    //Timer_A_enableCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
    Timer_A_enableCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_1);

    Interrupt_enableInterrupt(INT_TA0_0);

    PCM_setCoreVoltageLevel(PCM_VCORE0);
    PCM_setPowerState(PCM_AM_LDO_VCORE0);

    Timer_A_startCounter(TIMER_A0_MODULE, TIMER_A_UP_MODE);
    Interrupt_enableMaster();
}


void Port1IsrHandler(void)
{

}

void Timer_AIsrHandler(void)
{
    Timer_A_clearCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
    Timer_A_clearCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_1);
    Timer_A_clearInterruptFlag(TIMER_A0_MODULE);
    P1OUT ^= 1;

}

En el Código, upMode funciona bien, las interrupciones funcionan bien, así que obtengo 60 Hz de lo que quiero. Pero, para obtener PWM con un ciclo de trabajo dispuesto, necesito usar el modo de comparación. Así que estructuré compConfig como se ve en el código. Sin embargo, parece que no se crea una interrupción para el modo de comparación. Utilizo compare_register1 para atrapar la interrupción, pero si pongo o no la habilitación para comparar la interrupción, el resultado es el mismo. No tiene efecto en la salida. Entonces, ¿dónde estoy haciendo mal aquí? ¿Cuál es la forma correcta de lograr PWM ajustable?

    
pregunta Alper91

1 respuesta

1

Problema resuelto. Olvidé habilitar la interrupción INT_TA0_N que incluye CCR1 a CCR7 vector. En este caso, CCR1 determina el Ciclo de trabajo, por lo que acabo de agregar una Interrupción más a NVIC y habilitar la interrupción. El nuevo código es así:

#include "msp432.h"
#include "driverlib.h"

void SetConfiguation(void);

int main(void) 
{
    WDT_A_holdTimer();
    SetConfiguation();
    while(1);
}

void SetConfiguation(void)
{

    Interrupt_disableMaster();

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);
    CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_128);

    /*
    Timer_A_UpModeConfig upConfig =
    {
            TIMER_A_CLOCKSOURCE_SMCLK,              // SMCLK Clock SOurce
            TIMER_A_CLOCKSOURCE_DIVIDER_64,          // SCLK/64 = 24MHz/128/64 = 2929 Hz
            24,                           // 50000 tick period
            TIMER_A_TAIE_INTERRUPT_ENABLE,         // Enable Timer interrupt
            TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE ,    // Enable CCR0 interrupt
            //TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,     // Disable CCR0 interrupt
            TIMER_A_DO_CLEAR                      // Clear value
    };
    */
    Timer_A_PWMConfig pwmConf =
    {
        //uint_fast16_t clockSource;
        TIMER_A_CLOCKSOURCE_SMCLK,
        //uint_fast16_t clockSourceDivider;
        TIMER_A_CLOCKSOURCE_DIVIDER_64,
        //uint_fast16_t timerPeriod;
        1600,
        //uint_fast16_t compareRegister;
        TIMER_A_CAPTURECOMPARE_REGISTER_1,
        //uint_fast16_t compareOutputMode;
        TIMER_A_OUTPUTMODE_SET_RESET,
        //uint_fast16_t dutyCycle;
        200
    };

    Timer_A_generatePWM(TIMER_A0_MODULE, &pwmConf);

    P1DIR |= BIT0;
    P1OUT &= ~BIT0;

    //Timer_A_configureUpMode(TIMER_A0_MODULE, &upConfig);
    /*
    Timer_A_CompareModeConfig compConfig =
    {
        //uint_fast16_t compareRegister;
        TIMER_A_CAPTURECOMPARE_REGISTER_1,
        //uint_fast16_t compareInterruptEnable;
        TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE,
        //uint_fast16_t compareOutputMode;
        TIMER_A_OUTPUTMODE_SET_RESET,
        //TIMER_A_OUTPUTMODE_TOGGLE_RESET,
        //uint_fast16_t compareValue;
        6
    };
    */
    //Timer_A_initCompare(TIMER_A0_MODULE, &compConfig);

    Timer_A_enableCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
    Timer_A_enableCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_1);

    Interrupt_enableInterrupt(INT_TA0_0);
    Interrupt_enableInterrupt(INT_TA0_N);

    PCM_setCoreVoltageLevel(PCM_VCORE0);
    PCM_setPowerState(PCM_AM_LDO_VCORE0);

    //Timer_A_startCounter(TIMER_A0_MODULE, TIMER_A_UP_MODE);
    Interrupt_enableMaster();
}


void Port1IsrHandler(void)
{

}

void Timer_AIsrHandler(void)
{
    Timer_A_clearCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
    //Timer_A_clearCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_1);
    //Timer_A_clearInterruptFlag(TIMER_A0_MODULE);
    P1OUT ^= 1;

}

void Timer_A_N_IsrHandler(void)
{
    Timer_A_clearCaptureCompareInterrupt(TIMER_A0_MODULE, TIMER_A_CAPTURECOMPARE_REGISTER_1);
    P1OUT ^= 1;
}
    
respondido por el Alper91

Lea otras preguntas en las etiquetas