kramann.info
© Guido Kramann

Login: Passwort:










5.2 Den Antrieb testen

5.2 (EN google-translate)

5.2 (PL google-translate)

Ansteuerung der Motoren gemäß RP6v2_MAINBOARD.pdf:


Richtung linker  Motor:  PC2
Richtung rechter Motor:  PC3

Geschwindigkeit linker  Motor (PWM): OC1B / PD4
Geschwindigkeit rechter Motor (PWM): OC1A / PD5

Code 5.2-1: Zuordnungen für die Motoransteuerung.

Testprogramm für die Motoren nur mit Hilfe von digitalen Ausgängen

#include<avr/io.h>

void initialisiereMotore()
{
    DDRC |= 0b00001100;
    DDRD |= 0b00011000;
}

void fahrt(int links, int rechts)
{
    if(links==0)    
    {
        PORTC &= ~(1<<PC2);
        PORTD &= ~(1<<PD4);
    }
    else if(links<0)
    {
        PORTC |=  (1<<PC2);
        PORTD |=  (1<<PD4);
    }
    else
    {
        PORTC &= ~(1<<PC2);
        PORTD |=  (1<<PD4);
    }

    if(rechts==0)    
    {
        PORTC &= ~(1<<PC3);
        PORTD &= ~(1<<PD5);
    }
    else if(rechts<0)
    {
        PORTC |=  (1<<PC3);
        PORTD |=  (1<<PD5);
    }
    else
    {
        PORTC &= ~(1<<PC3);
        PORTD |=  (1<<PD5);
    }

}

int main()
{
    unsigned long pause=0;
    initialisiereMotore();

    while(1)
    {
        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(1,1);  //Geradeaus
        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(-1,1);  //Links-Drehung
        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop
    }
}

Code 5.2-2: motortest.c - Testprogramm für die Motoren nur mit Hilfe von digitalen Ausgängen

Testprogramm für die Motoren nur mit Hilfe von digitalen Ausgängen und 10-Bit Phasenkorrekten PWM-Signalen von Timer 1

//   avr-gcc -O2 -mmcu=atmega32 motortestpwm.c -o motortestpwm.elf 
//   avr-objcopy -O ihex -j .text -j .data motortestpwm.elf motortestpwm.hex 

//   Upload über RobotLoader_20100712



#include<avr/io.h>

void initialisiereMotore()
{
    DDRC |= 0b00001100;  //Richtung

    //10-Bit Phasen-korrektes PWM-Signal.
    TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (1<<WGM10);
    TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
    DDRD |= (1<<PD5) | (1<<PD4); //auf Ausgang setzen.            
    OCR1A = 0; //PWM-Breite setzen (entspricht für Servo auf 0 Grad).
    OCR1B = 0; //PWM-Breite setzen (entspricht für Servo auf 0 Grad).
}

void fahrt(int links, int rechts)  //Wertebereich: +-1023
{
    if(links==0)    
    {
        PORTC &= ~(1<<PC2);
        OCR1B = 0;
    }
    else if(links<0)
    {
        PORTC |=  (1<<PC2);
        OCR1B = -links;
    }
    else
    {
        PORTC &= ~(1<<PC2);
        OCR1B = links;
    }

    if(rechts==0)    
    {
        PORTC &= ~(1<<PC3);
        OCR1A = 0;
    }
    else if(rechts<0)
    {
        PORTC |=  (1<<PC3);
        OCR1A = -rechts;
    }
    else
    {
        PORTC &= ~(1<<PC3);
        OCR1A = rechts;
    }

}

int main()
{
    unsigned long pause=0;
    initialisiereMotore();

    while(1)
    {
        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(1023,1023);  //Geradeaus

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(200,200);  //langsame Geradeaus

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(-1023,1023);  //Links-Drehung

        for(pause=0;pause<300000;pause++)
            DDRB|=0;
        fahrt(0,0);  //stop
    }
}

Code 5.2-3: motortestpwm.c - Testprogramm für die Motoren nur mit Hilfe von digitalen Ausgängen und 10-Bit Phasenkorrekten PWM-Signalen von Timer 1