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!!!!

Dependencies:   mbed

Committer:
Annelotte
Date:
Wed Oct 04 10:07:29 2017 +0000
Revision:
3:e1147e50344b
Parent:
2:b541085b55e9
Script motor met twee potmeters. Potmeter 1 voor de draairichting en potmeter 2 voor de snelheid. Wanneer potmeter 2 wordt gezet op 0, staat de motor uit.
;

Who changed what in which revision?

UserRevisionLine numberNew 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 potMeter1In(A3); //Analoge input van potmeter 1 (zal gebruikt worden voor de bepaling van de draairichting van de motor)
Annelotte 0:85965fd37d39 6 PwmOut motor1MagnitudePin(D6); //Biorobotics Motor 1 PWM controle van de snelheid
Annelotte 0:85965fd37d39 7 DigitalOut motor1DirectionPin(D7); //Biorobotics Motor 1 draairichting controle
Annelotte 0:85965fd37d39 8
Annelotte 0:85965fd37d39 9 float PwmPeriod = 1.0/5000.0; //PWM periode instellen (5000 Hz, want 5000 periodes in 1 seconde)
Annelotte 0:85965fd37d39 10
Annelotte 3:e1147e50344b 11 void SetMotor1(float motorValue)
Annelotte 0:85965fd37d39 12 {
Annelotte 0:85965fd37d39 13 //Hiermee wordt de richting bepaald met behulp van potmeter 1 en wordt de snelheid bepaald aan de hand van de motorValue.
Annelotte 0:85965fd37d39 14 if (potMeter1In >= 0.5)
Annelotte 0:85965fd37d39 15 { //Clockwise rotation
Annelotte 0:85965fd37d39 16 motor1DirectionPin = 0; //de motor draait met de klok mee
Annelotte 0:85965fd37d39 17 }
Annelotte 0:85965fd37d39 18 else
Annelotte 0:85965fd37d39 19 { //Counterclockwise rotation
Annelotte 0:85965fd37d39 20 motor1DirectionPin = 1; //de motor draait tegen de klok in
Annelotte 0:85965fd37d39 21 }
Annelotte 0:85965fd37d39 22 if (fabs(motorValue) > 1)
Annelotte 0:85965fd37d39 23 {
Annelotte 0:85965fd37d39 24 motor1MagnitudePin = 1; //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1)
Annelotte 0:85965fd37d39 25 }
Annelotte 0:85965fd37d39 26 else
Annelotte 0:85965fd37d39 27 {
Annelotte 3:e1147e50344b 28 motor1MagnitudePin = fabs(motorValue); //de absolute snelheid wordt bepaald, de motor staat uit bij een waarde 0
Annelotte 0:85965fd37d39 29 }
Annelotte 0:85965fd37d39 30 }
Annelotte 0:85965fd37d39 31
Annelotte 0:85965fd37d39 32 float GetReferenceVelocity()
Annelotte 0:85965fd37d39 33 {
Annelotte 0:85965fd37d39 34 //Returns reference velocity in rad/s
Annelotte 0:85965fd37d39 35 //Positieve waarden betekend met de klok mee draaien
Annelotte 0:85965fd37d39 36 const float maxVelocity=8.4; //in rad/s
Annelotte 0:85965fd37d39 37 float referenceVelocity = potMeter2In * maxVelocity;
Annelotte 0:85965fd37d39 38 return referenceVelocity;
Annelotte 0:85965fd37d39 39 }
Annelotte 0:85965fd37d39 40
Annelotte 0:85965fd37d39 41 float FeedForwardControl(float referenceVelocity) //Koppelt de referenceVelocity aan de motorValue
Annelotte 0:85965fd37d39 42 {
Annelotte 0:85965fd37d39 43 //eenvoudige lineaire feed-forward control
Annelotte 0:85965fd37d39 44 const float MotorGain = 8.4; //eenheid: (rad/s) / PWM
Annelotte 0:85965fd37d39 45 float motorValue = referenceVelocity / MotorGain; //bepalen van de fractie van de snelheid t.o.v. max snelheid
Annelotte 0:85965fd37d39 46 return motorValue;
Annelotte 0:85965fd37d39 47 }
Annelotte 0:85965fd37d39 48
Annelotte 0:85965fd37d39 49 void MeasureAndControl(void)
Annelotte 0:85965fd37d39 50 {
Annelotte 0:85965fd37d39 51 //Deze functie neemt de potmeter positie waar, leidt hier een referentie snelheid vanaf en controleert de motor
Annelotte 0:85965fd37d39 52 //met een eenvoudige feed-forward controller. Deze functie wordt aangeroepen met behulp van de ticker Treecko
Annelotte 0:85965fd37d39 53 float referenceVelocity = GetReferenceVelocity();
Annelotte 0:85965fd37d39 54 float motorValue = FeedForwardControl(referenceVelocity);
Annelotte 0:85965fd37d39 55 SetMotor1(motorValue);
Annelotte 0:85965fd37d39 56 }
Annelotte 0:85965fd37d39 57
Annelotte 0:85965fd37d39 58 int main ()
Annelotte 0:85965fd37d39 59 {
Annelotte 3:e1147e50344b 60 Treecko.attach(MeasureAndControl, 1); //Elke 1 seconde zorgt de ticker voor het runnen en uitlezen van de verschillende
Annelotte 0:85965fd37d39 61 //functies en analoge signalen. Veranderingen worden elke 1 seconde doorgevoerd.
Annelotte 3:e1147e50344b 62 }