Технический форум по робототехнике.
michey » 27 окт 2009, 22:37
Доброго времени суток.
Столкнулся с проблемой:
есть шасси от радиоуправляемой машинки,в данный момент,с мегой,принимающей команды по усарт и выполняющей их.
Серва управляющая рулевой - полностью аналоговая.
имеющая переменный резистор(?)с нулевой точкой.Есть три вывода,один из них общий,допустим 2-ой,когда колеса стоят прямо,на обоих сопротивление бесконечное,когда колеса повернуты влево между 1и2(допустим)сопротивление равно нулю,когда направо - между 2и3.
В данный момент колеса центруются,но точность и скорость этого процесса оставляет желать лучшего.
Был бы очень признателен,если бы ведающие подсказали алгоритм центровки.
EdGull » 27 окт 2009, 22:40
рисуешь линию на полу
к машинке приделываешь датчики линии
пишешь программку которая тебе будет показывать при каком положении резистора машинка ехала прямо
michey » 27 окт 2009, 22:46
Совсем не вариант,это надо делать на месте,а впоследствии и на ходу.
Сейчас делаю с помощью АЦП,сравнивая значения после маленького сдвига влево или вправо,в зависимости от начальных значений.Но выходит откровенно паршиво.
galex1981 » 27 окт 2009, 23:17
А что за серва то?
michey » 27 окт 2009, 23:19
нонейм чина
.черная коробочка,два контакта - двигатель,три - резистор.внутри ничего техничнее дифференциалов нету.
=DeaD= » 27 окт 2009, 23:21
С чего бы там сопротивление бесконечное? Вроде полное сопротивление между крайними выводами вообще постоянное, или это какие-то новые переменники?
michey » 27 окт 2009, 23:29
да,что-то я накосячил,не бесконечность.а между крайними - константа.
=DeaD= » 27 окт 2009, 23:36
А в чем задача центровки заключается? Определить напряжение на выходе с переменника, при котором колёса отцентрованы?
michey » 27 окт 2009, 23:40
- Код: Выделить всё • Развернуть
void cn(void)
{
putchar(0x0D);
printf("cn");
putchar(0x0D);
right=read_adc(1);
left=read_adc(0);
while (right > 64 || left > 64)
{
if (left-right>10)
{
PORTC.1=0;
PORTC.2=1;
delay_ms(10);
PORTC.1=0;
PORTC.2=0;
delay_ms(70);
}
right=read_adc(0);
left=read_adc(1);
if (right-left>10){
PORTC.1=1;
PORTC.2=0;
delay_ms(10);
PORTC.1=0;
PORTC.2=0;
delay_ms(70);
}
right=read_adc(0);
left=read_adc(1);
}
printf("ok");
}
В данный момент реализовано это так,скорость центрирования и погрешность не удовлетворяют.
=DeaD= » 27 окт 2009, 23:53
Так что надо то сделать? Управляя движком получить на выходе с переменника заданное напряжение?
michey » 27 окт 2009, 23:55
Да,только,надо согнать значения с обоих каналов к нулю.
=DeaD= » 27 окт 2009, 23:57
Что за оба канала? Вроде первый и последний контакты переменника всегда на питании и земле, а средний гоняет и с него снимают потенциал в АЦП?
michey » 27 окт 2009, 23:59
Ох стыдно то как.
я на средний кидал плюс,и мерял между 1\3 и землей.
=DeaD= » 28 окт 2009, 00:31
Ну ни фига себе вы извратились
Короче дальше должно быть проще тогда
читайте тут про методы управления, не зря же я переводил:
[[Перевод статьи "Просто о ПИД-алгоритмах"]]Страшных слов не бойтесь, там вроде всё в целом понятно на школьном уровне (старших классов естественно
)
michey » 28 окт 2009, 00:34
Спасибо,завтра после учебы почитаю.