00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __MSMMUX_H__
00013 #define __MSMMUX_H__
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #pragma systemFile
00036
00037 #ifndef __COMMON_H__
00038 #include "common.h"
00039 #endif
00040
00041 #ifndef __MMUX_H__
00042 #include "MMUX-common.h"
00043 #endif
00044
00045 #define MSMMUX_I2C_ADDR 0x06
00046
00047
00048 #define MSMMUX_REG_CMD 0x41
00049
00050 #define MSMMUX_MOT_OFFSET 0x42
00051 #define MSMMUX_TARG_ENC 0x00
00052 #define MSMMUX_POWER 0x04
00053 #define MSMMUX_TARG_TIME 0x05
00054 #define MSMMUX_CMD_B 0x06
00055 #define MSMMUX_CMD_A 0x07
00056 #define MSMMUX_ENTRY_SIZE 0x08
00057 #define MSMMUX_TACHO_MOT1 0x62
00058 #define MSMMUX_TACHO_MOT2 0x66
00059 #define MSMMUX_STATUS_MOT1 0x72
00060 #define MSMMUX_STATUS_MOT2 0x73
00061
00062
00063 #define MSMMUX_KP_TACHO 0x7A
00064 #define MSMMUX_KI_TACHO 0x7C
00065 #define MSMMUX_KD_TACHO 0x7E
00066 #define MSMMUX_KP_SPEED 0x80
00067 #define MSMMUX_KI_SPEED 0x82
00068 #define MSMMUX_KD_SPEED 0x84
00069 #define MSMMUX_PASSCOUNT 0x86
00070 #define MSMMUX_TOLERANCE 0x87
00071
00072
00073 #define MSMMUX_CMD_RESET_ALL 0x52
00074 #define MSMMUX_CMD_START_BOTH 0x53
00075 #define MSMMUX_CMD_FLOAT_MOT1 0x61
00076 #define MSMMUX_CMD_FLOAT_MOT2 0x62
00077 #define MSMMUX_CMD_FLOAT_BOTH 0x63
00078 #define MSMMUX_CMD_BRAKE_MOT1 0x41
00079 #define MSMMUX_CMD_BRAKE_MOT2 0x42
00080 #define MSMMUX_CMD_BRAKE_BOTH 0x43
00081 #define MSMMUX_CMD_RESET_MOT1 0x72
00082 #define MSMMUX_CMD_RESET_MOT2 0x73
00083
00084
00085 #define MSMMUX_STAT_SPEED_CTRL (0x01 << 0)
00086 #define MSMMUX_STAT_RAMPING (0x01 << 1)
00087 #define MSMMUX_STAT_POWERED (0x01 << 2)
00088 #define MSMMUX_STAT_POS_CTRL (0x01 << 3)
00089 #define MSMMUX_STAT_BRAKED (0x01 << 4)
00090 #define MSMMUX_STAT_OVERLOADED (0x01 << 5)
00091 #define MSMMUX_STAT_TIMED (0x01 << 6)
00092 #define MSMMUX_STAT_STALLED (0x01 << 7)
00093
00094
00095 #define MSMMUX_CMD_SPEED 0x01
00096 #define MSMMUX_CMD_RAMP 0x02
00097 #define MSMMUX_CMD_RELATIVE 0x04
00098 #define MSMMUX_CMD_TACHO 0x08
00099 #define MSMMUX_CMD_BRK 0x10
00100 #define MSMMUX_CMD_HOLDPOS 0x20
00101 #define MSMMUX_CMD_TIME 0x40
00102 #define MSMMUX_CMD_GO 0x80
00103
00104 #define MSMMUX_RAMP_NONE 0x00
00105 #define MSMMUX_RAMP_UP_DOWN 0x03
00106
00107 #define MSMMUX_ROT_UNLIMITED 0x00
00108 #define MSMMUX_ROT_DEGREES 0x01
00109
00110 #define MSMMUX_ROT_SECONDS 0x03
00111
00112
00113 tByteArray MSMMUX_I2CRequest;
00114 tByteArray MSMMUX_I2CReply;
00115
00116
00117 void MSMMUXinit();
00118 bool MSMMUXreadStatus(tMUXmotor muxmotor, ubyte &motorStatus);
00119 bool MSMMUXsendCommand(tSensors link, ubyte channel, long setpoint, byte speed, ubyte seconds, ubyte commandA);
00120 bool MSMMUXsendCommand(tSensors link, ubyte command);
00121 bool MSMMUXsetPID(tSensors link, int kpTacho, int kiTacho, int kdTacho, int kpSpeed, int kiSpeed, int kdSpeed, ubyte passCount, ubyte tolerance);
00122 bool MSMMotor(tMUXmotor muxmotor, byte power);
00123 bool MSMotorStop(tMUXmotor muxmotor);
00124 bool MSMotorStop(tMUXmotor muxmotor, bool brake);
00125 void MSMMotorSetRotationTarget(tMUXmotor muxmotor, long target);
00126 void MSMMotorSetTimeTarget(tMUXmotor muxmotor, int target);
00127 void MSMMotorSetEncoderTarget(tMUXmotor muxmotor, long target);
00128 void MSMMotorSetEncoderTarget(tMUXmotor muxmotor, long target, bool relative);
00129 long MSMMotorEncoder(tMUXmotor muxmotor);
00130 bool MSMMotorEncoderReset(tMUXmotor muxmotor);
00131 bool MSMMotorEncoderResetAll(tSensors link);
00132 bool MSMMotorBusy(tMUXmotor muxmotor);
00133 bool MSMMotorStalled(tMUXmotor muxmotor);
00134 void MSMMotorSetBrake(tMUXmotor muxmotor);
00135 void MSMMotorSetFloat(tMUXmotor muxmotor);
00136 void MSMMotorSetSpeedCtrl(tMUXmotor muxmotor, bool constspeed);
00137 void MSMMotorSetRamping(tMUXmotor muxmotor, bool ramping);
00138
00139
00140
00141
00142
00143 void MSMMUXinit(){
00144 for (int i = 0; i < 4; i++) {
00145 memset(mmuxData[i].runToTarget[0], false, 4);
00146 memset(mmuxData[i].brake[0], true, 4);
00147 memset(mmuxData[i].pidcontrol[0], true, 4);
00148 memset(mmuxData[i].target[0], 0, 4*4);
00149 memset(mmuxData[i].ramping[0], MSMMUX_RAMP_NONE, 4);
00150 memset(mmuxData[i].targetUnit[0], MSMMUX_ROT_UNLIMITED, 4);
00151 mmuxData[i].initialised = true;
00152 }
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 bool MSMMUXreadStatus(tMUXmotor muxmotor, ubyte &motorStatus) {
00164
00165 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00166
00167 MSMMUX_I2CRequest[0] = 2;
00168 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00169
00170 switch ((byte)MPORT(muxmotor)) {
00171 case 0: MSMMUX_I2CRequest[2] = MSMMUX_STATUS_MOT1; break;
00172 case 1: MSMMUX_I2CRequest[2] = MSMMUX_STATUS_MOT2; break;
00173 }
00174
00175 if (!writeI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CRequest, 1))
00176 return false;
00177
00178 if (!readI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CReply, 1))
00179 return false;
00180
00181 motorStatus = MSMMUX_I2CReply[0];
00182
00183 return true;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 bool MSMMUXsendCommand(tSensors link, ubyte channel, long setpoint, byte speed, ubyte seconds, ubyte commandA) {
00200 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00201
00202 MSMMUX_I2CRequest[0] = 10;
00203 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00204 MSMMUX_I2CRequest[2] = MSMMUX_MOT_OFFSET + (channel * MSMMUX_ENTRY_SIZE);
00205 MSMMUX_I2CRequest[3] = (setpoint >> 0) & 0xFF;
00206 MSMMUX_I2CRequest[4] = (setpoint >> 8) & 0xFF;
00207 MSMMUX_I2CRequest[5] = (setpoint >> 16) & 0xFF;
00208 MSMMUX_I2CRequest[6] = (setpoint >> 24) & 0xFF;
00209 MSMMUX_I2CRequest[7] = (speed & 0xFF);
00210 MSMMUX_I2CRequest[8] = seconds;
00211 MSMMUX_I2CRequest[9] = 0;
00212 MSMMUX_I2CRequest[10] = commandA;
00213
00214
00215 mmuxData[link].targetUnit[channel] = MSMMUX_ROT_UNLIMITED;
00216
00217
00218 return writeI2C(link, MSMMUX_I2CRequest, 0);
00219
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 bool MSMMUXsendCommand(tSensors link, ubyte command) {
00232 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00233
00234 MSMMUX_I2CRequest[0] = 3;
00235 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00236 MSMMUX_I2CRequest[2] = MSMMUX_REG_CMD;
00237 MSMMUX_I2CRequest[3] = command;
00238
00239 return writeI2C(link, MSMMUX_I2CRequest, 0);
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 bool MSMMUXsetPID(tSensors link, int kpTacho, int kiTacho, int kdTacho, int kpSpeed, int kiSpeed, int kdSpeed, ubyte passCount, ubyte tolerance) {
00265 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00266
00267 MSMMUX_I2CRequest[0] = 16;
00268 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00269 MSMMUX_I2CRequest[2] = MSMMUX_KP_TACHO;
00270 MSMMUX_I2CRequest[3] = kpTacho & 0xFF;
00271 MSMMUX_I2CRequest[4] = (kpTacho >> 8) & 0xFF;
00272 MSMMUX_I2CRequest[5] = kiTacho & 0xFF;
00273 MSMMUX_I2CRequest[6] = (kiTacho >> 8) & 0xFF;
00274 MSMMUX_I2CRequest[7] = kdTacho & 0xFF;
00275 MSMMUX_I2CRequest[8] = (kdTacho >> 8) & 0xFF;
00276 MSMMUX_I2CRequest[9] = kpSpeed & 0xFF;
00277 MSMMUX_I2CRequest[10] = (kpSpeed >> 8) & 0xFF;
00278 MSMMUX_I2CRequest[11] = kiSpeed & 0xFF;
00279 MSMMUX_I2CRequest[12] = (kiSpeed >> 8) & 0xFF;
00280 MSMMUX_I2CRequest[13] = kdSpeed & 0xFF;
00281 MSMMUX_I2CRequest[14] = (kdSpeed >> 8) & 0xFF;
00282 MSMMUX_I2CRequest[15] = passCount;
00283 MSMMUX_I2CRequest[16] = tolerance;
00284
00285 return writeI2C(link, MSMMUX_I2CRequest, 0);
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 bool MSMMotor(tMUXmotor muxmotor, byte power) {
00297 ubyte commandA = 0;
00298 commandA += (mmuxData[SPORT(muxmotor)].pidcontrol[MPORT(muxmotor)]) ? MSMMUX_CMD_SPEED : 0;
00299 commandA += (mmuxData[SPORT(muxmotor)].ramping[MPORT(muxmotor)] != MSMMUX_RAMP_NONE) ? MSMMUX_CMD_RAMP : 0;
00300 commandA += (mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)]) ? MSMMUX_CMD_BRK : 0;
00301 commandA += (mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] == MSMMUX_ROT_DEGREES) ? MSMMUX_CMD_TACHO : 0;
00302 commandA += (mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] == MSMMUX_ROT_SECONDS) ? MSMMUX_CMD_TIME : 0;
00303 commandA += (mmuxData[SPORT(muxmotor)].relTarget[MPORT(muxmotor)]) ? MSMMUX_CMD_RELATIVE : 0;
00304 commandA += MSMMUX_CMD_GO;
00305
00306 switch (mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)]) {
00307 case MSMMUX_ROT_UNLIMITED: return MSMMUXsendCommand((tSensors)SPORT(muxmotor), (ubyte)MPORT(muxmotor), 0, power, 0, commandA);
00308 case MSMMUX_ROT_DEGREES: return MSMMUXsendCommand((tSensors)SPORT(muxmotor), (ubyte)MPORT(muxmotor), mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)], power, 0, commandA);
00309 case MSMMUX_ROT_SECONDS: return MSMMUXsendCommand((tSensors)SPORT(muxmotor), (ubyte)MPORT(muxmotor), 0, power, mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)], commandA);
00310 }
00311 return true;
00312 }
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 bool MSMotorStop(tMUXmotor muxmotor) {
00323 if (MPORT(muxmotor) == 0)
00324 return MSMotorStop(muxmotor, mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)]);
00325 else if (MPORT(muxmotor) == 1)
00326 return MSMotorStop(muxmotor, mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)]);
00327 return true;
00328 }
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338 bool MSMotorStop(tMUXmotor muxmotor, bool brake) {
00339 if (MPORT(muxmotor) == 0)
00340 return MSMMUXsendCommand(MSMMUX, brake ? MSMMUX_CMD_BRAKE_MOT1 : MSMMUX_CMD_FLOAT_MOT1);
00341 else if (MPORT(muxmotor) == 1)
00342 return MSMMUXsendCommand(MSMMUX, brake ? MSMMUX_CMD_BRAKE_MOT2 : MSMMUX_CMD_FLOAT_MOT2);
00343 return true;
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 void MSMMotorSetRotationTarget(tMUXmotor muxmotor, long target) {
00355 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = target * 360;
00356 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = MSMMUX_ROT_DEGREES;
00357 }
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 void MSMMotorSetTimeTarget(tMUXmotor muxmotor, int target) {
00369 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = target;
00370 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = MSMMUX_ROT_SECONDS;
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381 void MSMMotorSetEncoderTarget(tMUXmotor muxmotor, long target) {
00382 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = target;
00383 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = MSMMUX_ROT_DEGREES;
00384 mmuxData[SPORT(muxmotor)].relTarget[MPORT(muxmotor)] = true;
00385 }
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396 void MSMMotorSetEncoderTarget(tMUXmotor muxmotor, long target, bool relative) {
00397 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = target;
00398 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = MSMMUX_ROT_DEGREES;
00399 mmuxData[SPORT(muxmotor)].relTarget[MPORT(muxmotor)] = relative;
00400 }
00401
00402
00403
00404
00405
00406
00407
00408
00409 long MSMMotorEncoder(tMUXmotor muxmotor) {
00410 long result;
00411
00412 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00413
00414 MSMMUX_I2CRequest[0] = 2;
00415 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00416
00417 switch ((byte)MPORT(muxmotor)) {
00418 case 0: MSMMUX_I2CRequest[2] = MSMMUX_TACHO_MOT1; break;
00419 case 1: MSMMUX_I2CRequest[2] = MSMMUX_TACHO_MOT2; break;
00420 }
00421
00422 if (!writeI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CRequest, 4))
00423 return 0;
00424
00425 if (!readI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CReply, 4))
00426 return 0;
00427
00428 result = MSMMUX_I2CReply[0] + (MSMMUX_I2CReply[1]<<8) + (MSMMUX_I2CReply[2]<<16) + (MSMMUX_I2CReply[3]<<24);
00429
00430 return result;
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444 bool MSMMotorEncoderReset(tMUXmotor muxmotor) {
00445 switch((byte)MPORT(muxmotor)) {
00446 case 0: return MSMMUXsendCommand((tSensors)SPORT(muxmotor), MSMMUX_CMD_RESET_MOT1); break;
00447 case 1: return MSMMUXsendCommand((tSensors)SPORT(muxmotor), MSMMUX_CMD_RESET_MOT2); break;
00448 }
00449 return false;
00450 }
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462 bool MSMMotorEncoderResetAll(tSensors link) {
00463 return MSMMUXsendCommand(link, MSMMUX_CMD_RESET_ALL);
00464 }
00465
00466
00467
00468
00469
00470
00471
00472
00473 bool MSMMotorBusy(tMUXmotor muxmotor) {
00474 ubyte status = 0;
00475 ubyte commandA = 0;
00476
00477
00478 memset(MSMMUX_I2CRequest, 0, sizeof(tByteArray));
00479
00480 MSMMUX_I2CRequest[0] = 2;
00481 MSMMUX_I2CRequest[1] = MSMMUX_I2C_ADDR;
00482 MSMMUX_I2CRequest[2] = MSMMUX_MOT_OFFSET + (MPORT(muxmotor) * MSMMUX_ENTRY_SIZE) + MSMMUX_CMD_A;
00483
00484 if (!writeI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CRequest, 1))
00485 return false;
00486
00487 if (!readI2C((tSensors)SPORT(muxmotor), MSMMUX_I2CReply, 1))
00488 return false;
00489
00490 commandA = MSMMUX_I2CReply[0];
00491
00492
00493 if (commandA == 0)
00494 return false;
00495
00496 if (!MSMMUXreadStatus(muxmotor, status))
00497 return false;
00498
00499 if ((commandA & MSMMUX_ROT_UNLIMITED) == MSMMUX_ROT_UNLIMITED)
00500 return ((status & MSMMUX_STAT_POWERED) != 0);
00501 else if ((commandA & MSMMUX_ROT_DEGREES) == MSMMUX_ROT_DEGREES)
00502 return ((status & MSMMUX_STAT_POS_CTRL) != 0);
00503 else if ((commandA & MSMMUX_ROT_SECONDS) == MSMMUX_ROT_SECONDS)
00504 return ((status & MSMMUX_STAT_TIMED) != 0);
00505
00506 return false;
00507 }
00508
00509
00510
00511
00512
00513
00514
00515
00516 bool MSMMotorStalled(tMUXmotor muxmotor) {
00517 ubyte status = 0;
00518 if (!MSMMUXreadStatus(muxmotor, status))
00519 return false;
00520
00521 return ((status & MSMMUX_STAT_STALLED) != 0);
00522 }
00523
00524
00525
00526
00527
00528
00529
00530 void MSMMotorSetBrake(tMUXmotor muxmotor) {
00531 mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)] = true;
00532 }
00533
00534
00535
00536
00537
00538
00539
00540 void MSMMotorSetFloat(tMUXmotor muxmotor) {
00541 mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)] = false;
00542 }
00543
00544
00545
00546
00547
00548
00549
00550
00551 void MSMMotorSetSpeedCtrl(tMUXmotor muxmotor, bool constspeed) {
00552 mmuxData[SPORT(muxmotor)].pidcontrol[MPORT(muxmotor)] = true;
00553 }
00554
00555
00556
00557
00558
00559
00560
00561
00562 void MSMMotorSetRamping(tMUXmotor muxmotor, bool ramping) {
00563 mmuxData[SPORT(muxmotor)].ramping[MPORT(muxmotor)] = (ramping) ? MSMMUX_RAMP_UP_DOWN : MSMMUX_RAMP_NONE;
00564 }
00565
00566 #endif // __MSMMUX_H__
00567
00568
00569
00570
00571
00572