Приветствую. Решил опробовать сервопривод и столкнулся с проблемой. при повороте вала на какой-либо градус иногда возникают колебания вала.
Прикладываю код инициализации ШИМ. В общем проблема что-то в духе перерегулирования. Вопрос, как избавиться от колебаний? Иногда привод четко поворачивает, иногда с колебаниями. Сервопривод ES08MA ii
Код:
void init_servo_PWM(void) {
__HAL_RCC_TIM10_CLK_ENABLE();
/* f = 50 Гц. Время периода 20 мс */
TIM10->ARR = (20000 - 1); // период в микросекундах
TIM10->PSC = (120 - 1); // предделитель
TIM10->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // режим ШИМ1
TIM10->CCMR1 |= TIM_CCMR1_OC1PE; // буферизируем CCR1. необходимо в шиме. Подгрузка осуществляется только после события обновления
TIM10->CCMR1 &= ~TIM_CCMR1_CC1S; //канал на выход
TIM10->CCR1 = TIM10->ARR/2; // коэффициент заполнения 50%
TIM10->CCER &= ~TIM_CCER_CC1P; // активный сигнал высокий
TIM10->CCER |= TIM_CCER_CC1E; // активировать выход OC1
TIM10->EGR = TIM_EGR_UG; //необходимо установить для установки всех коэффициентов
TIM10->CR1|= TIM_CR1_CEN; // Запуск таймера
}
В основном цикле тупо поворачиваю вал на 30 градусов, для эксперимента. Код
Код:
while (1) {
set_servo_rot_angle(0);
HAL_Delay(1000);
set_servo_rot_angle(30);
HAL_Delay(1000);
set_servo_rot_angle(60);
HAL_Delay(1000);
set_servo_rot_angle(90);
HAL_Delay(1000);
set_servo_rot_angle(120);
HAL_Delay(1000);
set_servo_rot_angle(150);
HAL_Delay(1000);
set_servo_rot_angle(180);
HAL_Delay(1000);
set_servo_rot_angle(150);
HAL_Delay(1000);
set_servo_rot_angle(120);
HAL_Delay(1000);
set_servo_rot_angle(90);
HAL_Delay(1000);
set_servo_rot_angle(60);
HAL_Delay(1000);
set_servo_rot_angle(30);
HAL_Delay(1000);
}