Я новичок в этом деле и работаю с 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, ¶m);
}
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, ¶m);
}
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, ¶m);
}
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, ¶m);
}
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;}
}
}
}