ISR PWM Motor Control

This code runs the Low Voltage Motor Booster Pack for the MSP-430 with the MSP430G2553 chip but could easily be adapted to any microcontroller. This uses Timer1_A0 to make a timing interrupt. Using the timing interrupt it changes the duty cycle of the PWM. Supports reverse by sending the “move_motors” command negative values.

Default is P2.0, P2.1, P2.2, and P2.3 for controlling the motor driver. P1.0 is toggled (on board LED) in the ISR.

Code: CCS V5



isr_motor_pwm.c
isr_motor_pwm.h
Project File Ver1.0


/*
 *isr_motor_pwm.c
 *Version: 1.0
 *Parker Dillmann
 *The Longhorn Engineer (c) 2013 
 *www.longhornengineer.com
 *
 *Check bottom of file for License.
 *
*/

#include "msp430g2553.h"
#include "isr_motor_pwm.h"

#define Motor_DIR P2DIR
#define Motor_OUT P2OUT

#define Motor_A1 BIT0
#define Motor_A2 BIT1
#define Motor_B1 BIT2
#define Motor_B2 BIT3

volatile int Motor_Speed_A;
volatile int Motor_Speed_B;

volatile int Motor_isr_cnt;

void init_motors(void)
{
  TA1CCTL0 = CCIE;             //Enable the CCR0 interrupt
  TA1CCR0 = 50000;             // Set the interrupt register to "trip" each 50000 cycles"

  TA1CTL = TASSEL_2 + MC_2 + TACLR;     //Timer_A Source Select; Set source to SMCLK, continuous mode, clear TAR

  P1DIR |= 0x41;                            // P1.0 output

  Motor_DIR |= (Motor_A1 | Motor_A2 | Motor_B1 | Motor_B2);    //Set Motors to output
  Motor_OUT &= ~(Motor_A1 | Motor_A2 | Motor_B1 | Motor_B2);    //Set Motor outputs to 0

  Motor_isr_cnt = 1;

  return;
}

void move_motors(int Speed_A, int Speed_B)
{
  Motor_Speed_A = Speed_A;
  Motor_Speed_B = Speed_B;
  return;
}

void stop_motors(void)
{
  Motor_Speed_A = 0;
  Motor_Speed_B = 0;
  return;
}

#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer1_A0_ISR(void)
{
  //Upkeep Time
  Motor_isr_cnt++;
  if (Motor_isr_cnt == 512)
  {
    Motor_isr_cnt = 1;
  }

  //Motor_A PWM
  if (abs(Motor_Speed_A) >= Motor_isr_cnt)
  {
    if (Motor_Speed_A > 0)
    {
      Motor_OUT |= Motor_A1;
      Motor_OUT &= ~(Motor_A2);
    }
    else
    {
      Motor_OUT |= Motor_A2;
      Motor_OUT &= ~(Motor_A1);
    }
  }
  else
  {
    Motor_OUT &= ~(Motor_A1 + Motor_A2);
  }

  //Motor_B PWM
  if (abs(Motor_Speed_B) >= Motor_isr_cnt)
  {
    if (Motor_Speed_B > 0)
    {
      Motor_OUT |= Motor_B1;
      Motor_OUT &= ~(Motor_B2);
    }
    else
    {
      Motor_OUT |= Motor_B2;
      Motor_OUT &= ~(Motor_B1);
    }
  }
  else
  {
    Motor_OUT &= ~(Motor_B1 + Motor_B2);
  }

  P1OUT ^= 0x40;    // Toggle P1.0
  TA1CCR0 += 500;  //Add offset to CCR0
}

/*
┌──────────────────────────────────────────────────────────────────────────────────────┐
│                           TERMS OF USE: MIT License                                  │
├──────────────────────────────────────────────────────────────────────────────────────┤
│Permission is hereby granted, free of charge, to any person obtaining a copy of this  │
│software and associated documentation files (the "Software"), to deal in the Software │
│without restriction, including without limitation the rights to use, copy, modify,    │
│merge, publish, distribute, sublicense, and/or sell copies of the Software, and to    │
│permit persons to whom the Software is furnished to do so, subject to the following   │
│conditions:                                                                           │
│                                                                                      │
│The above copyright notice and this permission notice shall be included in all copies │
│or substantial portions of the Software.                                              │
│                                                                                      │
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,   │
│INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A         │
│PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT    │
│HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION     │
│OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE        │
│SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                                │
└──────────────────────────────────────────────────────────────────────────────────────┘
*/