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: mbed QEI HIDScope biquadFilter MODSERIAL FastPWM
Revision 5:8ab3fcb8f4f8, committed 2019-10-29
- Comitter:
- JonaVonk
- Date:
- Tue Oct 29 11:27:56 2019 +0000
- Parent:
- 4:55e6707949dd
- Commit message:
- Jona's kleine code;
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
diff -r 55e6707949dd -r 8ab3fcb8f4f8 main.cpp --- a/main.cpp Fri Oct 25 10:35:11 2019 +0000 +++ b/main.cpp Tue Oct 29 11:27:56 2019 +0000 @@ -1,80 +1,94 @@ +/* mbed Microcontroller Library + * Copyright (c) 2018 ARM Limited + * SPDX-License-Identifier: Apache-2.0 + */ + #include "mbed.h" -//#include "HIDScope.h" +#include "MODSERIAL.h" #include "QEI.h" -#include "MODSERIAL.h" -//#include "BiQuad.h" -//#include "FastPWM.h" #include <vector> using std::vector; -double Pi = 3.14159265359; QEI Enc1(D12, D13, NC, 32); QEI Enc2(D10, D11, NC, 32); -DigitalOut M1(D4); -DigitalOut M2(D7); +DigitalOut M1(D4); //Direction control +DigitalOut M2(D7); //Direction control -PwmOut E1(D5); -PwmOut E2(D6); - -double initRot1 = 0; -double initRot2 = 48.5/360; +PwmOut E1(D5); //Speed control +PwmOut E2(D6); //Speed control MODSERIAL pc(USBTX, USBRX); - -//void moveMotorTo(DigitalOut *M, PwmOut *E, QEI *Enc, float rotDes); -double calcRot1(double xDes, double yDes); -double calcRot2(double xDes, double yDes); -void plotPath(double xStart, double yStart, double xEnd, double yEnd, double *xPath[], double *yPath[]); -void moveAlongPath(double xStart, double yStart, double xEnd, double yEnd); - -// main() runs in its own thread in the OS -int main() -{ - pc.baud(115200); - pc.printf("Start\n\r"); - moveAlongPath(30, 0, 0, 20.0); - pc.printf("End"); - -} +void moveMotorTo(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, double rotDes); -//function to mave a motor to a certain number of rotations, counted from the start of the program. -//parameters: -//DigitalOut *M = pointer to direction cpntol pin of motor -//PwmOut *E = pointer to speed contorl pin of motor -//QEI *Enc = pointer to encoder of motor -//float rotDes = desired rotation -void moveMotorTo(DigitalOut *M, PwmOut *E, QEI *Enc, float initRot, float rotDes) +int main() { - float pErrorC; - float pErrorP = 0; - float iError = 0; - float dError; + //double steps = 100; + vector<double> mot1; + vector<double> mot2; + + mot1.push_back(0.1); + mot1.push_back(0.2); + mot1.push_back(0.3); + mot1.push_back(0.4); + mot1.push_back(0.3); + mot1.push_back(0.2); + mot1.push_back(0.1); + mot1.push_back(0.0); - float Kp = 5; - float Ki = 0.01; - float Kd = 0.7; + mot2.push_back(0.1); + mot2.push_back(0.2); + mot2.push_back(0.3); + mot2.push_back(0.4); + mot2.push_back(0.3); + mot2.push_back(0.2); + mot2.push_back(0.1); + mot2.push_back(0.0); + pc.baud(115200); + while (true) { + for(int i = 0; i < 8; i++){ + moveMotorTo(&M1, &E1, &Enc1, 0, 1, mot1.at(i)); + pc.printf("mot1\n\r"); + moveMotorTo(&M2, &E2, &Enc2, 0, -1, mot2.at(i)); + pc.printf("mot2\n\r"); + } + } +} - float rotC = Enc->getPulses()/(32*131.25) + initRot; - float rotP = 0; - float MotorPWM; +void moveMotorTo(DigitalOut *M, PwmOut *E, QEI *Enc, double initRot, double dir, double rotDes) +{ + double pErrorC; + double pErrorP = 0; + double iError = 0; + double dError; + + double Kp = 300; + double Ki = 0; + double Kd = 10; + + double rotC = Enc->getPulses()/(32*131.25) + initRot; + double MotorPWM; + //pc.printf("\n\n"); Timer t; - float tieme = 0; + double tieme = 0; t.start(); do { pErrorP = pErrorC; + rotC = Enc->getPulses()/(32*131.25) + initRot; pErrorC = rotDes - rotC; + tieme = t.read(); + t.reset(); iError = iError + pErrorC*tieme; dError = (pErrorC - pErrorP)/tieme; - MotorPWM = pErrorC*Kp + iError*Ki + dError*Kd; + MotorPWM = (pErrorC*Kp + iError*Ki + dError*Kd)*dir; if(MotorPWM > 0) { *M = 0; @@ -83,72 +97,9 @@ *M = 1; *E = -MotorPWM; } - - rotP = rotC; - rotC = Enc->getPulses()/(32*131.25) + initRot; - tieme = t.read(); - t.reset(); - pc.printf("pError: %f iError: %f dError: %f\n\r", pErrorC, iError, dError); - } while (pErrorC > 0.001 || pErrorC < -0.001 ||dError > 0.01 || dError < -0.01); + wait(0.01); + //pc.printf("pError: %f iError: %f dError: %f motorPWM: %f\n\r", pErrorC, iError, dError, MotorPWM); + } while (abs(MotorPWM) > 0.029 || abs(dError) > 0.001); + //pc.printf("pError: %f iError: %f dError: %f motorPWM: %f\n\r", pErrorC, iError, dError, MotorPWM); t.stop(); -} - - -//double that calculates the rotation of one arm. -//parameters: -//double xDes = ofset of the arm's shaft in cm in the x direction -//double yDes = ofset of the arm's shaft in cm in the y direction -double calcRot1(double xDes, double yDes) -{ - return 6*((atan(yDes/xDes) - 0.5*(Pi - acos((pow(xDes, 2.0) + pow(yDes, 2.0) - 2*pow(20.0, 2.0))/(-2*pow(20.0, 2.0)))))/(2*Pi)); -}; - -//double that calculates the rotation of the other arm. -//parameters: -//double xDes = ofset of the arm's shaft in cm in the x direction -//double yDes = ofset of the arm's shaft in cm in the y direction -double calcRot2(double xDes, double yDes) -{ - pc.printf("rot2: %f", 6*((atan(yDes/xDes) + 0.5*(Pi - acos((pow(xDes, 2.0) + pow(yDes, 2.0) - 2*pow(20.0, 2.0))/(-2*pow(20.0, 2.0)))))/(2*Pi))); - return 6*((atan(yDes/xDes) + 0.5*(Pi - acos((pow(xDes, 2.0) + pow(yDes, 2.0) - 2*pow(20.0, 2.0))/(-2*pow(20.0, 2.0)))))/(2*Pi)); -}; - -void plotPath(double xStart, double yStart, double xEnd, double yEnd, vector<double> *xPath, vector<double> *yPath) -{ - pc.printf("xS: %f xE: %f yS: %f yE: %f\n\r", xStart, xEnd, yStart,yEnd); - double lPath = sqrt(pow(xEnd-xStart, 2.0) + pow(yEnd-yStart, 2.0)); - int noSteps = int(lPath/0.1); - double xStep = (xEnd - xStart)/double(noSteps); - double yStep = (yEnd - yStart)/double(noSteps); - pc.printf("xStep: %f yStep: %f\n\r", xStep, yStep); - pc.printf("dx: %f dy: %f\n\r", xEnd - xStart, yEnd - yStart); - for(int i = 0; i<=noSteps; i++) { - xPath->push_back(xStart + i*xStep); - yPath->push_back(yStart + i*yStep); - pc.printf("to go plotPath: %i / %i \n\r", i, noSteps); - } -} - -void moveAlongPath(double xStart, double yStart, double xEnd, double yEnd) -{ - pc.printf("xS: %f xE: %f yS: %f yE: %f \n\r", xStart, xEnd, yStart,yEnd); - vector<double> xPath; - vector<double> yPath; - vector<double> rot1Path; - vector<double> rot2Path; - - plotPath(xStart, yStart, xEnd, yEnd, &xPath, &yPath); - - for(int i = 0; i < xPath.size(); i++) { - rot1Path.push_back(calcRot1(xPath[i], yPath[i])); - rot2Path.push_back(calcRot2(xPath[i], yPath[i])); - pc.printf("to go angle: %i / %i \n\r", i, xPath.size()); - } - - for(int i = 0; i < xPath.size(); i++) { - moveMotorTo(&M1, &E1, &Enc1, initRot1, rot1Path.at(i)); - moveMotorTo(&M2, &E2, &Enc2, initRot2, rot2Path.at(i)); - pc.printf("to go move: %i / %i", i, rot1Path.size()); - } -} - +} \ No newline at end of file
diff -r 55e6707949dd -r 8ab3fcb8f4f8 mbed.bld --- a/mbed.bld Fri Oct 25 10:35:11 2019 +0000 +++ b/mbed.bld Tue Oct 29 11:27:56 2019 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/mbed_official/code/mbed/builds/d1b4690b3f8b \ No newline at end of file +https://os.mbed.com/users/mbed_official/code/mbed/builds/675da3299148 \ No newline at end of file