changes to motor library

Fork of motor by GDP 4

Committer:
lh14g13
Date:
Fri Nov 11 12:50:48 2016 +0000
Branch:
testing
Revision:
10:f4fc8ccde4ad
Parent:
9:22b119eef1de
Child:
11:4a6f97cc1f1e
duty cycle motor control;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lh14g13 0:b0476dcfa14c 1 #include "mbed.h"
lh14g13 0:b0476dcfa14c 2 #include "TFC.h"
lh14g13 9:22b119eef1de 3 #include <math.h>
lh14g13 0:b0476dcfa14c 4 DigitalOut myled(LED1);
lh14g13 0:b0476dcfa14c 5
lh14g13 7:9aaa4f73bb32 6
lh14g13 0:b0476dcfa14c 7 void TurnOn();
lh14g13 7:9aaa4f73bb32 8 void runMotor();
lh14g13 0:b0476dcfa14c 9 void DefaultMode();
lh14g13 0:b0476dcfa14c 10
lh14g13 0:b0476dcfa14c 11
lh14g13 0:b0476dcfa14c 12 //Speed control
lh14g13 0:b0476dcfa14c 13 void Acc(float& motorA, float& motorB);
lh14g13 0:b0476dcfa14c 14 void Decc(float& motorA, float& motorB);
lh14g13 0:b0476dcfa14c 15 void StartLine();
lh14g13 0:b0476dcfa14c 16
lh14g13 0:b0476dcfa14c 17 //Corner Control
lh14g13 0:b0476dcfa14c 18
lh14g13 8:4df2a47ab4ee 19
lh14g13 8:4df2a47ab4ee 20 void corner(float &w1,float &w2,float deltaTheta,int maxspeed)
lh14g13 0:b0476dcfa14c 21
lh14g13 7:9aaa4f73bb32 22 void steering(float center, float theta, int maxspeed);
lh14g13 0:b0476dcfa14c 23
lh14g13 1:09226806dd15 24 int cornerPwmControl;// this sets the cornering percentage ratio. value between 1 and 0.
lh14g13 0:b0476dcfa14c 25 // 100 means both motors run at the same speed. 0 means that one motor turns off.
lh14g13 0:b0476dcfa14c 26
lh14g13 0:b0476dcfa14c 27
lh14g13 0:b0476dcfa14c 28
lh14g13 0:b0476dcfa14c 29 // uncomment for testing motor functions.
lh14g13 0:b0476dcfa14c 30
lh14g13 0:b0476dcfa14c 31
lh14g13 7:9aaa4f73bb32 32
lh14g13 7:9aaa4f73bb32 33 //need a function for calcu;lating the angle
lh14g13 7:9aaa4f73bb32 34 //need a function for converting w1 to delta. or do i?
lh14g13 0:b0476dcfa14c 35
lh14g13 10:f4fc8ccde4ad 36 //----------------------------------------------------------------------------------------------------------------------------------
lh14g13 10:f4fc8ccde4ad 37 //----------------------------------------------This is for Motor Set up------------------------------------------------------------
lh14g13 10:f4fc8ccde4ad 38 //----------------------------------------------------------------------------------------------------------------------------------
lh14g13 0:b0476dcfa14c 39
lh14g13 7:9aaa4f73bb32 40 void runMotor() /// putting it into this mode for some reason makes a bit of a whinning noise (this may simply just be the motor running)
lh14g13 0:b0476dcfa14c 41 {
lh14g13 0:b0476dcfa14c 42
lh14g13 7:9aaa4f73bb32 43
lh14g13 7:9aaa4f73bb32 44 TFC_SetMotorPWM(0.4,0.7);
lh14g13 0:b0476dcfa14c 45
lh14g13 0:b0476dcfa14c 46 while(1)
lh14g13 0:b0476dcfa14c 47 {
lh14g13 0:b0476dcfa14c 48 if(TFC_ReadPushButton(0)>0)
lh14g13 0:b0476dcfa14c 49 {
lh14g13 0:b0476dcfa14c 50 TFC_SetMotorPWM(0.0,0.0);
lh14g13 7:9aaa4f73bb32 51
lh14g13 0:b0476dcfa14c 52 DefaultMode();
lh14g13 0:b0476dcfa14c 53
lh14g13 0:b0476dcfa14c 54 }
lh14g13 0:b0476dcfa14c 55 }
lh14g13 0:b0476dcfa14c 56 return;
lh14g13 0:b0476dcfa14c 57 }
lh14g13 0:b0476dcfa14c 58
lh14g13 0:b0476dcfa14c 59 void DefaultMode()
lh14g13 0:b0476dcfa14c 60 {
lh14g13 7:9aaa4f73bb32 61 TFC_Init();
lh14g13 0:b0476dcfa14c 62 while(1)
lh14g13 0:b0476dcfa14c 63 {
lh14g13 7:9aaa4f73bb32 64 TFC_HBRIDGE_ENABLE;
lh14g13 0:b0476dcfa14c 65 if(TFC_ReadPushButton(1)>0)
lh14g13 0:b0476dcfa14c 66 {
lh14g13 7:9aaa4f73bb32 67 runMotor();
lh14g13 0:b0476dcfa14c 68 }
lh14g13 0:b0476dcfa14c 69
lh14g13 0:b0476dcfa14c 70 else if(TFC_ReadPushButton(0)>0)
lh14g13 0:b0476dcfa14c 71 {
lh14g13 0:b0476dcfa14c 72 //this will be a debug mode
lh14g13 0:b0476dcfa14c 73 }
lh14g13 0:b0476dcfa14c 74
lh14g13 0:b0476dcfa14c 75
lh14g13 0:b0476dcfa14c 76 }
lh14g13 7:9aaa4f73bb32 77 TFC_HBRIDGE_DISABLE;
lh14g13 0:b0476dcfa14c 78 return;
lh14g13 0:b0476dcfa14c 79 }
lh14g13 10:f4fc8ccde4ad 80 //-----------------------------------------------------------------------------------------------------
lh14g13 10:f4fc8ccde4ad 81 //------------------------ this is for speed control---------------------------------------------------
lh14g13 10:f4fc8ccde4ad 82 //-----------------------------------------------------------------------------------------------------
lh14g13 10:f4fc8ccde4ad 83
lh14g13 10:f4fc8ccde4ad 84
lh14g13 0:b0476dcfa14c 85
lh14g13 0:b0476dcfa14c 86 void Acc(float& motorA, float& motorB)// set up so as to control both motors during acc. Potential use during corners
lh14g13 0:b0476dcfa14c 87 {
lh14g13 0:b0476dcfa14c 88 motorA = motorA + 0.1;
lh14g13 0:b0476dcfa14c 89 motorB = motorB + 0.1;
lh14g13 0:b0476dcfa14c 90 TFC_SetMotorPWM(motorA,motorB);
lh14g13 0:b0476dcfa14c 91
lh14g13 0:b0476dcfa14c 92
lh14g13 0:b0476dcfa14c 93 return ;
lh14g13 0:b0476dcfa14c 94
lh14g13 0:b0476dcfa14c 95 }
lh14g13 0:b0476dcfa14c 96
lh14g13 0:b0476dcfa14c 97 void Decc(float &motorA, float &motorB)
lh14g13 0:b0476dcfa14c 98 {
lh14g13 0:b0476dcfa14c 99 // a good thing to do would be to have a margin for adjustment so that the car cornering can control the acc+dcc much better.
lh14g13 0:b0476dcfa14c 100
lh14g13 0:b0476dcfa14c 101 motorA = motorA - 0.1;
lh14g13 0:b0476dcfa14c 102 motorB = motorB - 0.1;
lh14g13 0:b0476dcfa14c 103
lh14g13 0:b0476dcfa14c 104 TFC_SetMotorPWM(motorA,motorB);
lh14g13 0:b0476dcfa14c 105
lh14g13 0:b0476dcfa14c 106 return ;
lh14g13 0:b0476dcfa14c 107
lh14g13 0:b0476dcfa14c 108 }
lh14g13 0:b0476dcfa14c 109
lh14g13 0:b0476dcfa14c 110
lh14g13 0:b0476dcfa14c 111 void StartLine()
lh14g13 0:b0476dcfa14c 112 {
lh14g13 0:b0476dcfa14c 113 TFC_HBRIDGE_ENABLE;
lh14g13 0:b0476dcfa14c 114 float a=0;
lh14g13 0:b0476dcfa14c 115 float b=0;
lh14g13 0:b0476dcfa14c 116
lh14g13 0:b0476dcfa14c 117 int x=0 ;
lh14g13 0:b0476dcfa14c 118 while(x<5)
lh14g13 0:b0476dcfa14c 119 {
lh14g13 0:b0476dcfa14c 120 Acc(a,b);
lh14g13 0:b0476dcfa14c 121 wait(0.5);
lh14g13 0:b0476dcfa14c 122 x++ ;
lh14g13 0:b0476dcfa14c 123 }
lh14g13 0:b0476dcfa14c 124
lh14g13 0:b0476dcfa14c 125 return ;
lh14g13 0:b0476dcfa14c 126 }
lh14g13 0:b0476dcfa14c 127
lh14g13 0:b0476dcfa14c 128 void finishLine(float pwmA)
lh14g13 0:b0476dcfa14c 129 {
lh14g13 0:b0476dcfa14c 130 float pwmB= pwmA;
lh14g13 0:b0476dcfa14c 131 while(pwmA>0)
lh14g13 0:b0476dcfa14c 132 {
lh14g13 0:b0476dcfa14c 133
lh14g13 0:b0476dcfa14c 134
lh14g13 0:b0476dcfa14c 135 Decc(pwmA,pwmB);
lh14g13 0:b0476dcfa14c 136
lh14g13 0:b0476dcfa14c 137 }
lh14g13 0:b0476dcfa14c 138 return;
lh14g13 0:b0476dcfa14c 139 }
lh14g13 0:b0476dcfa14c 140
lh14g13 0:b0476dcfa14c 141
lh14g13 9:22b119eef1de 142 void speedSetting(int w1, int w2 ,int w1M, int w2M)
lh14g13 9:22b119eef1de 143 {
lh14g13 9:22b119eef1de 144 // need to compare the measured frequency
lh14g13 9:22b119eef1de 145
lh14g13 9:22b119eef1de 146 float deltaW1 = w1 - w1M;
lh14g13 9:22b119eef1de 147 float deltaW2 = w2 - w2M;
lh14g13 9:22b119eef1de 148
lh14g13 9:22b119eef1de 149 if(delatW1 <0)
lh14g13 9:22b119eef1de 150 {
lh14g13 9:22b119eef1de 151 changespeed(0,w1);
lh14g13 9:22b119eef1de 152 }
lh14g13 9:22b119eef1de 153
lh14g13 9:22b119eef1de 154 else if(delatW1 >0)
lh14g13 9:22b119eef1de 155 {
lh14g13 9:22b119eef1de 156 changespeed(1,w1);
lh14g13 9:22b119eef1de 157 }
lh14g13 9:22b119eef1de 158 return;
lh14g13 9:22b119eef1de 159 }
lh14g13 9:22b119eef1de 160
lh14g13 9:22b119eef1de 161 //need to fill out function for calculating the change in speed.
lh14g13 9:22b119eef1de 162 void changespeed(bool a, float w)
lh14g13 9:22b119eef1de 163 {
lh14g13 9:22b119eef1de 164 float change;
lh14g13 9:22b119eef1de 165
lh14g13 9:22b119eef1de 166 if(a == 1)
lh14g13 9:22b119eef1de 167 {
lh14g13 9:22b119eef1de 168 w+= change;
lh14g13 9:22b119eef1de 169 }
lh14g13 9:22b119eef1de 170
lh14g13 9:22b119eef1de 171 else if (a ==0)
lh14g13 9:22b119eef1de 172 {
lh14g13 9:22b119eef1de 173
lh14g13 9:22b119eef1de 174 w-= change;
lh14g13 9:22b119eef1de 175 }
lh14g13 9:22b119eef1de 176 return;
lh14g13 9:22b119eef1de 177 }
lh14g13 9:22b119eef1de 178
lh14g13 8:4df2a47ab4ee 179 //----------------------------------------------------------------------------------------------------------------------------
lh14g13 8:4df2a47ab4ee 180 //------------------------------------------------Cornering Control-----------------------------------------------------------
lh14g13 8:4df2a47ab4ee 181 //----------------------------------------------------------------------------------------------------------------------------
lh14g13 2:cc8ddc587af7 182
lh14g13 10:f4fc8ccde4ad 183
lh14g13 10:f4fc8ccde4ad 184
lh14g13 10:f4fc8ccde4ad 185 // this is a function whihc works off of the duty cycle.
lh14g13 10:f4fc8ccde4ad 186 void dutyCycleCorner( float speed,float & w1, float & w2,float middlePoint)
lh14g13 10:f4fc8ccde4ad 187 {
lh14g13 10:f4fc8ccde4ad 188 float width;
lh14g13 10:f4fc8ccde4ad 189 //float radius= center(middlePoint);
lh14g13 10:f4fc8ccde4ad 190 float radius = 0.6;
lh14g13 10:f4fc8ccde4ad 191 float w1=(speed/radius)*(radius + width/2);
lh14g13 10:f4fc8ccde4ad 192 float w2=(speed/radius)*(radius - width/2);
lh14g13 10:f4fc8ccde4ad 193
lh14g13 10:f4fc8ccde4ad 194 TFC_
lh14g13 10:f4fc8ccde4ad 195
lh14g13 10:f4fc8ccde4ad 196
lh14g13 10:f4fc8ccde4ad 197
lh14g13 10:f4fc8ccde4ad 198 return;
lh14g13 10:f4fc8ccde4ad 199 }
lh14g13 10:f4fc8ccde4ad 200
lh14g13 2:cc8ddc587af7 201
lh14g13 8:4df2a47ab4ee 202 void corner(float &w1,float &w2,float deltaTheta,int maxspeed)
lh14g13 2:cc8ddc587af7 203 {// when cornering left the left motor slows down more than the right hand side
lh14g13 2:cc8ddc587af7 204 // may just replace with ACC and DECC
lh14g13 3:5b5d5af46804 205 float r;
lh14g13 3:5b5d5af46804 206 float d;
lh14g13 3:5b5d5af46804 207 float l;
lh14g13 2:cc8ddc587af7 208 // it may be worth doing this off the change in theta. so that it is insesnsitive to the calibration.
lh14g13 4:e15ec9052a78 209 float diff= ((d*tan(deltaTheta)/(2*l)));
lh14g13 3:5b5d5af46804 210
lh14g13 8:4df2a47ab4ee 211 float w1 = (maxspeed/r)*(1+diff);
lh14g13 8:4df2a47ab4ee 212 float w2 = (maxspeed/r)*(1-diff);
lh14g13 3:5b5d5af46804 213
lh14g13 8:4df2a47ab4ee 214
lh14g13 2:cc8ddc587af7 215
lh14g13 2:cc8ddc587af7 216
lh14g13 2:cc8ddc587af7 217 return;
lh14g13 2:cc8ddc587af7 218 }
lh14g13 2:cc8ddc587af7 219
lh14g13 7:9aaa4f73bb32 220
lh14g13 7:9aaa4f73bb32 221
lh14g13 5:c50e40797114 222
lh14g13 7:9aaa4f73bb32 223 float centerWheels(float min, float max)
lh14g13 7:9aaa4f73bb32 224 {
lh14g13 7:9aaa4f73bb32 225 float center= (min +max)/2;
lh14g13 7:9aaa4f73bb32 226
lh14g13 7:9aaa4f73bb32 227 return center;
lh14g13 7:9aaa4f73bb32 228 }
lh14g13 7:9aaa4f73bb32 229
lh14g13 8:4df2a47ab4ee 230 void steering(float center, float theta, int maxspeed,float & w1, float & w2)
lh14g13 8:4df2a47ab4ee 231 { // this function is for simply calculating the motor speeds. this reduces the amount of calculations needed
lh14g13 8:4df2a47ab4ee 232 //and can be triggered when the car steers.
lh14g13 8:4df2a47ab4ee 233
lh14g13 8:4df2a47ab4ee 234
lh14g13 7:9aaa4f73bb32 235 float deltaTheta = center- theta;
lh14g13 9:22b119eef1de 236
lh14g13 9:22b119eef1de 237 // need to convert to degrees/radians. that can do the above as well.
lh14g13 7:9aaa4f73bb32 238 if(deltaTheta <0)
lh14g13 7:9aaa4f73bb32 239 {
lh14g13 7:9aaa4f73bb32 240 // going left?
lh14g13 8:4df2a47ab4ee 241 corner(w1,w2,deltaTheta,maxspeed);
lh14g13 5:c50e40797114 242 }
lh14g13 2:cc8ddc587af7 243
lh14g13 7:9aaa4f73bb32 244 else()
lh14g13 7:9aaa4f73bb32 245 {
lh14g13 7:9aaa4f73bb32 246 //going right?
lh14g13 9:22b119eef1de 247 corner(w2,w1,deltaTheta);
lh14g13 7:9aaa4f73bb32 248
lh14g13 7:9aaa4f73bb32 249 }
lh14g13 2:cc8ddc587af7 250
lh14g13 7:9aaa4f73bb32 251 return;
lh14g13 7:9aaa4f73bb32 252 }