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@0:85965fd37d39, 2017-10-03 (annotated)
- Committer:
- Annelotte
- Date:
- Tue Oct 03 19:38:35 2017 +0000
- Revision:
- 0:85965fd37d39
- Child:
- 1:3f88aa5bf2ff
Script om de motor te laten draaien met behulp van twee potmeters (potmeter 2 voor de snelheid en potmeter 1 voor de draairichting) en twee buttons (button 2 voor het inschakelen en button 1 voor het uitschakelen van de motor).
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Annelotte | 0:85965fd37d39 | 1 | #include "mbed.h" |
Annelotte | 0:85965fd37d39 | 2 | |
Annelotte | 0:85965fd37d39 | 3 | Ticker Treecko; //We maken een geweldige ticker aan zodat de potmeter en alles telkens opnieuw worden uitgelezen |
Annelotte | 0:85965fd37d39 | 4 | AnalogIn potMeter2In(A1); //Analoge input van potmeter 2 (zal gebruikt worden voor de snelheids bepaling van de motor) |
Annelotte | 0:85965fd37d39 | 5 | AnalogIn button2(A2); //Analoge input van button 2 (zal gebruikt worden voor het inschakelen van de motor) |
Annelotte | 0:85965fd37d39 | 6 | AnalogIn button1(A4); //Analago input van button 1 (zal gebruikt worden voor het uitschakelen van de motor) |
Annelotte | 0:85965fd37d39 | 7 | AnalogIn potMeter1In(A3); //Analoge input van potmeter 1 (zal gebruikt worden voor de bepaling van de draairichting van de motor) |
Annelotte | 0:85965fd37d39 | 8 | PwmOut motor1MagnitudePin(D6); //Biorobotics Motor 1 PWM controle van de snelheid |
Annelotte | 0:85965fd37d39 | 9 | DigitalOut motor1DirectionPin(D7); //Biorobotics Motor 1 draairichting controle |
Annelotte | 0:85965fd37d39 | 10 | |
Annelotte | 0:85965fd37d39 | 11 | float PwmPeriod = 1.0/5000.0; //PWM periode instellen (5000 Hz, want 5000 periodes in 1 seconde) |
Annelotte | 0:85965fd37d39 | 12 | |
Annelotte | 0:85965fd37d39 | 13 | float SetMotor1(float motorValue) |
Annelotte | 0:85965fd37d39 | 14 | { |
Annelotte | 0:85965fd37d39 | 15 | //Hiermee wordt de richting bepaald met behulp van potmeter 1 en wordt de snelheid bepaald aan de hand van de motorValue. |
Annelotte | 0:85965fd37d39 | 16 | if (potMeter1In >= 0.5) |
Annelotte | 0:85965fd37d39 | 17 | { //Clockwise rotation |
Annelotte | 0:85965fd37d39 | 18 | motor1DirectionPin = 0; //de motor draait met de klok mee |
Annelotte | 0:85965fd37d39 | 19 | } |
Annelotte | 0:85965fd37d39 | 20 | else |
Annelotte | 0:85965fd37d39 | 21 | { //Counterclockwise rotation |
Annelotte | 0:85965fd37d39 | 22 | motor1DirectionPin = 1; //de motor draait tegen de klok in |
Annelotte | 0:85965fd37d39 | 23 | } |
Annelotte | 0:85965fd37d39 | 24 | if (fabs(motorValue) > 1) |
Annelotte | 0:85965fd37d39 | 25 | { |
Annelotte | 0:85965fd37d39 | 26 | motor1MagnitudePin = 1; //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1) |
Annelotte | 0:85965fd37d39 | 27 | } |
Annelotte | 0:85965fd37d39 | 28 | else |
Annelotte | 0:85965fd37d39 | 29 | { |
Annelotte | 0:85965fd37d39 | 30 | motor1MagnitudePin = fabs(motorValue); //de absolute snelheid wordt bepaald |
Annelotte | 0:85965fd37d39 | 31 | } |
Annelotte | 0:85965fd37d39 | 32 | } |
Annelotte | 0:85965fd37d39 | 33 | |
Annelotte | 0:85965fd37d39 | 34 | float GetReferenceVelocity() |
Annelotte | 0:85965fd37d39 | 35 | { |
Annelotte | 0:85965fd37d39 | 36 | //Returns reference velocity in rad/s |
Annelotte | 0:85965fd37d39 | 37 | //Positieve waarden betekend met de klok mee draaien |
Annelotte | 0:85965fd37d39 | 38 | const float maxVelocity=8.4; //in rad/s |
Annelotte | 0:85965fd37d39 | 39 | float referenceVelocity = potMeter2In * maxVelocity; |
Annelotte | 0:85965fd37d39 | 40 | return referenceVelocity; |
Annelotte | 0:85965fd37d39 | 41 | } |
Annelotte | 0:85965fd37d39 | 42 | |
Annelotte | 0:85965fd37d39 | 43 | float FeedForwardControl(float referenceVelocity) //Koppelt de referenceVelocity aan de motorValue |
Annelotte | 0:85965fd37d39 | 44 | { |
Annelotte | 0:85965fd37d39 | 45 | //eenvoudige lineaire feed-forward control |
Annelotte | 0:85965fd37d39 | 46 | const float MotorGain = 8.4; //eenheid: (rad/s) / PWM |
Annelotte | 0:85965fd37d39 | 47 | float motorValue = referenceVelocity / MotorGain; //bepalen van de fractie van de snelheid t.o.v. max snelheid |
Annelotte | 0:85965fd37d39 | 48 | return motorValue; |
Annelotte | 0:85965fd37d39 | 49 | } |
Annelotte | 0:85965fd37d39 | 50 | |
Annelotte | 0:85965fd37d39 | 51 | void MeasureAndControl(void) |
Annelotte | 0:85965fd37d39 | 52 | { |
Annelotte | 0:85965fd37d39 | 53 | //Deze functie neemt de potmeter positie waar, leidt hier een referentie snelheid vanaf en controleert de motor |
Annelotte | 0:85965fd37d39 | 54 | //met een eenvoudige feed-forward controller. Deze functie wordt aangeroepen met behulp van de ticker Treecko |
Annelotte | 0:85965fd37d39 | 55 | float referenceVelocity = GetReferenceVelocity(); |
Annelotte | 0:85965fd37d39 | 56 | float motorValue = FeedForwardControl(referenceVelocity); |
Annelotte | 0:85965fd37d39 | 57 | SetMotor1(motorValue); |
Annelotte | 0:85965fd37d39 | 58 | } |
Annelotte | 0:85965fd37d39 | 59 | |
Annelotte | 0:85965fd37d39 | 60 | int main () |
Annelotte | 0:85965fd37d39 | 61 | { |
Annelotte | 0:85965fd37d39 | 62 | if (button2) |
Annelotte | 0:85965fd37d39 | 63 | { |
Annelotte | 0:85965fd37d39 | 64 | Treecko.attach(MeasureAndControl, 1); //Elke 1 seconde zorgt de ticker voor het runnen en uitlezen van de verschillende |
Annelotte | 0:85965fd37d39 | 65 | //functies en analoge signalen. Veranderingen worden elke 1 seconde doorgevoerd. |
Annelotte | 0:85965fd37d39 | 66 | } |
Annelotte | 0:85965fd37d39 | 67 | else if (button1) |
Annelotte | 0:85965fd37d39 | 68 | { |
Annelotte | 0:85965fd37d39 | 69 | Treecko.dettach; //De ticker wordt uitgeschakeld, de motor stopt met draaien. |
Annelotte | 0:85965fd37d39 | 70 | } |
Annelotte | 0:85965fd37d39 | 71 | else |
Annelotte | 0:85965fd37d39 | 72 | { |
Annelotte | 0:85965fd37d39 | 73 | } |
Annelotte | 0:85965fd37d39 | 74 | } |