The AVR Motor Controller is a dual-axis motor controller and driver system. The controller uses PID motor control, and can calculate and execute trapezoidal-profile motion control. The controller accepts motor commands and quadrature encoder inputs, runs a PID and motion control algorithms, and drives motors at up to 50V and 3A per motor. The controller can operate two motors simulaneously, with seperate or synchronized trajectories.
AVR Motor Controller
Hardware Connection Information:
Connection reference for AVR Motor Controller
(Encoder1 and Motor1 are associated, same for Encoder/Motor2)
Typical motor connection diagram
Motor Command Information:
These commands can be entered interactively or by script via the controller serial port. To communicate interactively with the controller, use a standard serial terminal program such as HyperTerminal or TeraTerm under windows, or minicom under Linux.
- Serial port settings:
- 115200 Baud
- 8 bits data
- No parity
- 1 stop bit
All commands are a single command letter with up to two integer numeric arguments seperated by spaces. Commands are case-sensitive (ie. 'G' is not the same as 'g'). Here is an example command session showing the meaning of each command and various syntax:cmd>s 1 <-- Select motor1 cmd>p 1000 <-- Set Kp to 1000 for motor1 cmd>i 0 <-- Set Ki to zero for motor1 cmd>d 0 <-- Set Kd to zero for motor1 cmd>g 1000 <-- Drive motor to position 1000 (1000 encoder ticks) using PID cmd>g 0 <-- Drive motor to position 0 (back to initial position) cmd>g -1000 <-- Drive motor to position -1000 (same amount, opposite direction) cmd>s 2 <-- Select motor2 cmd>p 1000 <-- Set Kp to 1000 for motor2 cmd>i 0 <-- Set Ki to zero for motor2 cmd>d 0 <-- Set Kd to zero for motor2 cmd>G 2000 2000 <-- Drive both motor1 and 2 to position 2000 (simultaneous) cmd>G 0 0 <-- Drive both motors back to zero cmd>w <-- Write this configuration to EEPROM cmd>s 1 <-- Select motor1 again cmd>t 10000 <-- Drive motor to position 10000 using PID with trapezoidal profile
AVR Motor Controller Commands
Arg1 Help '?' . .
Displays on-line help for available commands
Select Motor 's' motor# . Select motor to control (1 or 2) Motor Control Mode 'm' mode .
mode=0: Control off (motors disabled)
mode=1: Position control
mode=2: Velocity control (use 'v' command to set velocity)
mode=3: Cross-linked control
Goto Position (PID) 'g' position [tics] . Drives selected motor to requested position under direct PID control. Goto Position (PID) 'G' pos1 [tics] pos2 [tics] Drives both motors simulanteously to requested positions under direct PID control (NOTE: pos1 need not equal pos2). Goto Position (Prof) 't' position [tics] . Drives selected motor to requested position under PID+PROFILE control. Uses trapezoidal motion profile. Goto Position (Prof) 'T' pos1 [tics] pos2 [tics] Drives both motors simulanteously to requested positions under PID+PROFILE control. Uses trapezoidal motion profile. Reset Encoders 'z' pos1 [tics] pos2 [tics] Resets the encoder counters. Allows reassigning the current physical position to user-selected encoder values. If no arguments are specified then encoders reset to zero. Read Motor Current 'c' . . Returns motor current in mA (if current sensing is connected)
Config Print 'L' . . Prints settings and coefficients that are currently active. Config Write 'w' . . Stores all current settings and coefficients into EEPROM. The settings are automatically loaded at power-on. Config Load 'l' . . Load settings and coefficients from EEPROM. Restores all settings to those last saved with 'w' command.
PID Tuning Assistance
Record Response 'r' . . Sets currently selected motor for response recording. Response recording records the actual motor trajectory for the first 200points after the next 'g' command. Upload Response 'R' . . Returns the recorded motor trajectory data from 'r' command. Each data point is the motor position (encoder value) as it approached the target position requested by the 'g' command. Step Response Test 'f' . . Runs automatic motor step-response test.
Trapezoidal-Profile Controller Settings
Set Max Velocity 'v' vel . Sets the maximum velocity to be used under trapezoidal profile control. Also used in velocity control mode to set desired velocity. Set Max Acceleration 'a' accel . Sets the acceleration to be used under trapezoidal profile control
PID Controller Settings
Set Prop. Gain 'P' Kp . Sets the Proportional gain for currently selected motor [units TBD] Set Integral Gain 'I' Ki . Sets the Integral gain for currently selected motor [units TBD] Set Derivative Gain 'D' Kd . Sets the Derivative gain for currently selected motor [units TBD] Set Windup Max 'W' wm . Sets the maximum value for integral error (clamping value) Set Output Max 'M' om . Sets the maximum motor drive level [PWM units, out of 1200] Set Deadzone 'Z' dz . Sets the minimum motor drive level [PWM units, out of 1200]
Below this level, the motor power will be clamped to zero.
System Test Commands
Encoder Test 'e' . . Prints encoder count value for both motors. Press any key to exit. Motor Driver Test 'q' . . Runs motors in ramp test pattern in both directions. Press RESET to exit. This command list current as of firmware V1.6g, but is subject to change.
PID Control Loop Tuning:
Manual "by feel" Tuning
You can do a reasonable job of tuning a PID controller just by feel and observation. In general, you want to follow these basic steps:
- Set Kd and Ki to zero
- Pick a low starting Kp
- Command the motor to move under PID control (a good amount of motion might be 1 shaft turn)
- If the motor moves slugishly, increase Kp and repeat step 3.
- If the motor 'runs away' then use negative Kp or switch the polarity of the leads to the motor
- Keep increasing Kp until either:
- the motor moves fast but overshoots the target position
- the motor begins to oscillate
Now begin increasing Kd until the overshoot is damped and/or the oscillation stops. You now have a basic PID loop tuning. If needed, you can repeat the tuning process but starting with the values you have now. Return to step 3. Finally if you have appreciable steady-state loads on the motor, you may want to set a non-zero Ki. Increase Ki just enough to reduce steady-state error (too much Ki will cause sluggish settling times)
- A reasonable initial Kp is about 1000
- Typical 'tuned' values of Kd are 0.5Kp to 3Kp
- Typical values for Ki are 0,1,2,3, maybe as high as 10 or 20 in special applications.
- Tuning is dependent on ALL of the following:
- the PID coefficients
- the voltage supplied to the motor driver
- the motor's electromechanical properties (Ke, Kt and rotor inertia)
- the mechanical load on the motor
- If the motor 'runs away', then the you must use negative coefficients or switch the polarity of the motor leads.
Matlab Step-Response Tuning Tool
This Matlab GUI tool allows interactive graphical tuning of the PID controller. The tool requires Matlab V6.0 or later, and the Instrument Control Toolbox (used for serial port access). Here's how to use it:
- Download the tool here: step.zip
- Unzip 'step.zip' into a temporary directory
- Open Matlab and change directory to the location of 'step.m' (from step2)
- Connect the AVR Motor Controller to COM1
- Run 'step' in matlab. A GUI window should open.
- Pick some PID coefficients or use the defaults.
- Click the 'STEP' button to run a step-response test.
- The motor will execute the test
- The desired and actual response of the motor will be ploted.
- Examine the response and adjust the PID coefficients
- Goto Step 7.
- When satisfied with the tuning, you may save the coefficients you chose to EEPROM by clicking 'Store Coeff'.
About Trapezoidal-Profile Control:
Most applications in robotics require motors to make smooth movements from point A to point B. A PID control loop uses position feedback from a shaft encoder to drive a DC motor to precise positions. Unfortunately, the PID algorithm does not give us easy control over exactly how the motor moves from point A to point B. Rather, the PID controller is usually tuned for fastest possible motion while avoiding natural oscillations. So while PID is good at getting a motor to a certain position quickly, to get a smooth movement, we need some additional control.
Trapezoidal profiles can be used to command PID to create the smooth movement we want. A trapezoidal profile is a three-step movement process to go from point A to point B. This three-step process is exmplained and shown graphically below. Within each step, the profile controller constantly updates the desired PID position to make the motor follow the profile. PID still handles the lowest level of control.
- Motor is stopped at point A, but is commanded to go to point B.
- Step 1: Accelerate from stop to maximum velocity
- Step 2: Maintain maximum velocity until motor gets close to point B
- Step 3: Decelerate from max velocity to a stop
- Motor is now at point B
The profile controller in the AVR Motor Controller allows the user to choose the acceleration and maximum velocity. When a target position is entered, the profile controller automatically calculates the required profile and executes.
NOTE: Using the profile controller requires a reasonably tuned PID control loop since the profile controller uses PID control to move the motor precisely.