Привет! Появились ещё вопросы по этим сервам. Значит, написал я программку для управления на таймере, но столкнулся с некоторыми странностями в поведениями. Решил упростить программку и отследить что происходит. Значит, привожу функцию 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, как в статье.
Спасибо.