Однако Microcore не принимает переменные в «delayMicroseconds (300+p*(2500/180));» утверждение. Поэтому при использовании Micocore в этом операторе необходимо указать постоянное значение, которое дает приемлемую скорость.
Да, говорить о точности micros() не приходится, то-есть коэффициент придётся подбирать индивидуально, на моём экземпляре микрос идёт в 1.5 раза быстрее
я жеж выше сказал, что микросы укорочены в полтора раза, проверил на частотах 16.5 и 16 мегагерц хоть от PLL хоть от RC генератора, подгоняйте, при передаче значения 1500 микросекунд фактически имеем 1000 при передаче значения 3000 микросекунд фактически имеем 2000
Смотрим хидер библиотеки servo.h
#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 1500 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds
По умолчанию, при инициализации библиотека устанавливает серву в положение 90 градусов, значит нам надо выставлять импульс длиной 1500 микросекунд или 2250 циклов в процедуре задержки
И код:
// 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 1500 // 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;
void setup() {
pinMode(3, OUTPUT);
pulseOut(SERVO_PIN);
delay(20);
old_millis = millis();
}
// функция преобразования в константу задержки (получает значение в градусах угла поворота сервы)
uint16_t set_pulse(uint16_t pulse) {
return map(pulse, 0, 180, 816, 3600);
}
// функция формирования импульса
void pulseOut(uint8_t pin) {
digitalWrite(pin, HIGH);
for (int i = 1; i <= s_tau; i++) delayMicroseconds(1);
digitalWrite(pin, LOW);
}
void loop() {
if (millis() - old_millis >= 20) {
pulseOut(SERVO_PIN);
old_millis = millis();
}
}