not working yet

Dependencies:   Motor_with_encoder MODSERIAL mbed HIDScope

main.cpp

Committer:
MMartens
Date:
2017-10-16
Revision:
1:f3fe6d2b7639
Parent:
0:9167ae5d9927
Child:
2:7c6391c8ca71

File content as of revision 1:f3fe6d2b7639:

#include "mbed.h"
#include "MODSERIAL.h"
#include "encoder.h"
#include "math.h"

MODSERIAL pc(USBTX,USBRX);
PwmOut speed1(D5);
DigitalOut dir1(D4);
DigitalOut led1(D8);
DigitalOut led2(D11);
AnalogIn pot(A1);
DigitalIn button1(D13);
DigitalIn button2(D12);
Ticker potmeterreadout;
Ticker encoderreadout;
Encoder motor1(PTD0,PTC4);

float PwmPeriod = 0.0001f;

double count = 0; //set the counts of the encoder
volatile double angle = 0;//set the angles

double setpoint = 180;//I am setting it to move through 180 degrees
double Kp = 0.15;// you can set these constants however you like depending on trial & error
double Ki = 1;
double Kd = 0.5;

float last_error = 0;
float error1 = 0;
float changeError = 0;
float totalError = 0;
float pidTerm = 0;
float pidTerm_scaled = 0;// if the total gain we get is not in the PWM range we scale it down so that it's not bigger than |255|

volatile double potvalue = 0.0;
volatile double position = 0.0;
/*void readpot()
{
    
}
*/
void PIDcalculation()
{
    potvalue = pot.read();
    angle = motor1.getPosition()/4200.00*6.28;
    setpoint = potvalue*setpoint;
    //pc.printf("pos: %d, speed %f reference position = %.2f\r ",motor1.getPosition(), motor1.getSpeed(), setpoint);
    //motorpid = PID(potvalue - position, M1_KP, M1_KI, M1_KD, M1_TS, m1_err_int, m1_prev_err, m1_f_v1, m1_f_v2, M1_F_A1, M1_F_A2, M1_F_B0, M1_F_B1, M1_F_B2);
    
    if (angle <= setpoint) {
        dir1 = 1;// Forward motion
    } else {
        dir1 = 0;//Reverse motion
    }
    
    error1 = setpoint - angle;
    if (error1 <= 0.2) {
        speed1 = 0;
    }

    changeError = error1 - last_error; // derivative term
    totalError += error1; //accumalate errors to find integral term
    pidTerm = (Kp * error1) + (Ki * totalError) + (Kd * changeError);//total gain
    if (pidTerm >= 255) {
        pidTerm = 255;
    } else if (pidTerm <= -255) {
        pidTerm = -255;
    } else {
        pidTerm = pidTerm;
    }
    //constraining to appropriate value
    pidTerm_scaled = abs(pidTerm)/255;//make sure it's a positive value
    last_error = error1;
}

int main()
{
    encoderreadout.attach(PIDcalculation,0.001f);
    speed1.period(PwmPeriod);

    while(true) {



        speed1 = pidTerm_scaled;

        pc.printf("WHEEL ANGLE:%d, PID_scaled = %f, error = %f\r", angle, pidTerm_scaled, error1);

    }

}