Stefan Krickl / Break

Dependents:   JetflyerMotorController

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Brake.cpp Source File

Brake.cpp

00001 #include "Brake.h"
00002 
00003 Brake::Brake() : _brakeButton(PIN_BUTTON_BRAKE), _pwm(PIN_PWM_BRAKE),
00004                  _dir(PIN_DIR_BRAKE)
00005 {    
00006     _pwm.period_ms(20); //needs to be changed!!!
00007     Timer t1;  
00008     Timer t2;  
00009     t1.start();
00010     percentage_old=0;
00011      int state_brakeButton_old=0;
00012     enable_drive =0;
00013     direction=1; // 1 forward, -1 backward
00014 }
00015 
00016 Brake::~Brake()
00017 {
00018     
00019 }
00020 
00021 void Brake::calibrateServo()
00022 {
00023  
00024     
00025 }
00026 
00027 
00028 void Brake::brake(int percentage, int speed)
00029 {
00030     
00031 
00032     if(percentage != percentage_old)
00033         {
00034             enable_drive =1;
00035             
00036             if(percentage_old < percentage)
00037             {
00038                 direction = 1; // forward   
00039             }
00040             else
00041             {
00042                  direction = -1;  // backward
00043             }
00044             
00045         }
00046       
00047 ////////////
00048 
00049 if( state_brakeButton_old != _dir)
00050 {
00051   calculated_position=0; // recalibrate every time it switch state changes  
00052 }
00053 
00054 ////////////////
00055 
00056     if( enable_drive == 1)
00057     {
00058         if( percentage == 0)
00059         {
00060             drive_homeposition();
00061         }
00062         else
00063         {
00064             
00065             drive_brake(direction, speed);
00066             diff_time = t1.read_ms() - ref_time;
00067                    
00068             
00069             calculated_position = calculated_position + (((((float)speed)/100.0f)*MAX_SPEED_BRAKE* (((float)diff_time)/1000.0)*direction))/(MAX_ROTATIONS_FOR_BRAKEING);
00070             
00071             //maximum speed 5 rpm
00072             
00073             if( abs(calculated_position - percentage) < HYSTERESIS)
00074             {
00075                 enable_drive =0;
00076             }
00077         }
00078 
00079     }
00080     
00081   
00082 if(diff_time > 600000) // After 10 Minutes Timer is Reset, avoid overflow
00083 {
00084   t1.reset();  
00085 }    
00086 
00087 state_brakeButton_old = _dir;
00088 ref_time = t1.read_ms();
00089 }
00090 
00091 int Brake::drive_homeposition()
00092 {
00093     if( _brakeButton ) // check if 1 or 0 is engaged
00094     {
00095         drive_brake(-1, 100.0);
00096     }
00097     else
00098     {
00099          drive_brake(1, 0); // home position reached
00100     }
00101     
00102     
00103 }
00104 int Brake::drive_brake(int direction, int _speed)
00105 {
00106     _pwm.write(( float(abs(_speed)))/100.0f);
00107    
00108    if(direction==1)
00109    {
00110     _dir = 1; // engage brakes
00111    }
00112    else
00113    {
00114       _dir = 0; // release brakes
00115    }
00116 }
00117 
00118 bool Brake::getBrakeing()
00119 {
00120     return _brakeing;
00121 }