Большое Спасибо.
Здесь правится частота RC генератора, чтобы удержаться в значениях сервы (544-2400)
// ATMEL ATtiny 25/45/85
// +-\/-+
// !RESET PCINT5 5/A0 (D 5) PB5 1| |8 Vcc
// XTAL1 CLKI !OC1B PCINT3 3/A3 (D 3) PB3 2| |7 PB2 (D 2) 2/A1 PCINT2 USCK SCK T0 INT0 SCL
// XTAL2 CLKO OC1B PCINT4 4/A2 {D 4) PB4 3| |6 PB1 (D 1) pwm1 PCINT1 MISO DO OC0B AIN1
// GND 4| |5 PB0 (D 0) pwm0 PCINT0 MOSI DI OC0A AIN0 SDA AREF
// +----+
#define SERVO_PIN 3
#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1000 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds
volatile uint16_t angle = 90;
volatile uint16_t s_tau = 2250;
volatile uint32_t old_millis;
volatile uint32_t old_ms;
bool sweep = false;
// функция преобразования в константу задержки (получает значение в градусах угла поворота сервы)
uint16_t set_pulse(uint16_t pulse) {
return map(pulse, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
}
// функция формирования импульса
void pulseOut(uint8_t pin) {
digitalWrite(pin, HIGH);
for (int i = 1; i <= s_tau; i++) delayMicroseconds(1);
digitalWrite(pin, LOW);
}
void setup() {
OSCCAL+=61; // OSCCALL для 8Mhz
pinMode(3, OUTPUT);
pulseOut(SERVO_PIN);
delay(20);
old_millis = millis();
old_ms = old_millis;
}
void loop() {
static uint16_t angle = 0;
if (millis() - old_millis >= 20) {
pulseOut(SERVO_PIN);
old_millis = millis();
}
if (millis() - old_ms >= 50 && !sweep) {
angle++;
if (angle > 180) sweep = true;
s_tau = set_pulse(angle);
old_ms = millis();
}
if (millis() - old_ms >= 50 && sweep) {
angle--;
if (angle == 0) sweep = false;
s_tau = set_pulse(angle);
old_ms = millis();
}
}