Проблема с ШИМ с использованием DriverLib на MSP430FR5994 - PullRequest
0 голосов
/ 05 марта 2020

Я новичок в этом деле и работаю с MSP430FR5994.

Мне нужна программа, генерирующая 2 сигнала с частотой 2 кГц и рабочим циклом 50%, очень простая.

Я сделал простой код, который генерирует 2 сигнала с ШИМ, а зеленый и красный светодиоды на панели запуска показывают, какой сигнал включен.

Все работает нормально, кроме сигналов ШИМ. Я не знаю, если это проблема с настройкой таймера, но ШИМ не работает.

Я использую таймер B для генерации сигналов.

Я надеюсь, что вы можете мне помочь.

Спасибо !!

КОД:

#include "driverlib.h"
#include "msp430fr5994.h"


#define TIMER_PERIOD 511
#define DUTY_CYCLE   255



void configureGPIO()
                {
                GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); // LED RED
                GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN1); // LED GREEN
                GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION); // PWM P1.4

                GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION); // PWM P1.5               
                GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5, GPIO_PIN5); // Button P5.5
                }



void TurnOnPWMled1()
                {
                //configure Timer B_outputPWMParam for PWM1
                Timer_B_outputPWMParam param = {0};
                param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
                param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
                param.timerPeriod = TIMER_PERIOD;
                param.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_1; // TB0.1 -> P1.4
                param.compareOutputMode = TIMER_B_OUTPUTMODE_RESET_SET;
                param.dutyCycle = DUTY_CYCLE;
                Timer_B_outputPWM(TIMER_B0_BASE, &param);
                }

void TurnOnPWMled2(){

                //configure Timer B_outputPWMParam for PWM2
                Timer_B_outputPWMParam param = {0};
                param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
                param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
                param.timerPeriod = TIMER_PERIOD;
                param.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_2; // TB0.2 -> P1.5
                param.compareOutputMode = TIMER_B_OUTPUTMODE_RESET_SET;
                param.dutyCycle = DUTY_CYCLE;
                Timer_B_outputPWM(TIMER_B0_BASE, &param);
                }



void TurnOffPWMled1()
                {
                Timer_B_outputPWMParam param = {0};
                param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
                param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
                param.timerPeriod = TIMER_PERIOD;
                param.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_1; // TB0.2 -> P1.5
                param.compareOutputMode = TIMER_B_OUTPUTMODE_RESET_SET;
                param.dutyCycle = 0;
                Timer_B_outputPWM(TIMER_B0_BASE, &param);
                }


void TurnOffPWMled2()
                {
                Timer_B_outputPWMParam param = {0};
                param.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
                param.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
                param.timerPeriod = TIMER_PERIOD;
                param.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_2; // TB0.2 -> P1.5
                param.compareOutputMode = TIMER_B_OUTPUTMODE_RESET_SET;
                param.dutyCycle = 0;
                Timer_B_outputPWM(TIMER_B0_BASE, &param);
                }



void main(void) {

    WDT_A_hold(WDT_A_BASE);

    PMM_unlockLPM5();

    configureGPIO();

    unsigned int conteo=0;

    unsigned int i=0;


    while (1)    {

        if((GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN5))==0)                    // if the button is pressed...
                  {
                    switch (conteo)
                        {
                        case 0: // Green led turns on and the signal PWM1 activates.
                            GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN1);
                            GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
                            TurnOnPWMled1();
                            break;
                        case 1:// Green led turns off and red led turns on and the signal PWM2 activates.
                            GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN1);
                            GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
                            TurnOffPWMled1();
                            TurnOnPWMled2();
                            break;
                        case 2: // Signals and leds are off
                            GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN1);
                            GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
                            TurnOffPWMled2();
                            TurnOffPWMled1();
                            break;
                        case 3: // Both leds are on, signals off, ready to start
                            GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN1);
                            GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
                            break;
                        }

                    for (i=0;i<50000;i++); // delay

                    conteo++;

                    if (conteo>=4)
                       {conteo=0;}
              }
            }
          }

...