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).
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.
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.
Using with PC/104
- 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.