Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Motor.cpp@0:863eca4e24ff, 2019-11-06 (annotated)
- Committer:
- Matthieu_
- Date:
- Wed Nov 06 14:22:03 2019 +0000
- Revision:
- 0:863eca4e24ff
First Commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Matthieu_ | 0:863eca4e24ff | 1 | #include "Motor.h" |
Matthieu_ | 0:863eca4e24ff | 2 | #include "mbed.h" |
Matthieu_ | 0:863eca4e24ff | 3 | |
Matthieu_ | 0:863eca4e24ff | 4 | |
Matthieu_ | 0:863eca4e24ff | 5 | |
Matthieu_ | 0:863eca4e24ff | 6 | L298HBridge::L298HBridge(PinName ENpin, PinName FWDpin, PinName REVpin, PinName chanApin, PinName chanBpin) : _en(ENpin), _fwd(FWDpin), _rev(REVpin), _chanA(chanApin), _chanB(chanBpin) |
Matthieu_ | 0:863eca4e24ff | 7 | { |
Matthieu_ | 0:863eca4e24ff | 8 | _fwd = 0; |
Matthieu_ | 0:863eca4e24ff | 9 | _rev = 0; |
Matthieu_ | 0:863eca4e24ff | 10 | _en = 0.0; |
Matthieu_ | 0:863eca4e24ff | 11 | |
Matthieu_ | 0:863eca4e24ff | 12 | _Time.start(); //start timer |
Matthieu_ | 0:863eca4e24ff | 13 | _currentSpeed = 0.0; //the motor is stopped |
Matthieu_ | 0:863eca4e24ff | 14 | _lastAUp = 0.0; |
Matthieu_ | 0:863eca4e24ff | 15 | |
Matthieu_ | 0:863eca4e24ff | 16 | _rpm_index = rpm.size(); |
Matthieu_ | 0:863eca4e24ff | 17 | rpm.push_back(0); |
Matthieu_ | 0:863eca4e24ff | 18 | |
Matthieu_ | 0:863eca4e24ff | 19 | |
Matthieu_ | 0:863eca4e24ff | 20 | _chanA.rise(callback(this, &L298HBridge::rising)); //attach the function |
Matthieu_ | 0:863eca4e24ff | 21 | |
Matthieu_ | 0:863eca4e24ff | 22 | |
Matthieu_ | 0:863eca4e24ff | 23 | |
Matthieu_ | 0:863eca4e24ff | 24 | _gainProp = 1; |
Matthieu_ | 0:863eca4e24ff | 25 | _gainInt = 0.1; |
Matthieu_ | 0:863eca4e24ff | 26 | |
Matthieu_ | 0:863eca4e24ff | 27 | _maxSpeed = 290.0; //RPM |
Matthieu_ | 0:863eca4e24ff | 28 | _lastOut = 0; |
Matthieu_ | 0:863eca4e24ff | 29 | |
Matthieu_ | 0:863eca4e24ff | 30 | |
Matthieu_ | 0:863eca4e24ff | 31 | } |
Matthieu_ | 0:863eca4e24ff | 32 | |
Matthieu_ | 0:863eca4e24ff | 33 | void L298HBridge::Fwd() |
Matthieu_ | 0:863eca4e24ff | 34 | { |
Matthieu_ | 0:863eca4e24ff | 35 | _fwd = 1; |
Matthieu_ | 0:863eca4e24ff | 36 | _rev = 0; |
Matthieu_ | 0:863eca4e24ff | 37 | } |
Matthieu_ | 0:863eca4e24ff | 38 | |
Matthieu_ | 0:863eca4e24ff | 39 | void L298HBridge::Rev() |
Matthieu_ | 0:863eca4e24ff | 40 | { |
Matthieu_ | 0:863eca4e24ff | 41 | _fwd = 0; |
Matthieu_ | 0:863eca4e24ff | 42 | _rev = 1; |
Matthieu_ | 0:863eca4e24ff | 43 | } |
Matthieu_ | 0:863eca4e24ff | 44 | |
Matthieu_ | 0:863eca4e24ff | 45 | void L298HBridge::Stop() |
Matthieu_ | 0:863eca4e24ff | 46 | { |
Matthieu_ | 0:863eca4e24ff | 47 | _fwd = 1; |
Matthieu_ | 0:863eca4e24ff | 48 | _rev = 1; |
Matthieu_ | 0:863eca4e24ff | 49 | |
Matthieu_ | 0:863eca4e24ff | 50 | |
Matthieu_ | 0:863eca4e24ff | 51 | } |
Matthieu_ | 0:863eca4e24ff | 52 | |
Matthieu_ | 0:863eca4e24ff | 53 | |
Matthieu_ | 0:863eca4e24ff | 54 | |
Matthieu_ | 0:863eca4e24ff | 55 | void L298HBridge::SetSpeed(float PWMPercentage) |
Matthieu_ | 0:863eca4e24ff | 56 | { |
Matthieu_ | 0:863eca4e24ff | 57 | printf("%d", count_ini); |
Matthieu_ | 0:863eca4e24ff | 58 | if(PWMPercentage>0){ |
Matthieu_ | 0:863eca4e24ff | 59 | Fwd(); |
Matthieu_ | 0:863eca4e24ff | 60 | _en = PWMPercentage; |
Matthieu_ | 0:863eca4e24ff | 61 | } |
Matthieu_ | 0:863eca4e24ff | 62 | else if(PWMPercentage<0){ |
Matthieu_ | 0:863eca4e24ff | 63 | Rev(); |
Matthieu_ | 0:863eca4e24ff | 64 | _en = -PWMPercentage; |
Matthieu_ | 0:863eca4e24ff | 65 | } |
Matthieu_ | 0:863eca4e24ff | 66 | else{ |
Matthieu_ | 0:863eca4e24ff | 67 | Stop(); |
Matthieu_ | 0:863eca4e24ff | 68 | } |
Matthieu_ | 0:863eca4e24ff | 69 | } |
Matthieu_ | 0:863eca4e24ff | 70 | |
Matthieu_ | 0:863eca4e24ff | 71 | void L298HBridge::rising(){ |
Matthieu_ | 0:863eca4e24ff | 72 | float tempTime= _Time.read(); |
Matthieu_ | 0:863eca4e24ff | 73 | if(_chanB){ |
Matthieu_ | 0:863eca4e24ff | 74 | _currentSpeed = 60.0f/(11.0f*(tempTime - _lastAUp))/45.0f; |
Matthieu_ | 0:863eca4e24ff | 75 | } |
Matthieu_ | 0:863eca4e24ff | 76 | else{ |
Matthieu_ | 0:863eca4e24ff | 77 | this->_currentSpeed = -60.0f/(11.0f*(tempTime - _lastAUp))/45.0f; |
Matthieu_ | 0:863eca4e24ff | 78 | |
Matthieu_ | 0:863eca4e24ff | 79 | } |
Matthieu_ | 0:863eca4e24ff | 80 | rpm[_rpm_index] = _currentSpeed; |
Matthieu_ | 0:863eca4e24ff | 81 | //test = _currentSpeed; |
Matthieu_ | 0:863eca4e24ff | 82 | |
Matthieu_ | 0:863eca4e24ff | 83 | |
Matthieu_ | 0:863eca4e24ff | 84 | /* |
Matthieu_ | 0:863eca4e24ff | 85 | if (fabs(_currentSpeed) < 35.0f){ |
Matthieu_ | 0:863eca4e24ff | 86 | _currentSpeed = 0.0; |
Matthieu_ | 0:863eca4e24ff | 87 | }*/ |
Matthieu_ | 0:863eca4e24ff | 88 | //printf("C %d\n\r", _rpm_index); |
Matthieu_ | 0:863eca4e24ff | 89 | _lastAUp = tempTime; |
Matthieu_ | 0:863eca4e24ff | 90 | |
Matthieu_ | 0:863eca4e24ff | 91 | //printf("update\r\n"); |
Matthieu_ | 0:863eca4e24ff | 92 | } |
Matthieu_ | 0:863eca4e24ff | 93 | |
Matthieu_ | 0:863eca4e24ff | 94 | float L298HBridge::GetSpeed(int index){ |
Matthieu_ | 0:863eca4e24ff | 95 | return rpm[rpm.size() - index]; |
Matthieu_ | 0:863eca4e24ff | 96 | |
Matthieu_ | 0:863eca4e24ff | 97 | } |
Matthieu_ | 0:863eca4e24ff | 98 | /* |
Matthieu_ | 0:863eca4e24ff | 99 | void L298HBridge::SetAsser(float GainProp, float GainInt){ |
Matthieu_ | 0:863eca4e24ff | 100 | _gainProp = GainProp; |
Matthieu_ | 0:863eca4e24ff | 101 | _gainInt = GainInt; |
Matthieu_ | 0:863eca4e24ff | 102 | } |
Matthieu_ | 0:863eca4e24ff | 103 | |
Matthieu_ | 0:863eca4e24ff | 104 | void L298HBridge::SetSpeedA(float SpeedRPM){ |
Matthieu_ | 0:863eca4e24ff | 105 | float error = SpeedRPM - _currentSpeed; |
Matthieu_ | 0:863eca4e24ff | 106 | float commande = error * _gainProp ; |
Matthieu_ | 0:863eca4e24ff | 107 | if (commande >0 ){ |
Matthieu_ | 0:863eca4e24ff | 108 | this->Fwd(); |
Matthieu_ | 0:863eca4e24ff | 109 | this->SetSpeed(12/fabs(commande)); |
Matthieu_ | 0:863eca4e24ff | 110 | } |
Matthieu_ | 0:863eca4e24ff | 111 | else{ |
Matthieu_ | 0:863eca4e24ff | 112 | this->Rev(); |
Matthieu_ | 0:863eca4e24ff | 113 | this->SetSpeed(12/fabs(commande)); |
Matthieu_ | 0:863eca4e24ff | 114 | } |
Matthieu_ | 0:863eca4e24ff | 115 | _lastOut = commande; |
Matthieu_ | 0:863eca4e24ff | 116 | } |
Matthieu_ | 0:863eca4e24ff | 117 | */ |
Matthieu_ | 0:863eca4e24ff | 118 | float L298HBridge::GetU(){ |
Matthieu_ | 0:863eca4e24ff | 119 | return _en; |
Matthieu_ | 0:863eca4e24ff | 120 | } |
Matthieu_ | 0:863eca4e24ff | 121 | |
Matthieu_ | 0:863eca4e24ff | 122 | string L298HBridge::state(){ |
Matthieu_ | 0:863eca4e24ff | 123 | if(_fwd and not(_rev)){ |
Matthieu_ | 0:863eca4e24ff | 124 | return "fwd"; |
Matthieu_ | 0:863eca4e24ff | 125 | } |
Matthieu_ | 0:863eca4e24ff | 126 | else if (_rev and not(_fwd)){ |
Matthieu_ | 0:863eca4e24ff | 127 | return "rev"; |
Matthieu_ | 0:863eca4e24ff | 128 | } |
Matthieu_ | 0:863eca4e24ff | 129 | else if (_rev == _fwd){ |
Matthieu_ | 0:863eca4e24ff | 130 | return "stop"; |
Matthieu_ | 0:863eca4e24ff | 131 | |
Matthieu_ | 0:863eca4e24ff | 132 | } |
Matthieu_ | 0:863eca4e24ff | 133 | else { |
Matthieu_ | 0:863eca4e24ff | 134 | return "error"; |
Matthieu_ | 0:863eca4e24ff | 135 | } |
Matthieu_ | 0:863eca4e24ff | 136 | } |
Matthieu_ | 0:863eca4e24ff | 137 | |
Matthieu_ | 0:863eca4e24ff | 138 |