00001
00002
00003
00004
00005
00006
00007 #ifndef BHCONTROLLER
00008 #define BHCONTROLLER
00009
00010
00011 #include <math.h>
00012 #include <iostream>
00013
00016
00017
00018
00019
00025 class BHController
00026 {
00027 public:
00031 BHController(const double factor);
00032
00035 virtual ~BHController() ;
00036
00040 void setFactor(const double factor);
00041
00045 double getFactor();
00046
00050 virtual double getOutput(const double error) = 0;
00051
00052 protected:
00053
00056 double Factor;
00057 };
00058
00059
00060
00061
00062 inline BHController::BHController(const double factor)
00063 {
00064 Factor = factor;
00065 }
00066
00067
00068
00069
00070 inline void BHController::setFactor(const double factor)
00071 {
00072 Factor = factor;
00073 }
00074
00075
00076
00077
00078 inline double BHController::getFactor()
00079 {
00080 return Factor;
00081 }
00082
00083
00084
00085
00086 inline BHController::~BHController()
00087 {}
00088
00089
00090
00091
00092
00093
00094
00100 class BHPController : public BHController
00101 {
00102 public:
00106 BHPController(const double factor);
00107
00111 double getOutput(const double error);
00112 };
00113
00114
00115
00116
00117
00118 inline BHPController::BHPController(const double factor)
00119 : BHController(factor)
00120 {
00121 }
00122
00123
00124
00125
00126 inline double BHPController::getOutput(const double error)
00127 {
00128 return Factor * error;
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00144 class BHDController : public BHController
00145 {
00146 public:
00150 BHDController(const double factor);
00151
00155 double getOutput(const double error);
00156
00157 protected:
00158
00161 double LastValue;
00162 };
00163
00164
00165
00166
00167
00168 inline BHDController::BHDController(const double factor)
00169 :BHController(factor)
00170 {
00171 LastValue = 0.0;
00172 }
00173
00174
00175
00176
00177 inline double BHDController::getOutput(const double error)
00178 {
00179 double last = LastValue;
00180
00181 LastValue = error;
00182
00183 return (error - last) * Factor;
00184 }
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00201 class BHIController : public BHController
00202 {
00203 public:
00208 BHIController(const double factor, const unsigned int size = 1);
00209
00212 ~BHIController();
00213
00217 double getOutput(const double error);
00218
00221 void setISize(const unsigned int size);
00222
00226 int getISize();
00227
00231 void reset();
00232
00233 protected:
00234
00235 int IntPointer;
00236
00239 int IntSize;
00240
00243 double *IntArray;
00244
00245 };
00246
00247
00248
00249
00250
00251 inline BHIController::BHIController(const double factor, const unsigned int size)
00252 :BHController(factor)
00253 {
00254 IntPointer = 0;
00255 IntSize = size;
00256 IntArray = new double[size];
00257
00258 memset(IntArray, 0, IntSize*sizeof(double));
00259 }
00260
00261
00262
00263
00264
00265 inline void BHIController::setISize(const unsigned int size)
00266 {
00267 if(IntArray)
00268 delete IntArray;
00269
00270 IntSize = size;
00271 IntArray = new double[size];
00272
00273 IntPointer = 0;
00274 memset(IntArray, 0, IntSize*sizeof(double));
00275 }
00276
00277
00278
00279
00280
00281 inline double BHIController::getOutput(const double error)
00282 {
00283 double result = 0.0;
00284
00285 IntArray[IntPointer++] = error;
00286
00287 IntPointer = (IntPointer > IntSize-1) ? 0 : IntPointer;
00288
00289 for(int i = IntSize-1; i >= 0; i--)
00290 result += IntArray[i];
00291
00292 return result *= Factor;
00293 }
00294
00295
00296
00297
00298
00299 inline int BHIController::getISize()
00300 {
00301 return IntSize;
00302 }
00303
00304
00305
00306
00307
00308 inline void BHIController::reset()
00309 {
00310 IntPointer = 0;
00311 memset(IntArray, 0, IntSize*sizeof(double));
00312 }
00313
00314
00315
00316
00317
00318 inline BHIController::~BHIController()
00319 {
00320 if(IntArray)
00321 delete []IntArray;
00322 }
00323
00324
00325
00326
00327
00328
00329
00335 class BHPDController : public BHPController,
00336 public BHDController
00337 {
00338 public:
00343 BHPDController(const double pfactor, const double dfactor);
00344
00347
00348
00352 double getOutput(const double error);
00353
00357 void setPFactor(const double factor);
00358
00362 void setDFactor(const double factor);
00363
00364
00368 double getPFactor();
00369
00373 double getDFactor();
00374
00375
00378 void showValues();
00379
00380 };
00381
00382
00383
00384
00385
00386 inline BHPDController::BHPDController(const double pfactor,
00387 const double dfactor) :
00388 BHPController(pfactor),
00389 BHDController(dfactor)
00390 {
00391 }
00392
00393
00394
00395
00396
00397 inline double BHPDController::getOutput(const double error)
00398 {
00399 double result = BHPController::getOutput(error);
00400 result += BHDController::getOutput(error);
00401
00402 return result;
00403 }
00404
00405
00406
00407
00408 inline void BHPDController::setPFactor(const double factor)
00409 {
00410 BHPController::setFactor(factor);
00411 }
00412
00413
00414
00415
00416
00417 inline void BHPDController::setDFactor(const double factor)
00418 {
00419 BHDController::setFactor(factor);
00420 }
00421
00422
00423
00424
00425
00426 inline double BHPDController::getPFactor()
00427 {
00428 return BHPController::getFactor();
00429 }
00430
00431
00432
00433
00434 inline double BHPDController::getDFactor()
00435 {
00436 return BHDController::getFactor();
00437 }
00438
00439
00440
00441
00442 inline void BHPDController::showValues()
00443 {
00444 std::cout << "\n\t ** P-Factor: " << getPFactor() << "\n"
00445 << "\t ** D-Factor: " << getDFactor() << "\n" << std::endl;
00446
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00461 class BHPIDController : public BHPController,
00462 public BHDController,
00463 public BHIController
00464 {
00465 public:
00472 BHPIDController(const double pfactor, const double dfactor, const double ifactor, const int size = 1);
00473
00476
00477
00481 double getOutput(const double error);
00482
00486 void setPFactor(const double factor);
00487
00491 void setDFactor(const double factor);
00492
00496 void setIFactor(const double factor);
00497
00501 double getPFactor();
00502
00506 double getDFactor();
00507
00511 double getIFactor();
00512
00515 void showValues();
00516
00517 };
00518
00519
00520
00521
00522
00523 inline BHPIDController::BHPIDController(const double pfactor,
00524 const double dfactor,
00525 const double ifactor, const int isize) :
00526 BHPController(pfactor),
00527 BHDController(dfactor),
00528 BHIController(ifactor, isize)
00529 {
00530 }
00531
00532
00533
00534
00535
00536 inline double BHPIDController::getOutput(const double error)
00537 {
00538 double result = BHPController::getOutput(error);
00539 result += BHDController::getOutput(error);
00540 result += BHIController::getOutput(error);
00541
00542 return result;
00543 }
00544
00545
00546
00547
00548 inline void BHPIDController::setPFactor(const double factor)
00549 {
00550 BHPController::setFactor(factor);
00551 }
00552
00553
00554
00555
00556
00557 inline void BHPIDController::setDFactor(const double factor)
00558 {
00559 BHDController::setFactor(factor);
00560 }
00561
00562
00563
00564
00565 inline void BHPIDController::setIFactor(const double factor)
00566 {
00567 BHIController::setFactor(factor);
00568 }
00569
00570
00571
00572
00573
00574 inline double BHPIDController::getPFactor()
00575 {
00576 return BHPController::getFactor();
00577 }
00578
00579
00580
00581
00582 inline double BHPIDController::getDFactor()
00583 {
00584 return BHDController::getFactor();
00585 }
00586
00587
00588
00589
00590
00591 inline double BHPIDController::getIFactor()
00592 {
00593 return BHIController::getFactor();
00594 }
00595
00596
00597
00598
00599
00600 inline void BHPIDController::showValues()
00601 {
00602 std::cout << "\n\t ** P-Factor: " << getPFactor() << "\n"
00603 << "\t ** D-Factor: " << getDFactor() << "\n"
00604 << "\t ** I-Factor: " << getIFactor() << "\n"
00605 << "\t ** I-Size : " << getISize() << "\n" << std::endl;
00606 }
00607
00608
00609 #endif //BHCONTROLLER