Part Number: MSP432P401R
Tool/software: Code Composer Studio
Timer_A_PWMConfig pwmConfig = { //uint_fast16_t clockSource; TIMER_A_CLOCKSOURCE_SMCLK, //uint_fast16_t clockSourceDivider; TIMER_A_CLOCKSOURCE_DIVIDER_1, //uint_fast16_t timerPeriod; 1280, //uint_fast16_t compareRegister; TIMER_A_CAPTURECOMPARE_REGISTER_2, //uint_fast16_t compareOutputMode; TIMER_A_OUTPUTMODE_RESET_SET, //uint_fast16_t dutyCycle; 80 }; int main(void) { /* Halting the watchdog */ MAP_WDT_A_holdTimer(); /* 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.5 as peripheral output for PWM and P1.1 for button * interrupt */ MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION); MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN5); MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); /* 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, &pwmConfig); /* Enabling interrupts and starting the watchdog timer */ MAP_Interrupt_enableInterrupt(INT_PORT1); MAP_Interrupt_enableSleepOnIsrExit(); MAP_Interrupt_enableMaster(); /* Sleeping when not in use */ while (1) { MAP_PCM_gotoLPM0(); } } /* Port1 ISR - This ISR will progressively step up the duty cycle of the PWM * on a button press */ void PORT1_IRQHandler(void) { uint32_t status = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P1); MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, status); if (status & GPIO_PIN1) { if(pwmConfig.dutyCycle == 1000) pwmConfig.dutyCycle = 280; else pwmConfig.dutyCycle += 280; MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig); } }
So I want to make it where if i press switch 1 (p1.1) it will rotate the motor all the way to 180 degrees, then if i press it again it will interrupt and go the other way. But right now I can't figure out what the timerperiod and duty cycle should be. I understand that it the period is 20ms, and the duty cycle is 1-2ms. But what I don't get is what does it mean at 1ms the servo will be 0°. Does that mean that if i set the duty cycle to 10% it will aim to go to that position?
Also how do I know what the timer period should be? or can i use any number as long as the duty cycle is set to 5-10% of the period. Thanks a lot in advance!