PIC PWM Motor Driver
This motor controller was designed for use as cheap, simple motor controller for brushed DC motors. It uses a PIC Microcontroller to convert a low-power analog control signal to a PWM duty cycle which is amplified using a full-bridge to drive a motor. A block diagram of this is shown below. This document gives the circuitry and programming needed to make such a controller.
The first thing you need is a PIC microcontroller set up to convert an analog input to a PWM signal. The PIC used here is the PIC16F684. It only has one input, the analog control signal. It has two outputs: two opposite pulse width modulated pulse trains. The two PWM signals activate the two halves of the H-bridge to control the direction of the motor.
Code can be downloaded here.
The zip file contains the following files:
- main.asm - the program
- macros.inc - contains macros (quick code)
- PIC16F684.INC - assigns names to register addresses
- PICPWM.mcw and PICPWM.mcp - MPLAB workspaces
The circuit consists of the PWM-enabled PIC chip, an amplifier and some protection circuitry. There are two versions of the circuit, one for low-power motors (1A continuous) and one for high-power motors (4A continuous).
The low-power circuit uses the L293B push-pull driver (datasheet). This circuit can be used for the 6W Maxon motors in the lab.
A more high-power circuit makes use of the L298N (datasheet) full bridge amplifier.
Signal Conditioner (Optional)
There is a problem with leaving out the signal conditioner part of the circuit. Sure you can program your controller to output your control signal scaled to 0 to +5v, but when it will likely reset to 0v at some point. 0v to the PIC corresponds to full speed in one direction. You want 0v to the circuit to mean 0 speed to the motor, or 0v (IN) = 2.5v (PIC). For this you can build a simple op-amp circuit.
This circuit can accomodate inputs of either 5V or 10V. The two potentiometers can be adjusted to give the correct gain. Diodes were added to protect the PIC from too low or too high voltage inputs.
Another way around this is to add an enabling input. Whenever the controller isn't running, the circuit can be disabled so the motors won't be accidentally driven in either direction.
You can download CircuitMaker and TraxMaker files here for this circuit using the L293. The PCB design is shown below. It is not optimized for space, but to be easy to read. You can edit it as you like.
Using with PC/104
- Find out why circuit causes motors to make high-pitch noise.
- Add "brake" functionality to the PIC. This will require at least one additional input. For example, a single digital input pin could cause the motor to "brake" when it's set high. To "brake", the PIC will have to disable the PWM mode and set the two output pins equal to eachother.
- Add "sensing" capability for better control.