Привет! Появились ещё вопросы по этим сервам. Значит, написал я программку для управления на таймере, но столкнулся с некоторыми странностями в поведениями. Решил упростить программку и отследить что происходит. Значит, привожу функцию main, так как остальное не имеет значения:
- Код: Выделить всё • Развернуть
 int main(void) {
USART_vInit();
PORTB = 1 << 0;
DDRC = 1 << 5;
volatile int tmp2;
tmp2 = 1000; // длина импульса в микросекундах
for(;;) {
   tmp = USART_vReceiveByte();
   switch(tmp) {
      case '1':
         tmp2 -= 100;
         USART_vSendByte((int)(tmp2/100));
      break;
      case '2':
         tmp2 += 100;
         USART_vSendByte((int)(tmp2/100));
      break;
   }
   
        // не выходим за пределы
   if (tmp2 < 100) tmp2 = 100;
   if (tmp2 > 2000) tmp2 = 2000;
        // шим
   PORTC = 0; 
   _delay_ms(18); 
   PORTC = 1 << 5;
   _delay_us(tmp2);
}
Тут tmp2 задаёт продолжительность импульса в микросекундах. Если по UARTу приходит '1' - уменьшается на сто, если '2' - увеличивается. И при этом отправляет новое значение / 100 (чтобы знать текущую длину импульса).
Запустив и поигравшись, вижу что максимальный угол достигается при максимальном значении 1900 микросекунд.
Далее спускаемся до 200, угол изменяется более-менее плавно. Потом при изменении от 200 до 100, рывком проворачивается градусов на 45. Это фича какая-то чтоли?) Или я что-то не правильно делаю? То есть более-менее плавно вращать серву можно только на 135 градусов? И почему нижний предел длины сигнала такой маленький? 100-200 микросекунд, вместо 1000, как в статье.
Спасибо.