Part Number:MSP432P401R
I am trying to build a car with obstruction detection using analog output proximity sensors. The problem is whenever I integrate the PWM module for moving the vehicle and the proximity sensors, the PWM does not update (I measured the with an oscilloscope). The weird thing is that whenever I step into the program line by line, the PWM updates but if irun the program it doesnt update.
Below is the code I currently have.
Timer_A_PWMConfig servoConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK,
TIMER_A_CLOCKSOURCE_DIVIDER_1,
1300,
TIMER_A_CAPTURECOMPARE_REGISTER_1,
TIMER_A_OUTPUTMODE_RESET_SET,
94 //center
};
/* Timer_A Servo PWM Configuration Parameter */
Timer_A_PWMConfig motorConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK,
TIMER_A_CLOCKSOURCE_DIVIDER_1,
1300,
TIMER_A_CAPTURECOMPARE_REGISTER_2,
TIMER_A_OUTPUTMODE_RESET_SET,
75
};
int main(void)
{
/* Halting WDT */
MAP_WDT_A_holdTimer();
MAP_Interrupt_disableSleepOnIsrExit();
/* Zero-filling buffer */
memset(resultsBuffer, 0x00, 8);
/* Setting MCLK to REFO at 128Khz for LF mode
* Setting SMCLK to 64Khz */
MAP_CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);
//MAP_CS_initClockSignal(CS_MCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
MAP_CS_initClockSignal(CS_SMCLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_2);
MAP_PCM_setPowerState(PCM_AM_LF_VCORE0);
/* Configuring GPIO2.4 as peripheral output for PWM and P1.1 for button
* interrupt */
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5,GPIO_PRIMARY_MODULE_FUNCTION);
/* Configuring Timer_A to have a period of approximately 500ms and
* an initial duty cycle of 10% of that (3200 ticks) */
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &servoConfig);
/* Configuring Timer_A to have a period of approximately 500ms and
* an initial duty cycle of 10% of that (3200 ticks) */
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
/* Configuring GPIO2.4 as peripheral output for PWM and P1.1 for button
* interrupt */
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5,GPIO_PRIMARY_MODULE_FUNCTION);
/* Initializing ADC (MCLK/64/8) */
MAP_ADC14_enableModule();
MAP_ADC14_initModule(ADC_CLOCKSOURCE_MCLK, ADC_PREDIVIDER_64, ADC_DIVIDER_8,
0);
/* Configuring GPIOs for Analog In */
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,
GPIO_PIN5 | GPIO_PIN4 | GPIO_PIN3 | GPIO_PIN2 | GPIO_PIN1
| GPIO_PIN0, GPIO_TERTIARY_MODULE_FUNCTION);
MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4,
GPIO_PIN7 | GPIO_PIN6, GPIO_TERTIARY_MODULE_FUNCTION);
MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
/* Configuring ADC Memory (ADC_MEM0 - ADC_MEM7 (A0 - A2) with repeat)*/
MAP_ADC14_configureMultiSequenceMode(ADC_MEM0, ADC_MEM2, true);
MAP_ADC14_configureConversionMemory(ADC_MEM0,
ADC_VREFPOS_INTBUF_VREFNEG_VSS,
ADC_INPUT_A0, false);
MAP_ADC14_configureConversionMemory(ADC_MEM1,
ADC_VREFPOS_INTBUF_VREFNEG_VSS,
ADC_INPUT_A1, false);
MAP_ADC14_configureConversionMemory(ADC_MEM2,
ADC_VREFPOS_INTBUF_VREFNEG_VSS,
ADC_INPUT_A6, false);
/* Enabling the interrupt when a conversion on channel 7 (end of sequence)
* is complete and enabling conversions */
MAP_ADC14_enableInterrupt(ADC_INT2);
/* Enabling Interrupts */
MAP_Interrupt_enableInterrupt(INT_ADC14);
MAP_Interrupt_enableMaster();
/* Setting up the sample timer to automatically step through the sequence
* convert.
*/
MAP_ADC14_enableSampleTimer(ADC_AUTOMATIC_ITERATION);
/* Triggering the start of the sample */
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger();
__delay_cycles(20000);
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
motorConfig.dutyCycle = 90;
/* Going to sleep */
while (1)
{
//MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
/*
if(ADC_SampleComplete == 1){
if((resultsBuffer[0] > 11000) | (resultsBuffer[1] > 11000) | (resultsBuffer[2] > 11000)){
motorConfig.dutyCycle = 70;
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
//MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
}
else{
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
motorConfig.dutyCycle = 97;
// MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
}
}
*/
// MAP_PCM_gotoLPM0();
}
}
/* This interrupt is fired whenever a conversion is completed and placed in
* ADC_MEM7. This signals the end of conversion and the results array is
* grabbed and placed in resultsBuffer */
void ADC14_IRQHandler(void)
{
uint64_t status;
status = MAP_ADC14_getEnabledInterruptStatus();
ADC_SampleComplete = 0;
if(status & ADC_INT2)
{
resultsBuffer[0] = MAP_ADC14_getResult(ADC_MEM0);
resultsBuffer[1] = MAP_ADC14_getResult(ADC_MEM1);
resultsBuffer[2] = MAP_ADC14_getResult(ADC_MEM2);
ADC_SampleComplete = 1;
if((resultsBuffer[0] > 11000) | (resultsBuffer[1] > 11000) | (resultsBuffer[2] > 11000)){
motorConfig.dutyCycle = 70;
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
}
else {
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
motorConfig.dutyCycle = 97;
MAP_Timer_A_generatePWM(TIMER_A0_BASE, &motorConfig);
}
}
MAP_ADC14_clearInterruptFlag(status);
}