Matthieu Rousseau / Motor
Committer:
Matthieu_
Date:
Wed Nov 06 14:22:03 2019 +0000
Revision:
0:863eca4e24ff
First Commit;

Who changed what in which revision?

UserRevisionLine numberNew 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