stm32 сервопривод.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

stm32 сервопривод.

Сообщение Cheeseman »

Приветствую. Решил опробовать сервопривод и столкнулся с проблемой. при повороте вала на какой-либо градус иногда возникают колебания вала.
Прикладываю код инициализации ШИМ. В общем проблема что-то в духе перерегулирования. Вопрос, как избавиться от колебаний? Иногда привод четко поворачивает, иногда с колебаниями. Сервопривод 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);
	}
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 сервопривод.

Сообщение Eddy_Em »

А импульсы по даташиту? Длина и скважность?
Я когда начинал баловаться с сервой, с дуру просто ШИМил с разным заполнением. Естественно, получил ХЗ что. Почитал документацию на сервик - тогда понял, как правильно.
И действительно, ты начинаешь с
TIM10->CCR1 = TIM10->ARR/2; // коэффициент заполнения 50%
А положено полторы миллисекунды для среднего положения ротора. Т.е. в CCR1 следует загнать 1499.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: stm32 сервопривод.

Сообщение Cheeseman »

Со скважностью всё, вроде, четко. Поворачивается на тот угол на который нужно. На привод на этот вообще какая-то мутная документация была. Кое-как каую-то инфу в гугле нашел, что ШИМ 50Гц и 500мкс - это поворот на -90град, 2500мкс поворот на +90град. 1500мкс - 0 град соответственно. Все сделал, проверил, работает. Но иногда перерегулирование возникает. Но в конечном итоге он свой угол отрабатывает. мне как бы не критично, но какую-то муть оставлять не хочется

Добавлено after 1 minute 2 seconds:

Код: Выделить всё

void set_servo_rot_angle(uint8_t deg) {
	TIM10->CCR1 = 500 + (2000/180 * deg); // коэффициент заполнения
}

Изменяю вот в этой функции. В инициализацию вбил меандр.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 сервопривод.

Сообщение Eddy_Em »

(2000/180 * deg)
Скорей всего, препроцессор gcc записал 2000/180 как константу 11! И получается 11*deg, т.е. уже до честных 180° оно не довернется немного.
А колебания возникают, возможно, из-за глюкавости самого сервика. У меня тоже самый дешевый сервик плохо держал некоторые углы: буквально небольшое усилие, и начинается вибрация...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Эиком - электронные компоненты и радиодетали
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: stm32 сервопривод.

Сообщение a797945 »

извиняюсь, с сервой дело не имел, но интуитивно ...
я так понял - двиг борется с пружиной. И если есть такая проблема - или менять машинку или применять метод упр. с плавным подводом к точке.
Реклама
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: stm32 сервопривод.

Сообщение Cheeseman »

Понял, спасибо :beer:
Реклама
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: stm32 сервопривод.

Сообщение a797945 »

еще раз извиняюсь
пружину то я предположил зря - там собставенный контроллер, получается сервик поддельный.
У качественного, вроде как, этой болезни быть не должно.
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: stm32 сервопривод.

Сообщение Cheeseman »

Пришел в магаз, взял один из самых дешевых) видимо придется посмотреть что-нибудь получше)
Аватара пользователя
Cheeseman
Открыл глаза
Сообщения: 48
Зарегистрирован: Пн июл 31, 2017 10:53:04

Re: stm32 сервопривод.

Сообщение Cheeseman »

Проблема решена. пришел сервик с али подороже. Тот же самый код. Всё чётко. Как и писали выше проблема оказалась в самом сервоприводе. Всем кто помог спасибо)
Ответить

Вернуться в «ARM»