Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: WheelControl/Wheel.h
- Revision:
- 1:813f4b17ae65
- Child:
- 3:01b5e80d842d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WheelControl/Wheel.h Sun Mar 03 00:54:07 2019 +0000
@@ -0,0 +1,101 @@
+class Wheel
+{
+ private:
+
+ float distance; //distance traversed by wheel
+ float angularVelocity;
+
+ float const static gain = 0.6f; //closed loop gain, (amount to amplify the difference) you have to tune this value
+ //but make sure its less than 1.5 otherwise you'll have a really sensitive motor
+
+ PwmOut Mtr; //connect this pin to the motor driveboard pwm
+ DigitalOut direction; //connected to the direction pin of motor drive board
+ DigitalOut polarity; //connected to the bipolar of motor drive board. 0 = unipolar 1 = bipolar
+
+ Ticker updater;
+
+ Encoder* enc;
+
+ P controller;
+
+ public:
+
+ float maxAngularVel;
+
+ float static const wheelDiameter = 0.18; //used in calculation of Linear velocity i.e never
+
+ Wheel (Encoder* E, PinName M, PinName D, PinName Mode) : Mtr(M), direction(D), polarity(Mode), controller(0.6f)
+ {
+ enc = E;
+ polarity = 0;
+ direction = 0;
+ distance = 0;
+
+ Mtr.period_us(200); //frequency of 1KHz determine this constant value based on switching losses+frequency losses
+ //higher freq -> more switching losses lower freq -> more "capacitive losses" need to find a balance
+ updater.detach();
+
+ controller.setControl(10.0f);
+ controller.setOutputLimits(-1.0f, 1.0f);
+ }
+
+ float calculateAngularVelocity() //returns a float value which is the angular velocity of the WHEEL
+ {
+ float eTR;
+ eTR = enc->encoderTickRate();
+ angularVelocity = (eTR/256.0f)*2.0f*(float)PI;
+ return eTR;
+ }
+
+ void setFrequency(int freq) //if you want to adjust the frequency
+ {
+ Mtr.period(1/freq);
+ }
+
+ float returnAngularVelocity() //as it says
+ {
+ return angularVelocity;
+ }
+
+ //only called once during initialization to calculate max angular velocity
+ //dir = direction, do opposite for each wheel just so your buggy doesn't move FORWARD but rather rotates
+ void init(int dir)
+ {
+ Mtr.write(0); //max speed
+ direction = dir;
+ updater.attach(callback(this, &Wheel::init2),1); //used as a wait preferably put this wait just long enough that the buggy will do a full 360 degree turn so that it hasn't moved
+ }
+
+ void init2(void) //used as a temporarily wait command for the wheel to spin to max
+ {
+ float temp = enc->encoderTickRate();
+ angularVelocity = (temp/256.0f)*2.0f*(float)PI;
+ maxAngularVel = angularVelocity;
+ controller.setInputLimits(-1.0f*angularVelocity,angularVelocity);
+ updater.attach(callback(this, &Wheel::wheelUpdates),0.1); //attached the actual update function from now ON
+ }
+
+ void wheelUpdates(void) //sampling rate the ticker is attached I.E the wheel speed is updated everytiem this function is called
+ {
+ if (angularVelocity >= (controller.returnControl()+1.0f) || angularVelocity <= (controller.returnControl()-1.0f)) //only compute if their is a difference between wanted and current val
+ {
+ float temp = enc->encoderTickRate(); //get the encoder tick rate and store in a value called temp
+ angularVelocity = (temp/256.0f)*2.0f*(float)PI; //use it to calculate the angular velocity of the wheel
+ float temp2 = controller.compute(angularVelocity); //another temporary value to store the computed angular velocity
+ if (temp2 < 0) {direction = 1;} else {direction = 0;} //change direction according to the computed value
+ Mtr.write(temp2); //write the value as a pwm
+ distance += angularVelocity * wheelDiameter;
+ }
+ }
+ void adjustAngularVelocity(float W) // W = angular velocity you want, obviously putting a |w| value that is > max angular velocity will set dutcy cycle to 1
+ {
+ controller.setControl(W);
+ if (W < 0.0f) {direction = 1;} else {direction = 0;} //obvs if you put a negative value -> will get a negative direction i.e 0;
+ };
+
+ float getDistance(void)
+ {
+ return distance; //distance traversed by wheel
+ }
+
+};
\ No newline at end of file