Есть проблема: один из двигателей плохо работает. Возможно причиной является ШИМ на втором двигателе ( для замедления ). На выходах 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) |