copia12092018

Dependencies:   mbed

Committer:
viaromassimo
Date:
Fri Jun 29 13:07:46 2018 +0000
Revision:
4:1643fea75703
Parent:
3:1cd8d048cd4a
Child:
5:72bdc69d610d
V3;; rewritten.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nerit 0:b0a79a3a9da8 1 #include "main.h"
nerit 0:b0a79a3a9da8 2
nerit 0:b0a79a3a9da8 3 //***************************************************
nerit 0:b0a79a3a9da8 4 void DC_prepare(){
nerit 0:b0a79a3a9da8 5 // direction or brake preparation
nerit 0:b0a79a3a9da8 6 if (DC_brake==1){
viaromassimo 4:1643fea75703 7 SDmotorInA=1;
viaromassimo 4:1643fea75703 8 SDmotorInB=1;
nerit 0:b0a79a3a9da8 9 }else{
nerit 0:b0a79a3a9da8 10 if (DC_forward==1){
nerit 0:b0a79a3a9da8 11 SDmotorInA=1;
nerit 0:b0a79a3a9da8 12 SDmotorInB=0;
nerit 0:b0a79a3a9da8 13 }else{
nerit 0:b0a79a3a9da8 14 SDmotorInA=0;
nerit 0:b0a79a3a9da8 15 SDmotorInB=1;
nerit 0:b0a79a3a9da8 16 }
nerit 0:b0a79a3a9da8 17 }
nerit 0:b0a79a3a9da8 18 // fault reading
nerit 0:b0a79a3a9da8 19 if (SDmotorInA==1){
nerit 0:b0a79a3a9da8 20 SD_faultA=1;
nerit 0:b0a79a3a9da8 21 }else{
nerit 0:b0a79a3a9da8 22 SD_faultA=0;
nerit 0:b0a79a3a9da8 23 }
nerit 0:b0a79a3a9da8 24 if (SDmotorInB==1){
nerit 0:b0a79a3a9da8 25 SD_faultB=1;
nerit 0:b0a79a3a9da8 26 }else{
nerit 0:b0a79a3a9da8 27 SD_faultB=0;
nerit 0:b0a79a3a9da8 28 }
nerit 0:b0a79a3a9da8 29 }
nerit 0:b0a79a3a9da8 30
nerit 0:b0a79a3a9da8 31 //***************************************************
viaromassimo 4:1643fea75703 32 void ResetData(){
viaromassimo 4:1643fea75703 33 ReadWheelArray.clear();
viaromassimo 4:1643fea75703 34 ReadMotorArray.clear();
viaromassimo 4:1643fea75703 35 ElapsedM=0;
viaromassimo 4:1643fea75703 36 ElapsedW=0;
viaromassimo 4:1643fea75703 37 TempReadM=0;
viaromassimo 4:1643fea75703 38 TempReadW=0;
viaromassimo 4:1643fea75703 39 WheelData=0;
viaromassimo 4:1643fea75703 40 MotorData=0;
viaromassimo 4:1643fea75703 41 motorPID.reset();
viaromassimo 4:1643fea75703 42 WantedMotorSpeed=0;
viaromassimo 4:1643fea75703 43 ReadMotorSpeed=0;
viaromassimo 4:1643fea75703 44 motorPID.setProcessValue(0);
viaromassimo 4:1643fea75703 45 }
viaromassimo 4:1643fea75703 46
viaromassimo 4:1643fea75703 47 //***************************************************
nerit 0:b0a79a3a9da8 48 void OffTheMotor(){
viaromassimo 4:1643fea75703 49 MotorPwmPin.write(0); // duty cycle=off - off the motor
viaromassimo 4:1643fea75703 50 DC_brake=1;
viaromassimo 4:1643fea75703 51 DC_prepare();
viaromassimo 4:1643fea75703 52 SecurityStop=1;
viaromassimo 4:1643fea75703 53 ResetData();
nerit 0:b0a79a3a9da8 54 }
nerit 0:b0a79a3a9da8 55
nerit 0:b0a79a3a9da8 56 //***************************************************
nerit 0:b0a79a3a9da8 57 void ReadWheelInterrupt(){ //interrupt that read the wheel sensor
viaromassimo 4:1643fea75703 58 TempReadW=uSWheel.read_us();
viaromassimo 4:1643fea75703 59 if(TempReadW>200){ //thi s filter is used to avoid double readings
viaromassimo 4:1643fea75703 60 if(TempReadW>800000){
viaromassimo 4:1643fea75703 61 TempReadW=800000;
viaromassimo 4:1643fea75703 62 }
viaromassimo 4:1643fea75703 63 ReadWheelArray.push(TempReadW);
viaromassimo 4:1643fea75703 64 uSWheel.reset();
viaromassimo 4:1643fea75703 65 WheelData=1;
viaromassimo 4:1643fea75703 66 }
nerit 0:b0a79a3a9da8 67 }
nerit 0:b0a79a3a9da8 68
nerit 0:b0a79a3a9da8 69 //***************************************************
nerit 0:b0a79a3a9da8 70 void ReadMotorInterrupt(){ //interrupt that read the motor sensor
viaromassimo 4:1643fea75703 71 TempReadM=uSMotor.read_us();
viaromassimo 4:1643fea75703 72 if(TempReadM>200){ //thi s filter is used to avoid double readings, since the code takes 10 to 40 uS to cycle
viaromassimo 4:1643fea75703 73 if(TempReadM>100000){
viaromassimo 4:1643fea75703 74 TempReadM=100000;
viaromassimo 4:1643fea75703 75 }
viaromassimo 3:1cd8d048cd4a 76 ReadMotorArray.push(TempReadM);
viaromassimo 3:1cd8d048cd4a 77 uSMotor.reset();
viaromassimo 4:1643fea75703 78 MotorData=1;
viaromassimo 4:1643fea75703 79 }
nerit 0:b0a79a3a9da8 80 }
nerit 0:b0a79a3a9da8 81
nerit 0:b0a79a3a9da8 82 //***************************************************
nerit 0:b0a79a3a9da8 83 void CheckPercentSwitch(){ //this below checks the add/take off Percent switches, with the control of the vibrations applied
viaromassimo 4:1643fea75703 84 if(PlusPercentPin==1){
viaromassimo 4:1643fea75703 85 if(ChangeStatusOfPlusPercentPinToHigh==1){
viaromassimo 4:1643fea75703 86 ChangeStatusOfPlusPercentPinToHigh=0;
viaromassimo 4:1643fea75703 87 vibPlusToHSwitch.start();
viaromassimo 4:1643fea75703 88 }else if(vibPlusToHSwitch.read_ms()>VibrationTimer){
viaromassimo 4:1643fea75703 89 vibPlusToHSwitch.stop();
viaromassimo 4:1643fea75703 90 vibPlusToLSwitch.stop();
viaromassimo 4:1643fea75703 91 vibPlusToLSwitch.reset();
viaromassimo 4:1643fea75703 92 ChangeStatusOfPlusPercentPinToLow=1;
viaromassimo 4:1643fea75703 93 PercentPlus=1;
viaromassimo 4:1643fea75703 94 }
viaromassimo 4:1643fea75703 95 }else{
viaromassimo 4:1643fea75703 96 if(ChangeStatusOfPlusPercentPinToLow==1){
viaromassimo 4:1643fea75703 97 ChangeStatusOfPlusPercentPinToLow=0;
viaromassimo 4:1643fea75703 98 vibPlusToLSwitch.start();
viaromassimo 4:1643fea75703 99 }else if(vibPlusToLSwitch.read_ms()>VibrationTimer){
viaromassimo 4:1643fea75703 100 vibPlusToLSwitch.stop();
viaromassimo 4:1643fea75703 101 vibPlusToHSwitch.stop();
viaromassimo 4:1643fea75703 102 vibPlusToHSwitch.reset();
viaromassimo 4:1643fea75703 103 ChangeStatusOfPlusPercentPinToHigh=1;
viaromassimo 4:1643fea75703 104 PercentPlus=0;
viaromassimo 4:1643fea75703 105 }
nerit 0:b0a79a3a9da8 106 }
nerit 0:b0a79a3a9da8 107
viaromassimo 4:1643fea75703 108 if(MinusPercentPin==1){
viaromassimo 4:1643fea75703 109 if(ChangeStatusOfMinusPercentPinToHigh==1){
viaromassimo 4:1643fea75703 110 ChangeStatusOfMinusPercentPinToHigh=0;
viaromassimo 4:1643fea75703 111 vibMinusToHSwitch.start();
viaromassimo 4:1643fea75703 112 }else if(vibMinusToHSwitch.read_ms()>VibrationTimer){
viaromassimo 4:1643fea75703 113 vibMinusToHSwitch.stop();
viaromassimo 4:1643fea75703 114 vibMinusToLSwitch.stop();
viaromassimo 4:1643fea75703 115 vibMinusToLSwitch.reset();
viaromassimo 4:1643fea75703 116 ChangeStatusOfMinusPercentPinToLow=1;
viaromassimo 4:1643fea75703 117 PercentMinus=1;
viaromassimo 4:1643fea75703 118 }
viaromassimo 4:1643fea75703 119 }else{
viaromassimo 4:1643fea75703 120 if(ChangeStatusOfMinusPercentPinToLow==1){
viaromassimo 4:1643fea75703 121 ChangeStatusOfMinusPercentPinToLow=0;
viaromassimo 4:1643fea75703 122 vibMinusToLSwitch.start();
viaromassimo 4:1643fea75703 123 }else if(vibMinusToLSwitch.read_ms()>VibrationTimer){
viaromassimo 4:1643fea75703 124 vibMinusToLSwitch.stop();
viaromassimo 4:1643fea75703 125 vibMinusToHSwitch.stop();
viaromassimo 4:1643fea75703 126 vibMinusToHSwitch.reset();
viaromassimo 4:1643fea75703 127 ChangeStatusOfMinusPercentPinToHigh=1;
viaromassimo 4:1643fea75703 128 PercentMinus=0;
viaromassimo 4:1643fea75703 129 }
nerit 0:b0a79a3a9da8 130 }
nerit 0:b0a79a3a9da8 131
viaromassimo 4:1643fea75703 132 if(PercentPlus==0 && PercentMinus==1){
viaromassimo 4:1643fea75703 133 Percent=1.1f;
viaromassimo 4:1643fea75703 134 }
viaromassimo 4:1643fea75703 135 if(PercentPlus==1 && PercentMinus==0){
viaromassimo 4:1643fea75703 136 Percent=0.9f;
viaromassimo 4:1643fea75703 137 }
viaromassimo 4:1643fea75703 138 if(PercentPlus==1 && PercentMinus==1){
viaromassimo 4:1643fea75703 139 Percent=1.0f;
viaromassimo 4:1643fea75703 140 }
viaromassimo 4:1643fea75703 141 if(PercentPlus==0 && PercentMinus==0){
viaromassimo 4:1643fea75703 142 Percent=1.0f;
nerit 0:b0a79a3a9da8 143 //GENERATE AN ERROR SOMEHOW
viaromassimo 4:1643fea75703 144 }
viaromassimo 4:1643fea75703 145 }
viaromassimo 4:1643fea75703 146
viaromassimo 4:1643fea75703 147 //***************************************************
viaromassimo 4:1643fea75703 148 void writelog(){
viaromassimo 4:1643fea75703 149 pc.printf("\nMotorSpeedCorrected %f",MotorSpeedCorrected);
viaromassimo 4:1643fea75703 150 pc.printf(" - WantedMotorSpeed %d",WantedMotorSpeed);
viaromassimo 4:1643fea75703 151 pc.printf(" - ReadMotorSpeed %d",ReadMotorSpeed);
viaromassimo 4:1643fea75703 152 pc.printf(" - ElapsedW %d",ElapsedW);
viaromassimo 4:1643fea75703 153 pc.printf(" - TempReadW %d",TempReadW);
viaromassimo 4:1643fea75703 154 pc.printf(" - ElapsedM %d",ElapsedM);
viaromassimo 4:1643fea75703 155 pc.printf(" - TempReadM %d",TempReadM);
viaromassimo 4:1643fea75703 156 pc.printf(" - Plus %d",PercentPlus);
viaromassimo 4:1643fea75703 157 pc.printf(" - Minus %d",PercentMinus);
viaromassimo 4:1643fea75703 158 pc.printf(" - Security %d",SecurityStop);
nerit 0:b0a79a3a9da8 159 }
nerit 0:b0a79a3a9da8 160
nerit 0:b0a79a3a9da8 161 //***************************************************
nerit 0:b0a79a3a9da8 162 void CheckMotorCorrection(){
viaromassimo 4:1643fea75703 163 if(MotorSensorError==0 && SecurityStop==0){
viaromassimo 4:1643fea75703 164 CheckPercentSwitch();
viaromassimo 4:1643fea75703 165 WantedMotorSpeed=(float)((60000000/(ElapsedW*TrigsPerWheelRevolution))*WheelToMotorRatio*Percent); // =(( WHEEL_REVOLUTIONS/MINUTES )* RATIO CHANGE * +/- % ); rev/min
viaromassimo 4:1643fea75703 166 if(WantedMotorSpeed<MinMotorSpeed){
viaromassimo 4:1643fea75703 167 WantedMotorSpeed=0;
viaromassimo 4:1643fea75703 168 }
viaromassimo 4:1643fea75703 169
viaromassimo 4:1643fea75703 170 if(MachineType=="electric"){
viaromassimo 4:1643fea75703 171 motorPID.setSetPoint(WantedMotorSpeed);
viaromassimo 4:1643fea75703 172 motorPID.setProcessValue(ReadMotorSpeed);
viaromassimo 4:1643fea75703 173 MotorSpeedCorrected=motorPID.compute();
viaromassimo 4:1643fea75703 174 if(WantedMotorSpeed!=0 && uSMotor.read_us()>1000000){
viaromassimo 4:1643fea75703 175 MotorSensorSecurityCheck=MotorSensorSecurityCheck++;
viaromassimo 4:1643fea75703 176 if(MotorSensorSecurityCheck>50){
viaromassimo 4:1643fea75703 177 MotorSensorError=1; // OFF and ON to reset
viaromassimo 4:1643fea75703 178 }
viaromassimo 4:1643fea75703 179 }else{
viaromassimo 4:1643fea75703 180 MotorSensorSecurityCheck=0;
viaromassimo 4:1643fea75703 181 }
viaromassimo 4:1643fea75703 182 }
viaromassimo 4:1643fea75703 183
viaromassimo 4:1643fea75703 184 if(MachineType=="idraulic"){
viaromassimo 4:1643fea75703 185 MotorSpeedCorrected=(float)((WantedMotorSpeed*(100-MinMotorPwm)/MaxMotorSpeed)+MinMotorPwm)/100.0f; //this pwm calculation accept the variable "MinMotorPwm" to set the minimal pwm point at which the motor can start. the scale won't be 0-255, but MinMotorPwm-255
viaromassimo 4:1643fea75703 186 }
viaromassimo 4:1643fea75703 187
viaromassimo 4:1643fea75703 188 MotorPwmPin.write(MotorSpeedCorrected);
viaromassimo 4:1643fea75703 189 DC_brake=0;
viaromassimo 4:1643fea75703 190 DC_prepare();
viaromassimo 4:1643fea75703 191
viaromassimo 4:1643fea75703 192 writelog();
viaromassimo 4:1643fea75703 193
viaromassimo 4:1643fea75703 194 }else{
viaromassimo 4:1643fea75703 195 OffTheMotor();
nerit 0:b0a79a3a9da8 196 }
nerit 0:b0a79a3a9da8 197 }
nerit 0:b0a79a3a9da8 198
nerit 0:b0a79a3a9da8 199 //***************************************************
nerit 0:b0a79a3a9da8 200 void CheckTimeElapsedFromLastTrig(){ //check time Elapsed from last wheel trig
viaromassimo 4:1643fea75703 201 if((uSWheel.read_us()>(ReadWheelArray.last()*DecelerationControlRatio)) ){ //if the lag between the last read and now is more than *DecelerationControlRatio* times of the last trig or more of a max limit, or equal 1 -so, no reads- (this is an error control), it assumes the speed is too slow to act and resets
viaromassimo 4:1643fea75703 202 OffTheMotor();
viaromassimo 4:1643fea75703 203 }else{
viaromassimo 4:1643fea75703 204 SecurityStop=0;
nerit 0:b0a79a3a9da8 205 }
nerit 0:b0a79a3a9da8 206 }
nerit 0:b0a79a3a9da8 207
nerit 0:b0a79a3a9da8 208 //***************************************************
nerit 0:b0a79a3a9da8 209 void SetMotorSpeed(){
viaromassimo 4:1643fea75703 210 CheckTimeElapsedFromLastTrig();
viaromassimo 4:1643fea75703 211
viaromassimo 4:1643fea75703 212 if(WheelData==1){
viaromassimo 4:1643fea75703 213 ElapsedW=0;
viaromassimo 4:1643fea75703 214 a=0;
viaromassimo 4:1643fea75703 215 for(i=0; i<(ReadWheelArray.size()-1); i++){
viaromassimo 4:1643fea75703 216 if(ReadWheelArray[i]!=1 && ReadWheelArray[i]!=0){ //avoid reading of 1 or 0 values in the array
viaromassimo 4:1643fea75703 217 a++; //number of all the valid readings
viaromassimo 4:1643fea75703 218 ElapsedW=ElapsedW+ReadWheelArray[i]; //all the valid readings are summed
viaromassimo 4:1643fea75703 219 }
viaromassimo 4:1643fea75703 220 }
viaromassimo 4:1643fea75703 221 ElapsedW=ElapsedW/a; //calculation of avarage of the valid readings
viaromassimo 4:1643fea75703 222 WheelData=0;
viaromassimo 3:1cd8d048cd4a 223 }
viaromassimo 4:1643fea75703 224
viaromassimo 4:1643fea75703 225 if(MotorData==1){
viaromassimo 4:1643fea75703 226 ElapsedM=0;
viaromassimo 4:1643fea75703 227 a=0;
viaromassimo 4:1643fea75703 228 for(i=0; i<(ReadMotorArray.size()-1); i++){
viaromassimo 4:1643fea75703 229 if(ReadMotorArray[i]!=1 && ReadMotorArray[i]!=0){ //avoid reading of 1 or 0 values in the array
viaromassimo 4:1643fea75703 230 a++; //number of all the valid readings
viaromassimo 4:1643fea75703 231 ElapsedM=ElapsedM+ReadMotorArray[i]; //all the valid readings are summed
viaromassimo 4:1643fea75703 232 }
viaromassimo 4:1643fea75703 233 }
viaromassimo 4:1643fea75703 234 ElapsedM=ElapsedM/a;
viaromassimo 4:1643fea75703 235 MotorData=0;
viaromassimo 4:1643fea75703 236 }
viaromassimo 4:1643fea75703 237
viaromassimo 4:1643fea75703 238 if(ElapsedM==0){
viaromassimo 4:1643fea75703 239 ReadMotorSpeed=0;
viaromassimo 3:1cd8d048cd4a 240 }else{
viaromassimo 4:1643fea75703 241 ReadMotorSpeed=float(60000000/(ElapsedM*4.0f)); // rev/min
viaromassimo 3:1cd8d048cd4a 242 }
nerit 0:b0a79a3a9da8 243 }
nerit 0:b0a79a3a9da8 244
nerit 0:b0a79a3a9da8 245 //***************************************************
nerit 0:b0a79a3a9da8 246 void SwitchOnOff(){ //this below checks the on/off Percent switches, with the control of the vibrations and the Previous status (for variable reset purposes) applied
viaromassimo 3:1cd8d048cd4a 247 // pc.printf("\nTIME %d ",uSCycle.read_us());
viaromassimo 3:1cd8d048cd4a 248 // uSCycle.reset();
viaromassimo 4:1643fea75703 249 if(OnOffPin==0){
viaromassimo 4:1643fea75703 250 if(ChangeStatusOfOnOffPinToHigh==1){
viaromassimo 4:1643fea75703 251 ChangeStatusOfOnOffPinToHigh=0;
viaromassimo 4:1643fea75703 252 vibOnOffSwitch.start();
viaromassimo 4:1643fea75703 253 }else if(vibOnOffSwitch.read_ms()>VibrationTimer){
viaromassimo 4:1643fea75703 254 vibOnOffSwitch.stop();
viaromassimo 4:1643fea75703 255 if(ChangeFromOffToOn==1){
viaromassimo 4:1643fea75703 256 ChangeFromOffToOn=0;
viaromassimo 4:1643fea75703 257 }
viaromassimo 4:1643fea75703 258 DC_brake=0;
viaromassimo 4:1643fea75703 259 DC_prepare();
viaromassimo 4:1643fea75703 260 SetMotorSpeed();
viaromassimo 4:1643fea75703 261 }
viaromassimo 4:1643fea75703 262 }else{
viaromassimo 4:1643fea75703 263 ChangeStatusOfOnOffPinToHigh=1;
viaromassimo 4:1643fea75703 264 vibOnOffSwitch.stop();
viaromassimo 4:1643fea75703 265 vibOnOffSwitch.reset();
viaromassimo 4:1643fea75703 266 ChangeFromOffToOn=1;
nerit 0:b0a79a3a9da8 267 MotorSensorError=0;
viaromassimo 4:1643fea75703 268 OffTheMotor();
nerit 0:b0a79a3a9da8 269 }
nerit 0:b0a79a3a9da8 270 }
nerit 0:b0a79a3a9da8 271
nerit 0:b0a79a3a9da8 272 //***************************************************
nerit 0:b0a79a3a9da8 273 //***************************************************
nerit 0:b0a79a3a9da8 274 //***************************************************
viaromassimo 4:1643fea75703 275 int main(){
viaromassimo 4:1643fea75703 276 wait(1);
viaromassimo 4:1643fea75703 277 uSMotor.start();
viaromassimo 4:1643fea75703 278 uSWheel.start();
viaromassimo 4:1643fea75703 279 MotorPwmPin.period_us(2000); // freq 1khz
viaromassimo 4:1643fea75703 280 MotorPwmPin.write(0.0f); // duty cycle=off
viaromassimo 4:1643fea75703 281 OffTheMotor();
nerit 0:b0a79a3a9da8 282 MSToMotorNewCheck.attach(&CheckMotorCorrection, 0.1); //check motor correction every xx seconds
viaromassimo 4:1643fea75703 283 ReadWheelArray.clear();
viaromassimo 4:1643fea75703 284 ReadMotorArray.clear();
viaromassimo 4:1643fea75703 285 pc.printf("\n\n Hello World\n\n");
nerit 0:b0a79a3a9da8 286
viaromassimo 4:1643fea75703 287 WheelSensorPin.rise(&ReadWheelInterrupt); //interrupt for wheel sensor, trigs when changes from 0 to 1
viaromassimo 4:1643fea75703 288 MotorSensorPin.rise(&ReadMotorInterrupt); //interrupt for motor sensor, trigs when changes from 0 to 1
viaromassimo 4:1643fea75703 289
viaromassimo 4:1643fea75703 290 motorPID.setInputLimits(0, 10000); //70*secondosinaminute*trigsperwheelrevolutions
viaromassimo 4:1643fea75703 291 motorPID.setOutputLimits(0.0f, 1.0f);
viaromassimo 4:1643fea75703 292 motorPID.setMode(1);
viaromassimo 4:1643fea75703 293 motorPID.setSetPoint(1000);
nerit 0:b0a79a3a9da8 294
nerit 0:b0a79a3a9da8 295 //***************************************************
nerit 0:b0a79a3a9da8 296 //***************************************************
nerit 0:b0a79a3a9da8 297 //***************************************************
viaromassimo 4:1643fea75703 298 while(1){
viaromassimo 4:1643fea75703 299 SwitchOnOff();
viaromassimo 4:1643fea75703 300 }
nerit 0:b0a79a3a9da8 301 }