Massey 2017, Group 5, AGV control software.

Dependencies:   Commands charQueue esp8266-driver

Drive/drive.h

Committer:
williampeers
Date:
2017-08-23
Revision:
1:87d8ac1a1e94
Parent:
0:91703b1eb29e

File content as of revision 1:87d8ac1a1e94:

#ifndef __DRIVE_INCLUDED__
#define __DRIVE_INCLUDED__

#include "mbed.h"
#include "pid_controller.h"

#define PWMPERIOD 4096 //PWM period in us

#define KP 3
#define KI 0.1
#define KD 0.1
#define PIDSAMPLERATE 0.1

class Driver {
private:
    PIDControl pidR;
    PIDControl pidL;

    InterruptIn l_encoder1; //Left motor encoder signal 1
    InterruptIn l_encoder2;   //Left motor encoder signal 2
    InterruptIn r_encoder1; //Right motor encoder signal 3
    InterruptIn r_encoder2;   //Right motor encoder signal 4
    
    PwmOut left_motor; // Forward Motor direction
    PwmOut left_motor_rev; // Reverse Motor direction
    PwmOut right_motor; // Forward Motor direction
    PwmOut right_motor_rev; // Reverse Motor direction

    long lSpeedGoal;//Goal motor speed
    long rSpeedGoal;
    
    long l_RPM;//Measured current speed
    long r_RPM;
    
    Mutex lock;
    
    Thread driver_thread;
    
    unsigned int LoutA; //Holds left output A of encoder signal
    unsigned int LoutB; //Holds left output B of encoder signal
    unsigned int RoutA; //Holds Right output A of encoder signal
    unsigned int RoutB; //Holds Right output B of encoder signal
    
    unsigned char l_enc_val; //Sequence that holds current and previous encoder combination values
    unsigned char r_enc_val;
    char l_enc_direction;
    char r_enc_direction;
    volatile long l_enc_count; //Holds current direction of left motor
    volatile long r_enc_count; //Holds current direction of right motor
    
    //Ticker timer;
    volatile long l_old_enc_count; //Hold old encounter value for computation
    volatile long r_old_enc_count;

    void l_encode_trig();//function for handling encoder trigger
    void r_encode_trig();
    
    void run();//function to run in thread (contains infinite loop)
    
    
    DigitalOut my_led;
    
public:
    Driver(osPriority, int);
    void start(); //starts thread "pid" running run()
    //void setVelocity(int speed, char* directoin);//called to set desired speed
    void setVelocity(int lSpeed, int rSpeed);
};

#endif