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 Projectgroep 20 Biorobotics

Committer:
Annelotte
Date:
Thu Oct 05 14:10:15 2017 +0000
Revision:
4:fbf4307e8aea
Parent:
3:e1147e50344b
Child:
5:c9cb66b7010d
De motor aansturen met een snellere reactie van de ticker.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Annelotte 0:85965fd37d39 1 #include "mbed.h"
Annelotte 4:fbf4307e8aea 2 #include "HIDScope.h"
Annelotte 4:fbf4307e8aea 3
Annelotte 4:fbf4307e8aea 4 HIDScope scope(2); //Met HIDScope lezen we de waarde uit van de potmeter (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
Annelotte 0:85965fd37d39 9 AnalogIn potMeter2In(A1); //Analoge input van potmeter 2 (zal gebruikt worden voor de snelheids bepaling van de motor)
Annelotte 0:85965fd37d39 10 AnalogIn potMeter1In(A3); //Analoge input van potmeter 1 (zal gebruikt worden voor de bepaling van de draairichting van de motor)
Annelotte 0:85965fd37d39 11 PwmOut motor1MagnitudePin(D6); //Biorobotics Motor 1 PWM controle van de snelheid
Annelotte 0:85965fd37d39 12 DigitalOut motor1DirectionPin(D7); //Biorobotics Motor 1 draairichting controle
Annelotte 0:85965fd37d39 13
Annelotte 4:fbf4307e8aea 14 //Hier start het deel voor HIDScope
Annelotte 4:fbf4307e8aea 15 volatile float x; //Variabelen aanmaken
Annelotte 4:fbf4307e8aea 16 volatile float x_prev=0;
Annelotte 4:fbf4307e8aea 17 volatile float y; //filtered 'output' of ReadAnalogInAndFilter
Annelotte 4:fbf4307e8aea 18
Annelotte 4:fbf4307e8aea 19
Annelotte 4:fbf4307e8aea 20 void ReadAnalogInAndFilter()
Annelotte 4:fbf4307e8aea 21 {
Annelotte 4:fbf4307e8aea 22 x=potMeter2In; //Capture data van potmeter 2 als x waarde
Annelotte 4:fbf4307e8aea 23 scope.set(0,x); //store data in first element of scope memory in de HIDScope
Annelotte 4:fbf4307e8aea 24 y=(x_prev + x)/2.0; //averaging filter
Annelotte 4:fbf4307e8aea 25 scope.set(1,y); //store data in second element of scope memory in de HIDScope
Annelotte 4:fbf4307e8aea 26 x_prev=x; //Prepare for next round
Annelotte 4:fbf4307e8aea 27 scope.send(); //send what's in the scope memory to PC
Annelotte 4:fbf4307e8aea 28 }
Annelotte 4:fbf4307e8aea 29 //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 30
Annelotte 4:fbf4307e8aea 31
Annelotte 0:85965fd37d39 32 float PwmPeriod = 1.0/5000.0; //PWM periode instellen (5000 Hz, want 5000 periodes in 1 seconde)
Annelotte 0:85965fd37d39 33
Annelotte 3:e1147e50344b 34 void SetMotor1(float motorValue)
Annelotte 0:85965fd37d39 35 {
Annelotte 0:85965fd37d39 36 //Hiermee wordt de richting bepaald met behulp van potmeter 1 en wordt de snelheid bepaald aan de hand van de motorValue.
Annelotte 0:85965fd37d39 37 if (potMeter1In >= 0.5)
Annelotte 0:85965fd37d39 38 { //Clockwise rotation
Annelotte 0:85965fd37d39 39 motor1DirectionPin = 0; //de motor draait met de klok mee
Annelotte 0:85965fd37d39 40 }
Annelotte 0:85965fd37d39 41 else
Annelotte 0:85965fd37d39 42 { //Counterclockwise rotation
Annelotte 0:85965fd37d39 43 motor1DirectionPin = 1; //de motor draait tegen de klok in
Annelotte 0:85965fd37d39 44 }
Annelotte 0:85965fd37d39 45 if (fabs(motorValue) > 1)
Annelotte 0:85965fd37d39 46 {
Annelotte 0:85965fd37d39 47 motor1MagnitudePin = 1; //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1)
Annelotte 0:85965fd37d39 48 }
Annelotte 0:85965fd37d39 49 else
Annelotte 0:85965fd37d39 50 {
Annelotte 3:e1147e50344b 51 motor1MagnitudePin = fabs(motorValue); //de absolute snelheid wordt bepaald, de motor staat uit bij een waarde 0
Annelotte 0:85965fd37d39 52 }
Annelotte 0:85965fd37d39 53 }
Annelotte 0:85965fd37d39 54
Annelotte 0:85965fd37d39 55 float GetReferenceVelocity()
Annelotte 0:85965fd37d39 56 {
Annelotte 0:85965fd37d39 57 //Returns reference velocity in rad/s
Annelotte 0:85965fd37d39 58 //Positieve waarden betekend met de klok mee draaien
Annelotte 0:85965fd37d39 59 const float maxVelocity=8.4; //in rad/s
Annelotte 0:85965fd37d39 60 float referenceVelocity = potMeter2In * maxVelocity;
Annelotte 0:85965fd37d39 61 return referenceVelocity;
Annelotte 0:85965fd37d39 62 }
Annelotte 0:85965fd37d39 63
Annelotte 0:85965fd37d39 64 float FeedForwardControl(float referenceVelocity) //Koppelt de referenceVelocity aan de motorValue
Annelotte 0:85965fd37d39 65 {
Annelotte 0:85965fd37d39 66 //eenvoudige lineaire feed-forward control
Annelotte 0:85965fd37d39 67 const float MotorGain = 8.4; //eenheid: (rad/s) / PWM
Annelotte 0:85965fd37d39 68 float motorValue = referenceVelocity / MotorGain; //bepalen van de fractie van de snelheid t.o.v. max snelheid
Annelotte 0:85965fd37d39 69 return motorValue;
Annelotte 0:85965fd37d39 70 }
Annelotte 0:85965fd37d39 71
Annelotte 0:85965fd37d39 72 void MeasureAndControl(void)
Annelotte 0:85965fd37d39 73 {
Annelotte 0:85965fd37d39 74 //Deze functie neemt de potmeter positie waar, leidt hier een referentie snelheid vanaf en controleert de motor
Annelotte 0:85965fd37d39 75 //met een eenvoudige feed-forward controller. Deze functie wordt aangeroepen met behulp van de ticker Treecko
Annelotte 0:85965fd37d39 76 float referenceVelocity = GetReferenceVelocity();
Annelotte 0:85965fd37d39 77 float motorValue = FeedForwardControl(referenceVelocity);
Annelotte 0:85965fd37d39 78 SetMotor1(motorValue);
Annelotte 0:85965fd37d39 79 }
Annelotte 0:85965fd37d39 80
Annelotte 0:85965fd37d39 81 int main ()
Annelotte 0:85965fd37d39 82 {
Annelotte 4:fbf4307e8aea 83 Treecko.attach(MeasureAndControl, 0.1); //Elke 1 seconde zorgt de ticker voor het runnen en uitlezen van de verschillende
Annelotte 4:fbf4307e8aea 84 //functies en analoge signalen. Veranderingen worden elke 1 seconde doorgevoerd.
Annelotte 4:fbf4307e8aea 85 //(Stukje voor HIDScope)
Annelotte 4:fbf4307e8aea 86 AInTicker.attach(&ReadAnalogInAndFilter, 0.01); //Elke 0.01 seconde roept het de ticker aan zodat deze de data
Annelotte 4:fbf4307e8aea 87 //heeft om te tonen. De ReadAnalogInAndFilter waarde verandert mee.
Annelotte 3:e1147e50344b 88 }