Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope QEI biquadFilter mbed
Fork of NR_method by
NR_method_1.cpp
- Committer:
- Thijsjeee
- Date:
- 2018-10-22
- Revision:
- 0:0af507ea0d83
- Child:
- 1:fafea1d00d0c
File content as of revision 0:0af507ea0d83:
#include "mbed.h" #include "BiQuad.h" #include <math.h> #include <stdio.h> #include <iostream> #include <stdlib.h> #include <ctime> #include <QEI.h> //Define in/outputs float counts = 8400; DigitalOut Led(LED1); PwmOut PMW1(D5); // Motor 1 DigitalOut M1(D4); // direction of motor 1 PwmOut PMW2(D6); // Motor 2 DigitalOut M2(D7); // direction of motor 2 //initializing Encoders QEI Enc1(D13,D12, NC , counts, QEI::X4_ENCODING); //Motor 1 encoder QEI Enc2(D11,D10, NC , counts, QEI::X4_ENCODING); // Motor 3 encoder this checks whetehter the motor has rotated double Kp = 1; double Ki = 1; double Kd = 1; double Ts = 0.001; float counts_a; float counts_b; //Define Variables double pi = 3.14159265359; double bb; double bc; float z; double angle_a = 0.5* pi; //in rad double angle_b = 0 * pi; //in rad double X0[2][1] = {{angle_a},{angle_b}}; double X[2][1]; double Xold[2][1]; double fval[2][1]; double J[2][2]; double err[2][1]; double MaxIter = 20; double tolX = 1e-4; double Loa = 10; double Lob = 10; double b = 10; double c = 10; double Cx = 10.0; // current position double Cy = 10.0; // current position double Cxx = 12; // Goal position double Cyy = 12; // Goal position Ticker position_controll; void NR() //Newton Rapshon Calculation { //Variables double Hob = X[0][0]; double Hoa = X[1][0]; //Define f(x) fval[0][0] = pow((Cx - Lob * sin(Hob)),2) + pow((Cy - Lob * cos(Hob)),2) - pow(c,2); fval[1][0] = pow((Cx - Loa * sin(Hoa)),2) + pow((Cy - Lob * cos(Hoa)),2) - pow(b,2); //Jacobian J[0][0]= -2 * Lob * cos(Hob) * (Cx - Lob * sin(Hob)) + 2 * Lob *sin(Hob) * (Cy - Lob * cos(Hob)); J[1][1]= -2 * Loa * cos(Hoa) * (Cx - Loa * sin(Hoa)) + 2 * Loa* sin(Hoa) * (Cy - Loa * cos(Hoa)); } void angle_define() //define the angle needed. { for(int i=1 ; i <= MaxIter; i++) { NR(); X[0][0] = X[0][0] - ((1/J[0][0]) * fval[0][0]); X[1][0] = X[1][0] - ((1/J[1][1]) * fval[1][0]); err[0][0] = abs(X[0][0] - Xold[0][0]); err[1][0] = abs(X[1][0] - Xold[1][0]); Xold[0][0] = X[0][0]; Xold[1][0] = X[1][0]; counts_a = ((X[0][0]) / (2* pi)) * 8400; counts_b = -1 *(((X[1][0]) / (2* pi)) * 8400); if(err[0][0] <= tolX) { if(err[1][0] <= tolX) { break; } } } } void position_define() { if (Cx >= Cxx) { if (Cy >= Cyy) { } else { if (Cy > Cyy) { Cy = Cy - 0.005; } if (Cy < Cyy) { Cy = Cy + 0.005; } } } else { if (Cx > Cxx) { Cx = Cx - 0.005; } if (Cx < Cxx) { Cx = Cx + 0.005; } } } double PID_controller(double error) { static double error_integral = 0; static double error_prev = error; static BiQuad LowPassFilter(0.0640, 0.1279, 0.0640, -1.1683, 0.4241); //proportional part double u_k = Kp * error; //Integral part error_integral = error_integral + error * Ts; double u_i = Ki * error_integral; // Derivative part double error_derivative = (error - error_prev)/Ts; double filtered_error_derivative = LowPassFilter.step(error_derivative); double u_d = Kd * filtered_error_derivative; error_prev = error; return ((u_k + u_i + u_d)/100); } void motor_controler() { bb = Enc1.getPulses() + 2100; bc = Enc2.getPulses(); if (bb >= counts_a) { z = PID_controller((counts_a - bb)); PMW1.write(abs(z)); M1 = 0; } if (bb <= counts_a) { z = PID_controller((counts_a - bb)); PMW1.write(abs(z)); M1 = 1; } if (bc >= counts_b) { M2 = 0; z = PID_controller((counts_b) - bc); PMW2.write(abs(z)); } if (bc <= counts_b) { M2 = 1; z = PID_controller((counts_b) - bc); PMW2.write(abs(z)); } } void position_controll_void() { Led = 1; position_define(); angle_define(); motor_controler(); Led = 0; } int main() { PMW1.period_us(60); X[0][0] = X0[0][0]; X[1][0] = X0[1][0]; Xold[0][0] = X0[0][0]; Xold[1][0] = X0[1][0]; position_controll.attach(position_controll_void,0.001); while(true) { } }