A simple robot with 2 motors and 2 encoders : IHM04A1. Motor speed is set to 40 and PID controllers are use to attain that speed
Dependencies: mbed HelloWorld_IHM04A1 PID X_NUCLEO_IHM04A1 PinDetect mRotaryEncoder IHM HBridgeMotor
main.cpp
- Committer:
- harryeakins
- Date:
- 2011-09-20
- Revision:
- 0:e019949c4c69
File content as of revision 0:e019949c4c69:
#include "mbed.h"
#include "mRotaryEncoder.h"
#include "HBridgeMotor.h"
#include "PID.h"
// PID constants
#define RATE 0.2
#define Kc 1.5 // Proportional
#define Ti 1.0 // Integral
#define Td 0.0 // Derivative
DigitalOut led1(LED1);
// Two PID Controllers
PID leftPID(Kc, Ti, Td, RATE);
PID rightPID(Kc, Ti, Td, RATE);
// Two de-bounced encoders
mRotaryEncoder left_enc(p19, p20, p29);
mRotaryEncoder right_enc(p26, p27, p28);
// Two motor/h-bridge objects
HBridgeMotor left_motor(p25, p24);
HBridgeMotor right_motor(p21, p22);
void initializePidControllers(void) {
leftPID.setInputLimits(-300, 300);
leftPID.setOutputLimits(-1.0, 1.0);
leftPID.setMode(AUTO_MODE);
rightPID.setInputLimits(-300, 300);
rightPID.setOutputLimits(-1.0, 1.0);
rightPID.setMode(AUTO_MODE);
}
int main() {
int left_pulses = 0, right_pulses = 0;
initializePidControllers();
// 40 encoder ticks per second target speed
leftPID.setSetPoint(40.0);
rightPID.setSetPoint(40.0);
while (true) {
// Get velocities
float left_velocity = float(left_enc.Get() - left_pulses)/RATE;
float right_velocity = float(right_enc.Get() - right_pulses)/RATE;
// Pass the PID Controller the latest velocity value
leftPID.setProcessValue(left_velocity);
rightPID.setProcessValue(right_velocity);
// Query the PID Controllers for the desired power outputs
// and set the motors to those powers
left_motor.set(leftPID.compute());
right_motor.set(rightPID.compute());
// Save the number of encoder ticks for velocity calculation in the next loop
left_pulses = left_enc.Get();
right_pulses = right_enc.Get();
// Toggle the LED and wait
led1 = 1 - led1;
wait(RATE);
}
}