Jorn-Jan van de Beld
/
kin_PD_project
begin van episch avontuur
main.cpp
- Committer:
- JornJan
- Date:
- 2017-10-27
- Revision:
- 0:4c07bb5a9f9f
- Child:
- 1:b6a079ca16e0
File content as of revision 0:4c07bb5a9f9f:
#include "mbed.h" #include "Serial.h" #include "math.h" #include "QEI.h" // Connecties Serial pc(USBTX, USBRX); //Serial PC connectie DigitalOut motor1DirectionPin(D4); //Motorrichting op D4 (connected op het bord) PwmOut motor1MagnitudePin(D5); //Motorkracht op D5 (connected op het bord) DigitalOut motor2DirectionPin(D6); //Motorrichting op D4 (connected op het bord) PwmOut motor2MagnitudePin(D7); //Motorkracht op D5 (connected op het bord) QEI q1_enc(D13, D12, NC, 32); //encoder motor 1 instellen QEI q2_enc(D11, D10, NC, 32); // encoder motor 2 instellen const double pi = 3.1415926535897; // waarde voor pi aanmaken // globale gegevens Ticker tick_sample; // ticker voor aanroepen aansturing char key; double ts=0.001; int q1_puls; int q2_puls; // kinematica gegevens // lengte armen double L1 = 0.250; double L2 = 0.355; double L3 = 0.150; // reference position double q1=0; // positie q2 in radialen double q2=0; // positie q2 in radialen double q1_pos; double q2_pos; // EMG Input_k double vx = 0; double vy = 0; // PID gegevens double pulses2rad; double position; double ref1; double ref2; double PD1; double PD2; double qset1=0; double qset1m=0; double qset2=0; double qset2m=0; double Kp; // proportional coefficient ( double Kd; // differential coefficient void wasd(double& vx, double& vy) { if(pc.readable()==true) { key = pc.getc(); if (key=='a') { vx = 0.02; //referentie snelheid m/s vy = 0; } else if(key=='d') { vx = -0.02; vy = 0; } else if(key=='w') { vx = 0; vy = 0.02; } else if(key=='s') { vx = 0; vy = -0.02; } else { vx=0; vy=0; } } else { vx=0; vy=0; } } double kinematics(double& q1, double& q2, double q1_pos, double q2_pos, double vx, double vy ) { q1 = ((-(L3 + L2*cos(q1_pos))/(L1*L3*cos(q1_pos) + L1*L2*cos(q1_pos)*cos(q2_pos) + L1*L2*sin(q1_pos)*sin(q2_pos))) * vx + (-(L2*sin(q2_pos))/(L1*L3*cos(q1_pos) + L1*L2*cos(q1_pos)*cos(q2_pos) + L1*L2*sin(q1_pos)*sin(q2_pos))) * vy) * ts + q1_pos; q2 = (((L3 + L2*cos(q2_pos) - L1*sin(q1_pos))/(L1*L3*cos(q1_pos) + L1*L2*cos(q1_pos)*cos(q2_pos) + L1*L2*sin(q1_pos)*sin(q2_pos)) * vx) + ((L1*cos(q1_pos) + L2*sin(q2_pos))/(L1*L3*cos(q1_pos) + L1*L2*cos(q1_pos)*cos(q2_pos) + L1*L2*sin(q1_pos)*sin(q2_pos))) * vy) * ts + q2_pos; return 0; } void controller(double qset1, double qset2) { // error = qset // referentie bepalen ref1 = qset1 + q1_pos; // genereert het referentiesignaal ref2 = qset2 + q2_pos; //PD PD1 = Kp*(qset1) + Kd*((qset1m-qset1)/ts) ; // PD sum; PD = proportianal + differential qset1m = qset1; // waarde voor qset wordt opgeslagen (m = memory) PD2 = Kp*(qset2) + Kd*((qset2m-qset2)/ts) ; qset2m = qset2; //Motor control if (PD1<0 && PD2<0 ) { motor1MagnitudePin = fabs(PD1); motor1DirectionPin = 1; motor2MagnitudePin = fabs(PD2); motor2DirectionPin = 1; } else if (PD1>0 && PD2<0) { motor1MagnitudePin = fabs(PD1); motor1DirectionPin = 0; motor2MagnitudePin = fabs(PD2); motor2DirectionPin = 1; } else if (PD1<0 && PD2>0) { motor1MagnitudePin = fabs(PD1); motor1DirectionPin = 1; motor2MagnitudePin = fabs(PD2); motor2DirectionPin = 0; } else if (PD1>0 && PD2>0) { motor1MagnitudePin = fabs(PD1); motor1DirectionPin = 0; motor2MagnitudePin = fabs(PD2); motor2DirectionPin = 0; } } void aansturing() { // encoders uitlezen q1_puls = q1_enc.getPulses(); q1_pos = q1_puls*pulses2rad; // berekent positie q1 in radialen q2_puls = q2_enc.getPulses(); q2_pos = q2_puls*pulses2rad; // berekent positie q2 in radialen // pijltjestoetsen wasd(vx, vy); // kinematica bepaald gewenste q1 en q2 referenties afhankelijk van ingegeven vx en vy kinematics(q1, q2, q1_pos, q2_pos, vx, vy); // PD controller gebruikt PD control en stuurt motor aan controller(q1, q2); } int main() { pc.baud(115200); pulses2rad=(2*pi)/4200; Kp = 0.5/pi; Kd = 0.1*Kp; tick_sample.attach_us(&aansturing, 1000); //sample frequency 1 mHz; while(true) { } }