// Arduino clock frequency is 16 MHz
// Refer this https://blog.wokwi.com/learn-servo-motor-using-wokwi-logic-analyzer/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define CLOCK_FREQ 16000000U
#define PRESCALER 256
#define TICKS_PER_SEC (CLOCK_FREQ / PRESCALER)
#define MIN_PULSE_WIDTH 544
#define MAX_PULSE_WIDTH 2400
int servo1Pin = 11;
int servo2Pin = 3;
/// @brief Fixes the value within a range.
// Keeps it at the extreme if the value goes out of the range.
int clip(int val, int min, int max)
{
// Task: implement this
}
/// @brief Maps the input value from the input range to the output range
int map(int val, int in_low, int in_high, int out_low, int out_high)
{
// Task: implement this
// Hint: you can use the clip function here
}
void servo_write_us(int pin, int micro_secs)
{
// Task: implement for pin 11 and 3
}
void servo_write_angle(int pin, int angle)
{
// Task: implement for pin 11 and 3
// Hint: use the map function to convert angles to
}
int main()
{
// TASK: set the PRESCALER for Timer2 to 268
// TASK: set Wave Generation mode to Phase correct PWM
// TASK: Set pin modes for D11 and D3
// Driver code
while (1)
{
// contol using pulse width
servo_write_us(servo1Pin, MIN_PULSE_WIDTH);
servo_write_us(servo2Pin, MAX_PULSE_WIDTH);
_delay_ms(1000);
servo_write_us(servo1Pin, MAX_PULSE_WIDTH);
servo_write_us(servo2Pin, MIN_PULSE_WIDTH);
_delay_ms(1000);
// control using angle
servo_write_angle(servo1Pin,0);
servo_write_angle(servo2Pin,180);
_delay_ms(1000);
servo_write_angle(servo1Pin,90);
servo_write_angle(servo2Pin,90);
_delay_ms(1000);
servo_write_angle(servo1Pin, 180);
servo_write_angle(servo2Pin, 0);
_delay_ms(1000);
// sweep
for (int angle = 180; angle >= 0; angle--)
{
servo_write_angle(servo1Pin,angle);
servo_write_angle(servo2Pin,180-angle);
_delay_ms(10);
}
_delay_ms(500);
for (int angle = 0; angle <= 180; angle++)
{
servo_write_angle(servo1Pin, angle);
servo_write_angle(servo2Pin, 180 - angle);
_delay_ms(10);
}
_delay_ms(500);
};
}