Wheel control software for satellite microcontroller running the motors on the Karbor

Dependencies:   mbed ros_lib_melodic

Committer:
krogedal
Date:
Mon May 31 16:44:26 2021 +0000
Revision:
3:4b6080e86761
Parent:
0:441289ea4e29
Child:
5:44b2454a5eea
Updated to work with ROS, reading from /cmd_vel

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krogedal 0:441289ea4e29 1 #ifndef KARBOT_MOTOR_CONTROL_H
krogedal 0:441289ea4e29 2 #define KARBOT_MOTOR_CONTROL_H
krogedal 0:441289ea4e29 3
krogedal 0:441289ea4e29 4 /* Karbot motor control class
krogedal 0:441289ea4e29 5 * Written by Simon Krogedal
krogedal 0:441289ea4e29 6 * 27/05/21
krogedal 0:441289ea4e29 7 * Team 9 4th Year project
krogedal 0:441289ea4e29 8 *
krogedal 0:441289ea4e29 9 * for NUCLEO-F401RE
krogedal 0:441289ea4e29 10 *
krogedal 0:441289ea4e29 11 */
krogedal 0:441289ea4e29 12
krogedal 0:441289ea4e29 13 #include "mbed.h"
krogedal 0:441289ea4e29 14 #include "encoder.h"
krogedal 0:441289ea4e29 15 #include "motor.h"
krogedal 3:4b6080e86761 16
krogedal 3:4b6080e86761 17 /* This class controls the speed of an individual motor, helping the system keep
krogedal 3:4b6080e86761 18 * symmetric with asymmetric components. It is based on the encoder class
krogedal 3:4b6080e86761 19 * and contains a pointer to a motor object. With two of these the motion
krogedal 3:4b6080e86761 20 * controller can drive the robot to the desired points.
krogedal 3:4b6080e86761 21 */
krogedal 3:4b6080e86761 22 class MotorControl : public encoder {
krogedal 0:441289ea4e29 23 private:
krogedal 3:4b6080e86761 24 motor* mot; // motor object
krogedal 0:441289ea4e29 25
krogedal 3:4b6080e86761 26 double Kp, // Proportional gain
krogedal 3:4b6080e86761 27 Ti, // Integral gain time
krogedal 3:4b6080e86761 28 r_speed, // Speed set point
krogedal 3:4b6080e86761 29 r_clicks, // Same but in the "encoder language"
krogedal 3:4b6080e86761 30 max_speed, // The max speed of the motor (not used)
krogedal 3:4b6080e86761 31 output, // PWM output duty cycle
krogedal 3:4b6080e86761 32 prev_error; // Previous error, used for intergral control
krogedal 3:4b6080e86761 33
krogedal 3:4b6080e86761 34 bool dir, // Drivign direction (not used)
krogedal 3:4b6080e86761 35 max_out; // Flag triggered when output is saturated (not used)
krogedal 0:441289ea4e29 36
krogedal 3:4b6080e86761 37 double getError(void); // Calculate current error
krogedal 0:441289ea4e29 38
krogedal 3:4b6080e86761 39 void algorithm(void); // Control algorithm
krogedal 0:441289ea4e29 40
krogedal 0:441289ea4e29 41 public:
krogedal 3:4b6080e86761 42 // Constructor takes encoder pins and constants, and a motor object and contorller gains
krogedal 3:4b6080e86761 43 MotorControl(PinName a, PinName b, PinName i, int r, bool c, double p, motor* m, double ms, double kp, double ti, double ec);
krogedal 0:441289ea4e29 44
krogedal 3:4b6080e86761 45 void setSpeed(double s); // Set the speed of the wheel
krogedal 3:4b6080e86761 46 void drive(void); // Drive at set speet
krogedal 3:4b6080e86761 47 void stop(void); // Stop motor
krogedal 3:4b6080e86761 48 void driveManual(void); // Drive at set speed in open loop
krogedal 3:4b6080e86761 49 void samplecall(void); // Sample encoder and update read speed value
krogedal 3:4b6080e86761 50 void setK(double k); // Set gain (used for Z-N tuning
krogedal 3:4b6080e86761 51 void start(void); // This function is overridden to avoid bugs
krogedal 3:4b6080e86761 52 double getOutput(void); // Returns current duty cycle
krogedal 3:4b6080e86761 53 bool checkFlag(void); // Check whether max out flag is set
krogedal 0:441289ea4e29 54 };
krogedal 0:441289ea4e29 55
krogedal 0:441289ea4e29 56 #endif