From 1059a7f79187182c6a9dc933197017b49e4e44f0 Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Wed, 6 Dec 2023 15:20:58 +0000 Subject: [PATCH] expand q2, fix formatting --- src/submission.md | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/submission.md b/src/submission.md index 2c798d5..ec98194 100755 --- a/src/submission.md +++ b/src/submission.md @@ -11,8 +11,6 @@ geometry: \maketitle \thispagestyle{empty} \newpage -\tableofcontents -\newpage # Question 1 @@ -27,8 +25,11 @@ maybe not push enough current to motor to actually get it spinning in some cases # Question 2 When derivative control is added at low levels (0.02) it reduces the oscillations. + This is because derivative control only considers the rate of change of of the error -and therefore tries to bring the rate of change to zero. +and tries to bring the rate of change to zero. +This means that adds a *damping* effect to the controller, slowing it down when it's moving, +and thereby reducing/eliminating overshoot and oscillations. # Question 3 @@ -68,18 +69,23 @@ Some initialisation is run in `setup` on lines 89 and 90: Then the main control loop starts. The `loop` function runs the `controlLoop` function every 20 milliseconds (as defined by `controlInterval`) on line 101. + The `controlLoop` function retrieves the current motor position and stores it in the variable that the PID controller has a pointer to. + `myPID.Compute()` is then called to recompute the motor speed required to get to the set point and this is stored in the `percentSpeed` variable as the controller has a pointer to it. This new speed is passed to the `driveMotorPercent` function to update the motor's speed. +\newpage + # Question 5 The mathematically complex operations in `loop()` as it is run infrequently. This is because it is inside an if statement with condition `convertNewNumber()`, which returns `false` if there is no new data to convert (i.e. if there has not been any serial input since the last loop). + Essentially, the complex operations only run once per serial input, meaning it is run very infrequently compared to how many times the loop runs. @@ -104,9 +110,11 @@ of the shaft, as the magnets of the motor will not be aligned as needed. This is also why the steppers use a ramp function, so that the shaft has time accelerate to the desired speed without skipping steps. +\newpage + # Question 8 -```{ .matplotlib caption="A plot of velocity and acceleration for SimplisticRampStepper" dpi=150 } +```{ .matplotlib caption="A plot of velocity and acceleration for SimplisticRampStepper" dpi=300 } import numpy as np import matplotlib.pyplot as plt @@ -122,17 +130,20 @@ data = np.genfromtxt("csv/SimplisticRampStepper_out_50.csv", fig, ax1 = plt.subplots() ax2 = ax1.twinx() -ax1.plot(data[TIME], data[SPEED], label='Speed [steps/s]', color='tab:blue') -ax2.plot(data[TIME], data[ACCEL], label='Acceleration [steps/s^2]', color='tab:red') +lines1 = ax1.plot(data[TIME], data[SPEED], label='Speed [steps/s]', color='tab:blue') +lines2 = ax2.plot(data[TIME], data[ACCEL], label='Acceleration [steps/s^2]', color='tab:red') ax1.set_ylabel('Speed [steps/s]') ax2.set_ylabel('Acceleration [steps/s^2]') +lines = lines1 + lines2 +ax1.legend(lines, [ l.get_label() for l in lines ]) + ax1.set_xlabel("Time [s]") fig.tight_layout() ``` -```{ .matplotlib caption="A plot of velocity and acceleration for LeibRampStepper" dpi=150 } +```{ .matplotlib caption="A plot of velocity and acceleration for LeibRampStepper" dpi=300 } import numpy as np import matplotlib.pyplot as plt @@ -148,11 +159,14 @@ data = np.genfromtxt("csv/LeibRampStepper_out_50.csv", fig, ax1 = plt.subplots() ax2 = ax1.twinx() -ax1.plot(data[TIME], data[SPEED], label='Speed [steps/s]', color='tab:blue') -ax2.plot(data[TIME], data[ACCEL], label='Acceleration [steps/s^2]', color='tab:red') +lines1 = ax1.plot(data[TIME], data[SPEED], label='Speed [steps/s]', color='tab:blue') +lines2 = ax2.plot(data[TIME], data[ACCEL], label='Acceleration [steps/s^2]', color='tab:red') ax1.set_ylabel('Speed [steps/s]') ax2.set_ylabel('Acceleration [steps/s^2]') +lines = lines1 + lines2 +ax1.legend(lines, [ l.get_label() for l in lines ], loc='upper right') + ax1.set_xlabel("Time [s]") fig.tight_layout()