Script voor het aansturen van de motor met behulp van twee potmeters. Potmeter 1 wordt gebruikt om de draairichting te bepalen en potmeter 2 wordt gebruikt om de snelheid te bepalen. Het script werkt en heeft een snellere reactie op de potmeters dan bij het vorige script.
Dependencies: HIDScope mbed Encoder MODSERIAL
Fork of motor_met_potmeters_en_aanuit by
main.cpp@7:df5ad7a84f86, 2017-10-06 (annotated)
- Committer:
- paulineoonk
- Date:
- Fri Oct 06 10:31:12 2017 +0000
- Revision:
- 7:df5ad7a84f86
- Parent:
- 6:2b4c749c294f
- Child:
- 8:432f6d4669e1
Namen veranderd. Direction cookbook in schrift Miriam;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Annelotte | 0:85965fd37d39 | 1 | #include "mbed.h" |
Annelotte | 4:fbf4307e8aea | 2 | #include "HIDScope.h" |
Annelotte | 4:fbf4307e8aea | 3 | |
Annelotte | 5:c9cb66b7010d | 4 | HIDScope scope(3); //Met HIDScope lezen we de waarde uit van de potmeter en led A en B van de encoder (kan eventueel gebruikt worden) |
Annelotte | 4:fbf4307e8aea | 5 | Ticker AInTicker; //We maken een ticker aan genaamd AIn (wordt gebruikt voor HIDScope) |
Annelotte | 4:fbf4307e8aea | 6 | |
Annelotte | 0:85965fd37d39 | 7 | |
Annelotte | 0:85965fd37d39 | 8 | Ticker Treecko; //We maken een geweldige ticker aan zodat de potmeter en alles telkens opnieuw worden uitgelezen |
paulineoonk | 7:df5ad7a84f86 | 9 | AnalogIn potMeter2(A1); //Analoge input van potmeter 2 (zal gebruikt worden voor de snelheids bepaling van de motor) |
paulineoonk | 7:df5ad7a84f86 | 10 | AnalogIn potMeter1(A3); //Analoge input van potmeter 1 (zal gebruikt worden voor de bepaling van de draairichting van de motor) |
paulineoonk | 7:df5ad7a84f86 | 11 | PwmOut M1E(D6); //Biorobotics Motor 1 PWM controle van de snelheid |
paulineoonk | 7:df5ad7a84f86 | 12 | DigitalOut M1D(D7); //Biorobotics Motor 1 draairichting controle |
paulineoonk | 7:df5ad7a84f86 | 13 | DigitalOut enc1ledB(D12); //Led B van de encoder van motor 1 |
paulineoonk | 7:df5ad7a84f86 | 14 | DigitalOut enc1ledA(D13); //Led A van de encoder van motor 1 |
Annelotte | 0:85965fd37d39 | 15 | |
Annelotte | 4:fbf4307e8aea | 16 | //Hier start het deel voor HIDScope |
Annelotte | 4:fbf4307e8aea | 17 | void ReadAnalogInAndFilter() |
Annelotte | 4:fbf4307e8aea | 18 | { |
paulineoonk | 7:df5ad7a84f86 | 19 | scope.set(0,potMeter2); |
paulineoonk | 7:df5ad7a84f86 | 20 | scope.set(1,enc1ledB); |
paulineoonk | 7:df5ad7a84f86 | 21 | scope.set(2,enc1ledA); |
Annelotte | 4:fbf4307e8aea | 22 | scope.send(); //send what's in the scope memory to PC |
Annelotte | 4:fbf4307e8aea | 23 | } |
Annelotte | 4:fbf4307e8aea | 24 | //Hier eindigt het deel van de HIDScope. Het toont nu de waarde van de potmeter 2 zodat je deze zichtbaar kunt maken op je pc. |
Annelotte | 4:fbf4307e8aea | 25 | |
Annelotte | 4:fbf4307e8aea | 26 | |
Annelotte | 0:85965fd37d39 | 27 | float PwmPeriod = 1.0/5000.0; //PWM periode instellen (5000 Hz, want 5000 periodes in 1 seconde) |
Annelotte | 0:85965fd37d39 | 28 | |
Annelotte | 3:e1147e50344b | 29 | void SetMotor1(float motorValue) |
Annelotte | 0:85965fd37d39 | 30 | { |
Annelotte | 0:85965fd37d39 | 31 | //Hiermee wordt de richting bepaald met behulp van potmeter 1 en wordt de snelheid bepaald aan de hand van de motorValue. |
paulineoonk | 7:df5ad7a84f86 | 32 | if (potMeter1>= 0.5) |
paulineoonk | 7:df5ad7a84f86 | 33 | { //Counterclockwise rotation |
paulineoonk | 7:df5ad7a84f86 | 34 | M1D = 1; //de motor draait tegen de klok in |
Annelotte | 0:85965fd37d39 | 35 | } |
Annelotte | 0:85965fd37d39 | 36 | else |
paulineoonk | 7:df5ad7a84f86 | 37 | { |
paulineoonk | 7:df5ad7a84f86 | 38 | //Clockwise rotation |
paulineoonk | 7:df5ad7a84f86 | 39 | M1D = 0; //de motor draait met de klok mee |
Annelotte | 0:85965fd37d39 | 40 | } |
Annelotte | 0:85965fd37d39 | 41 | if (fabs(motorValue) > 1) |
Annelotte | 0:85965fd37d39 | 42 | { |
paulineoonk | 7:df5ad7a84f86 | 43 | M1E = 1; //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1) |
Annelotte | 0:85965fd37d39 | 44 | } |
Annelotte | 0:85965fd37d39 | 45 | else |
Annelotte | 0:85965fd37d39 | 46 | { |
paulineoonk | 7:df5ad7a84f86 | 47 | M1E = fabs(motorValue); //de absolute snelheid wordt bepaald, de motor staat uit bij een waarde 0 |
Annelotte | 0:85965fd37d39 | 48 | } |
Annelotte | 0:85965fd37d39 | 49 | } |
Annelotte | 0:85965fd37d39 | 50 | |
Annelotte | 0:85965fd37d39 | 51 | float GetReferenceVelocity() |
Annelotte | 0:85965fd37d39 | 52 | { |
Annelotte | 0:85965fd37d39 | 53 | //Returns reference velocity in rad/s |
Annelotte | 0:85965fd37d39 | 54 | //Positieve waarden betekend met de klok mee draaien |
Annelotte | 0:85965fd37d39 | 55 | const float maxVelocity=8.4; //in rad/s |
paulineoonk | 7:df5ad7a84f86 | 56 | float refV = potMeter2 * maxVelocity; |
paulineoonk | 7:df5ad7a84f86 | 57 | return refV; |
Annelotte | 0:85965fd37d39 | 58 | } |
Annelotte | 0:85965fd37d39 | 59 | |
paulineoonk | 7:df5ad7a84f86 | 60 | float FeedForwardControl(float refV) //Koppelt de referenceVelocity aan de motorValue |
Annelotte | 0:85965fd37d39 | 61 | { |
Annelotte | 0:85965fd37d39 | 62 | //eenvoudige lineaire feed-forward control |
Annelotte | 0:85965fd37d39 | 63 | const float MotorGain = 8.4; //eenheid: (rad/s) / PWM |
paulineoonk | 7:df5ad7a84f86 | 64 | float motorValue = refV / MotorGain; //bepalen van de fractie van de snelheid t.o.v. max snelheid |
Annelotte | 0:85965fd37d39 | 65 | return motorValue; |
Annelotte | 0:85965fd37d39 | 66 | } |
Annelotte | 0:85965fd37d39 | 67 | |
Annelotte | 0:85965fd37d39 | 68 | void MeasureAndControl(void) |
Annelotte | 0:85965fd37d39 | 69 | { |
Annelotte | 0:85965fd37d39 | 70 | //Deze functie neemt de potmeter positie waar, leidt hier een referentie snelheid vanaf en controleert de motor |
Annelotte | 0:85965fd37d39 | 71 | //met een eenvoudige feed-forward controller. Deze functie wordt aangeroepen met behulp van de ticker Treecko |
paulineoonk | 7:df5ad7a84f86 | 72 | float refV = GetReferenceVelocity(); |
paulineoonk | 7:df5ad7a84f86 | 73 | float motorValue = FeedForwardControl(refV); |
Annelotte | 0:85965fd37d39 | 74 | SetMotor1(motorValue); |
Annelotte | 0:85965fd37d39 | 75 | } |
Annelotte | 0:85965fd37d39 | 76 | |
Annelotte | 0:85965fd37d39 | 77 | int main () |
Annelotte | 0:85965fd37d39 | 78 | { |
Annelotte | 4:fbf4307e8aea | 79 | Treecko.attach(MeasureAndControl, 0.1); //Elke 1 seconde zorgt de ticker voor het runnen en uitlezen van de verschillende |
Annelotte | 4:fbf4307e8aea | 80 | //functies en analoge signalen. Veranderingen worden elke 1 seconde doorgevoerd. |
Annelotte | 4:fbf4307e8aea | 81 | //(Stukje voor HIDScope) |
Annelotte | 4:fbf4307e8aea | 82 | AInTicker.attach(&ReadAnalogInAndFilter, 0.01); //Elke 0.01 seconde roept het de ticker aan zodat deze de data |
Annelotte | 4:fbf4307e8aea | 83 | //heeft om te tonen. De ReadAnalogInAndFilter waarde verandert mee. |
Annelotte | 3:e1147e50344b | 84 | } |