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:
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?

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