роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: ( или с L293/ATmega16 )
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Есть проблема: один из двигателей плохо работает. Возможно причиной является ШИМ на втором двигателе ( для замедления ). На выходах L293 для проблемного двигателя напряжение бывает разным от полувольта до 5. На нормально работающем - около 5.

Вот программа:
CODE:
void MainLoop()
{
if( !CheckFrontBumper() || !CheckBackBumper() )
{
TurnLeft();

MoveBackward( 1000 );

TurnRight();

MoveForward( 1000 );
}
else
{
ResetTurn();
MoveForward( 100 );
}

Stop();
}


int main(void)
{
DDRA = 0xFF;
DDRB = 0x00;

PORTA = 0x00;
PORTB = 0xFF;

while( true )
{
MainLoop();
}
}

(Добавление)
CODE:
bool CheckFrontBumper()
{
return ( PINB & ( 1 << PINB0 ) );
}

bool CheckBackBumper()
{
return ( PINB & ( 1 << PINB1 ) );
}

void Stop()
{
PORTA &= ~_BV( PA2 );//disable backward
PORTA &= ~_BV( PA3 );//disable forward
}

void MoveForward( unsigned int uiMilliseconds = 0)
{
PORTA &= ~_BV( PA2 );//disable backward
PORTA |= _BV( PA3 );//forward

if( uiMilliseconds != 0 )
{
_delay_ms( uiMilliseconds );
Stop();
}
}

void MoveBackward( unsigned int uiMilliseconds = 0)
{
PORTA &= ~_BV( PA3 );//disable forward
PORTA |= _BV( PA2 );//backward

if( uiMilliseconds != 0 )
{
_delay_ms( uiMilliseconds );
Stop();
}
}

(Добавление)
CODE:
void ResetTurn()
{
PORTA &= ~_BV( PA1 );//disable right turn
PORTA &= ~_BV( PA0 );//disable left turn
}

void TurnLeft( unsigned int uiMilliseconds = 0)
{
PORTA &= ~_BV( PA1 );//disable right turn
PORTA |= _BV( PA0 );//left turn

if( uiMilliseconds != 0 )
{
_delay_ms( uiMilliseconds );
ResetTurn();
}
}

void TurnRight( unsigned int uiMilliseconds = 0)
{
PORTA &= ~_BV( PA0 );//disable left turn
PORTA |= _BV( PA1 );//right

if( uiMilliseconds != 0 )
{
_delay_ms( uiMilliseconds );
ResetTurn();
}
}

(Добавление)
Схема ( плохо работающий двигатель обведен красным ):

(Отредактировано автором: 10 Августа, 2008 - 23:10:02)

 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



Не очень понятно, что подразумевается под ШИМ в данной конструкции.

Зачем в функции MainLoop все время делать ResetTurn() для двигателя, который Вы называете проблемным?

А проблемность работы двигателя целиком определяется по модели в Протеусе?
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



На модели в протеусе как раз все выглядит нормально Улыбка))
В ResetTurn изначально было сделано так, видимо в процессе экспериментов я изменил:
CODE:
void ResetTurn()
{
PORTA |= _BV( PA1 ); // enable right turn
PORTA &= ~_BV( PA1 );//disable right turn
PORTA |= _BV( PA0 );//enable left turn
PORTA &= ~_BV( PA0 );//disable left turn
}


Это нужно потому, что один из двигателей расположен сзади и отвечает за движение вперед-назад, а второй стоит спереди и отвечает за повороты влево и вправо. В процессе движения иногда колеса поворачивались сами, поэтому ввел такую конструкцию, чтобы сбросить состояние поворота.

Ну, ШИМ, конечно звучит гордо Улыбка) Просто каждые 100 миллисекунд прекращается подача питания на двигатель, и за счет этого достигается некоторое уменьшение скорости.
 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



kurt84 пишет:
каждые 100 миллисекунд прекращается подача питания на двигатель


Ну вот на нем питание и пляшет.

kurt84 пишет:
В процессе движения иногда колеса поворачивались сами


Это потому, что Вы не предприняли мало-мальски необходимых мер по стабилизации работы микроконтролера. На модели в Протеусе все идеальное, в том числе и питание.

Прочитайте, пожалуйста, внимательно про электролитический конденсатор в статье Простой робот на микроконтроллер е (Часть 1).
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



Конденсатор на 1000 мкф у меня установлен. Просто это не отражено в схеме. Имеет ли смысл ставить дополнительный рядом с L293D?
 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



Можно и поставить, но я думаю, это погоды особо не изменит.

Попробуйте написать совсем простую программу. Типа: веред, направо, вперед, налево, назад (все это в цикле). И понаблюдайте за поведением Вашей конструкции, в частности за поведением моторов.

Иногда дешевые моторы срабатывают через раз. Но вот самопроизвольно запускаться они не должны.

Если поведение будет нестабильным, то попробуйте стабилизировать Вашу схему дополнительными мерами. Подключение Atmel AVR: стабилиза ция работы микроконтроллера.

Для начала подключите подтягивающий питание резистор к RESET. Если не поможет, то сделайте раздельное питание. Запитайте микросхемы от "Кроны" через стабилизатор.
 
 Top
kurt84 Post Id



Майор


Сообщений всего: 56
Дата рег-ции: Июль 2008  



С простой программой все работает стабильно. Единственной проблемой с простой программой было то, что робот разгонялся и врезался во все подряд, т.к. датчики срабатывают слишком поздно.
 
 Top
digger Администратор Post Id



Администратор


Сообщений всего: 372
Дата рег-ции: Май 2006  



Организуйте ШИМ на таймере.

Сигнал ШИМ можно подключить к входу Enable.

Управление скоростью вращения дв игателя постоянного тока с помощ ью широтно-импульсной модуляции
 
 Top
Страниц (1): [1]
« Делаем роботов »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru