DC MOTOR INTERFACING WITH ARM (LPC2148) CONTROLLER
Motors (Actuators)
are important components of embedded systems. Whether it may be a simple DC
Motor, or accuracy based Servo Motor, or a precision based Stepper motor, all
types of motors are often used in many embedded systems and micro-controller
based projects. When talking about simple DC Motors in Micro-controller
based system, there are only three tasks we can do: rotate the motor in forward
direction, rotate the motor in reverse direction and control the speed of
rotation.
In here,
we will interface a simple DC Motor with ARM7 based Micro-controller i.e. LPC2148. Here, we
will simply change the direction of the rotation of the motor using a Motor
Driver IC (L293D). For controlling the speed of rotation of the DC Motor, we
will see another project as it involves ADC and PWM concepts.
The aim of this
project is to control a simple DC Motor with ARM7 LPC2148 with the help of
L293D (Motor driver) IC.
Circuit Diagram
Components Required
All
you need to do is connect the motor to the appropriate terminals and provide
necessary power supply (separate power supplies for the board and motor driver
IC so that we do not over load the power supply).
If you
are using a stand – alone board (with crystal and USB – to – UART IC), then you
might need the following components.
·
ARM7
LPC2148 based Stand – alone board or ARM7 LPC2148 Development Board
·
L293D
Motor Driver IC
·
12 V
DC Motor
·
Push
button
·
Power
Supply (separate for Motor Driver IC and MCU board)
·
Connecting
wires
·
USB –
to – Mini USB cable
Circuit Design
The design of the
circuit is very simple. We need to connect the L293D Motor Driver IC and push
buttons to the MCU board.
First is the Motor
Driver IC. The L293D Motor Driver IC has a dual H bridge configuration. Hence,
it can control two motors simultaneously. But for the demonstration of the
project, we will control only a single motor.
L293D is available in
a 16 – pin Dual in – line package (DIP) form. Out of the 16 pins, pins 4, 5, 12
and 13 are ground pins. All these pins are connected to ground and optionally a
heat sink can also be connected.
Pins 16 and 8 are
power supply pins for the internal logic and drivers respectively. They are
connected to 5V and 12V supply.
Note: The power supply to
the Motor Driver IC must be a different one than the power supply to the MCU
board.
Pin 1 is the channel 1 and 2 enable pin. It must be connected to 5V. Pins 2 and 7 are the driver inputs for the motor 1.
Pin 1 is the channel 1 and 2 enable pin. It must be connected to 5V. Pins 2 and 7 are the driver inputs for the motor 1.
They are connected to
P1.18 and P1.19 of the LPC2148 MCU respectively. Pins 3 and 6 of the L293D IC
are driver outputs and the motor is connected to these pins.
Since we need to
control the direction of the motor, we are going to use a push button to decide
the direction. A push button is connected to P0.16 of the MCU.
Rest of the
connections like Crystal, USB – to – UART, etc. will be already made on the
development board or stand – alone board. With this, the design of the circuit
is complete.
Note: The development
board used in this project already has all the required components like motor
diver, push buttons etc. on it. Hence, there is no need for any extra
connections. All we need to do is to connect the motor to the driver output
pins of the motor driver IC.
Working of the Project
The aim of this
project is to demonstrate the DC Motor control using ARM7 LPC2148 MCU. Since
motors draw a significant amount of current, we need a separate IC called Motor
Driver IC like L293D for example. The working of the project is explained here.
This is a simple
project which helps us in controlling the direction of rotation of the motor
using LPC2148. When the system is powered on, the status of the button is read
by the MCU. As per the program, when the button is not pressed, the motor
rotates in forward direction.
Whenever the button is
pressed, a change in state at the button pin is detected by the MCU and the
motor rotates in reverse directions. The project is better understood by
analyzing the program which is explained in the next section.
Program
#include<lpc21xx.h>
void delay(int count);
void
main()
{
IODIR1=0x00000033; //Set direction of IN1, IN2,IN3,IN4
while(1)
{
IOSET1=0x00000011; //set IN1, IN3=1
IOCLR1=0x00000022; //Clear IN2, IN4=0
delay(1000);
IOSET1=0x00000022; //set IN1, IN3=1
IOCLR1=0x00000011; //Clear IN2, IN4=0
delay(250);
IOSET1=0x00000011; //set IN1, IN3=0
IOCLR1=0x00000022; //Clear IN2 IN4=1
delay(1000);
}
void delay(int count)
{
int j=0,i=0;
for(j=0;j<count;j++)
{
/* At 60Mhz, the below loop introduces
delay of 10 us */
for(i=0;i<1275;i++);
}
}
Understanding the Program
The basic components of the program include PLL for setting up
system and peripheral clock and GPIO pins for interfacing with motor and
button. First, we will see how to initialize the pins to operate in GPIO mode.
By default, all the pins are configured to work as GPIO pins. Hence, we need not do anything specifically. In case we want to explicitly configure the pins as GPIO, then the following commands must be used. The GPIO Tutorial will give more information about the pins.
By default, all the pins are configured to work as GPIO pins. Hence, we need not do anything specifically. In case we want to explicitly configure the pins as GPIO, then the following commands must be used. The GPIO Tutorial will give more information about the pins.
PINSEL0 = 0x00000000; // Making all the pins as GPIO
PINSEL1 = 0x00000000;
PINSEL2 = 0x00000000;
The next module we need to configure is the PLL. PLL
Module in LPC2148 MCU is used to set the system clock and peripheral clock as
per the user or programmer wishes.
The maximum clock frequency for LPC2148 is 60 MHz. By
using the following set of instructions, we can set the system clock i.e. CCLK
and peripheral clock i.e. PCLK at 60 MHz respectively. More information about
the PLL module is explained in the ARM PLL tutorial.
PLL0CON = 0x01; // PLL0 module is enabled
PLL0CFG = 0x24; // Multiplier and Divider values of
the PLL are set
PLL0FEED = 0xAA; // Feed sequence for locking the PLL0
at 60 MHz
PLL0FEED = 0x55;
while (! (PLL0STAT & 0x00000400)); // Waiting for
Lock status of the PLL
PLL0CON = 0x03; // PLL0 is enabled again and connected
PLL0FEED = 0xAA; // Feed sequence for setting the PLL0
as CCLK
PLL0FEED = 0x55;
VPBDIV = 0x01; // PCLK is set same as CCLK
Once the CCLK and PCLK are running at 60 MHz, the
final part of the program is to read the status of the Button. After reading
the status of the button, we can rotate the motor in either forward direction
or reverse direction.
Comments
Post a Comment