Tess Groeneveld / Motoraansturingvoortweemotorenmetbeginwaarde

Dependencies:   Encoder MODSERIAL mbed

Committer:
Tess
Date:
Fri Oct 25 08:07:43 2013 +0000
Revision:
0:f492ec86159e
Child:
1:7cafc9042056
Heey, this is a file to make your two motors work together. Have fun

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tess 0:f492ec86159e 1 #include "mbed.h"
Tess 0:f492ec86159e 2 #include "encoder.h"
Tess 0:f492ec86159e 3 #include "MODSERIAL.h"
Tess 0:f492ec86159e 4
Tess 0:f492ec86159e 5 /*******************************************************************************
Tess 0:f492ec86159e 6 * *
Tess 0:f492ec86159e 7 * Code can be found at http://mbed.org/users/vsluiter/code/BMT-K9-Regelaar/ *
Tess 0:f492ec86159e 8 * *
Tess 0:f492ec86159e 9 ********************************************************************************/
Tess 0:f492ec86159e 10
Tess 0:f492ec86159e 11 /** keep_in_range -> float in, and keep_in_range if less than min, or larger than max **/
Tess 0:f492ec86159e 12 void keep_in_range(float * in, float min, float max);
Tess 0:f492ec86159e 13
Tess 0:f492ec86159e 14 /** variable to show when a new loop can be started*/
Tess 0:f492ec86159e 15 /** volatile means that it can be changed in an */
Tess 0:f492ec86159e 16 /** interrupt routine, and that that change is vis-*/
Tess 0:f492ec86159e 17 /** ible in the main loop. */
Tess 0:f492ec86159e 18
Tess 0:f492ec86159e 19 volatile bool looptimerflag;
Tess 0:f492ec86159e 20
Tess 0:f492ec86159e 21 /** function called by Ticker "looptimer" */
Tess 0:f492ec86159e 22 /** variable 'looptimerflag' is set to 'true' */
Tess 0:f492ec86159e 23 /** each time the looptimer expires. */
Tess 0:f492ec86159e 24 void setlooptimerflag(void)
Tess 0:f492ec86159e 25 {
Tess 0:f492ec86159e 26 looptimerflag = true;
Tess 0:f492ec86159e 27 }
Tess 0:f492ec86159e 28
Tess 0:f492ec86159e 29 int main()
Tess 0:f492ec86159e 30 {
Tess 0:f492ec86159e 31 //LOCAL VARIABLES
Tess 0:f492ec86159e 32 /*Potmeter input*/
Tess 0:f492ec86159e 33 AnalogIn potmeterA(PTC2);
Tess 0:f492ec86159e 34 AnalogIn potmeterB(PTB2);
Tess 0:f492ec86159e 35 /* Encoder, using my encoder library */
Tess 0:f492ec86159e 36 /* First pin should be PTDx or PTAx */
Tess 0:f492ec86159e 37 /* because those pins can be used as */
Tess 0:f492ec86159e 38 /* InterruptIn */
Tess 0:f492ec86159e 39 Encoder motorA(PTD4,PTC8);
Tess 0:f492ec86159e 40 Encoder motorB(PTD0,PTD2);
Tess 0:f492ec86159e 41 /* MODSERIAL to get non-blocking Serial*/
Tess 0:f492ec86159e 42 MODSERIAL pc(USBTX,USBRX);
Tess 0:f492ec86159e 43 /* PWM control to motor */
Tess 0:f492ec86159e 44 PwmOut pwm_motorA(PTA12);
Tess 0:f492ec86159e 45 PwmOut pwm_motorB(PTA5);
Tess 0:f492ec86159e 46 /* Direction pin */
Tess 0:f492ec86159e 47 DigitalOut motordirA(PTD3);
Tess 0:f492ec86159e 48 DigitalOut motordirB(PTD1);
Tess 0:f492ec86159e 49 /* variable to store setpoint in */
Tess 0:f492ec86159e 50 float setpointA;
Tess 0:f492ec86159e 51 float setpointB;
Tess 0:f492ec86159e 52 /* variable to store pwm value in*/
Tess 0:f492ec86159e 53 float pwm_to_motorA;
Tess 0:f492ec86159e 54 float pwm_to_motorB;
Tess 0:f492ec86159e 55 int32_t beginpositiemotorA_t0;
Tess 0:f492ec86159e 56 int32_t beginpositiemotorB_t0;
Tess 0:f492ec86159e 57 //START OF CODE
Tess 0:f492ec86159e 58
Tess 0:f492ec86159e 59 /*Set the baudrate (use this number in RealTerm too! */
Tess 0:f492ec86159e 60 pc.baud(921600);
Tess 0:f492ec86159e 61
Tess 0:f492ec86159e 62
Tess 0:f492ec86159e 63 // wil dat 20 seconden de motor rechtsom gaat draaien
Tess 0:f492ec86159e 64 motordirA.write(0);
Tess 0:f492ec86159e 65 motordirB.write(0);
Tess 0:f492ec86159e 66 pwm_motorA.write(.1);
Tess 0:f492ec86159e 67 pwm_motorB.write(.1);
Tess 0:f492ec86159e 68
Tess 0:f492ec86159e 69 do
Tess 0:f492ec86159e 70 {
Tess 0:f492ec86159e 71 //wacht
Tess 0:f492ec86159e 72 //schuif t0 / t1
Tess 0:f492ec86159e 73 lees encoder
Tess 0:f492ec86159e 74
Tess 0:f492ec86159e 75 }while(posititie ongelijk);
Tess 0:f492ec86159e 76
Tess 0:f492ec86159e 77
Tess 0:f492ec86159e 78
Tess 0:f492ec86159e 79
Tess 0:f492ec86159e 80
Tess 0:f492ec86159e 81 /*Create a ticker, and let it call the */
Tess 0:f492ec86159e 82 /*function 'setlooptimerflag' every 0.01s */
Tess 0:f492ec86159e 83 Ticker looptimer;
Tess 0:f492ec86159e 84 looptimer.attach(setlooptimerflag,0.01);
Tess 0:f492ec86159e 85
Tess 0:f492ec86159e 86 //INFINITE LOOP
Tess 0:f492ec86159e 87 while(1) {
Tess 0:f492ec86159e 88 /* Wait until looptimer flag is true. */
Tess 0:f492ec86159e 89 /* '!=' means not-is-equal */
Tess 0:f492ec86159e 90 while(looptimerflag != true);
Tess 0:f492ec86159e 91 /* Clear the looptimerflag, otherwise */
Tess 0:f492ec86159e 92 /* the program would simply continue */
Tess 0:f492ec86159e 93 /* without waitingin the next iteration*/
Tess 0:f492ec86159e 94 looptimerflag = false;
Tess 0:f492ec86159e 95
Tess 0:f492ec86159e 96 /* Read potmeter value, apply some math */
Tess 0:f492ec86159e 97 /* to get useful setpoint value */
Tess 0:f492ec86159e 98 setpointA = (potmeterA.read()-0.5)*(631/2);
Tess 0:f492ec86159e 99 setpointB = (potmeterB.read()-0.5)*(871/2); //1000 dan rotatie langzamer maken als lager maakt.
Tess 0:f492ec86159e 100
Tess 0:f492ec86159e 101 /* Print setpoint and current position to serial terminal*/
Tess 0:f492ec86159e 102 pc.printf("s: %f, %d ", setpointA, motorA.getPosition());
Tess 0:f492ec86159e 103 pc.printf("s: %f, %d \n\r", setpointB, motorB.getPosition());
Tess 0:f492ec86159e 104
Tess 0:f492ec86159e 105 /* This is a P-action! calculate error, multiply with gain, and store in pwm_to_motor */
Tess 0:f492ec86159e 106 pwm_to_motorA = (setpointA - motorA.getPosition())*.001;
Tess 0:f492ec86159e 107 pwm_to_motorB = (setpointB - motorB.getPosition())*.001;
Tess 0:f492ec86159e 108 /* Coerce pwm value if outside range */
Tess 0:f492ec86159e 109 /* Not strictly needed here, but useful */
Tess 0:f492ec86159e 110 /* if doing other calculations with pwm value */
Tess 0:f492ec86159e 111 keep_in_range(&pwm_to_motorA, -1,1);
Tess 0:f492ec86159e 112 keep_in_range(&pwm_to_motorB, -1,1);
Tess 0:f492ec86159e 113
Tess 0:f492ec86159e 114 /* Control the motor direction pin. based on */
Tess 0:f492ec86159e 115 /* the sign of your pwm value. If your */
Tess 0:f492ec86159e 116 /* motor keeps spinning when running this code */
Tess 0:f492ec86159e 117 /* you probably need to swap the motor wires, */
Tess 0:f492ec86159e 118 /* or swap the 'write(1)' and 'write(0)' below */
Tess 0:f492ec86159e 119 if(pwm_to_motorA > 0)
Tess 0:f492ec86159e 120 motordirA.write(1);
Tess 0:f492ec86159e 121 else
Tess 0:f492ec86159e 122 motordirA.write(0);
Tess 0:f492ec86159e 123 if(pwm_to_motorB > 0)
Tess 0:f492ec86159e 124 motordirB.write(1);
Tess 0:f492ec86159e 125 else
Tess 0:f492ec86159e 126 motordirB.write(0);
Tess 0:f492ec86159e 127
Tess 0:f492ec86159e 128
Tess 0:f492ec86159e 129 //WRITE VALUE TO MOTOR
Tess 0:f492ec86159e 130 /* Take the absolute value of the PWM to send */
Tess 0:f492ec86159e 131 /* to the motor. */
Tess 0:f492ec86159e 132 pwm_motorA.write(abs(pwm_to_motorA));
Tess 0:f492ec86159e 133 pwm_motorB.write(abs(pwm_to_motorB));
Tess 0:f492ec86159e 134 }
Tess 0:f492ec86159e 135 }
Tess 0:f492ec86159e 136
Tess 0:f492ec86159e 137
Tess 0:f492ec86159e 138 //coerces value 'in' to min or max when exceeding those values
Tess 0:f492ec86159e 139 //if you'd like to understand the statement below take a google for
Tess 0:f492ec86159e 140 //'ternary operators'.
Tess 0:f492ec86159e 141 void keep_in_range(float * in, float min, float max)
Tess 0:f492ec86159e 142 {
Tess 0:f492ec86159e 143 *in > min ? *in < max? : *in = max: *in = min;
Tess 0:f492ec86159e 144 }
Tess 0:f492ec86159e 145
Tess 0:f492ec86159e 146
Tess 0:f492ec86159e 147