Your ultimate goal for this week’s lab is to use SysTick system timer to create a periodic
interrupt which will then be used to implement two separate PWM signals (variable duty
cycle digital outputs) to control the left/right and up/down position of a small robotic arm.
By varying the duty cycle between limits, the robotic arm’s left/right and up/down angles
will be changed.
Here are the requirements for this solution (given a breadboard, single variable resistor,
wires, and 2 axis microservo robotic arm):
1. Implement a “manual” mode which you will be able to change the position of the
left/right servo and the up/down servo one at a time.
2. There must be a method to adjust the PWM (duty cycle) of each servo axis (one at a
time) using a single analog input from the user in real-time.
3. You must also implement an “automatic” mode which will automatically change the
servo position for both the left/right and up/down servo from one extreme position (-
90 degrees from neutral to 90 degrees from neutral) continuously until manual mode
4. You must have a display indicator that gives an alphabetic label for the servo axis you
are currently adjusting (or last adjusted), i.e. l/r, u/d, or bth for left/right, up/down or
both. This must work in both manual and automatic modes.
5. You must have a way to latch each servo’s position (in degrees) from neutral and
continuously display it after it is set. This must work in both manual and automatic.
6. There should be no way to make your PWM’ed servos, display of the duty cycle, or
software malfunction just by switching the switches, or adjusting the variable resistor
at any time.
7. There must be at least 50 levels of PWM resolution from -90 degrees from neutral to
90 degrees from neutral. The servos don’t have to move exactly 180 total degrees
(they don’t) but they do have to move as far as they can judging by an oscilloscope
measuring the duty cycles of digital outputs going to the servos at -90 and +90
8. NOTE: You may only write in C and use no assembly files except for functions
SetSysClock(), gpio_c_init(), gpio_d_init(), seg7_init(), seg7_put(), adc_start(),
adc_done, and adc_init. I suggest using your last week’s lab main.c (and
makefile) and build on it from there.