-         

Ergebnis 1 bis 6 von 6

Thema: RN-Control Motoransteuerung in C

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214

    RN-Control Motoransteuerung in C

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    ich habe versucht vom ASURO die Motorsteuerung auf das RN-Control zu übertragen. Leider funktioniert das Programm nicht.
    Kann mir jemand helfen?
    Hier das hauptprogramm
    Code:
    /*	
    	Hier werden die Grundlegenden Motorbefehle ausprobiert
    	Sie sind vom ASURO übernommen und an das RN-Control angepasst worden
    	
    */
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include "motor.h"		// einbinden der Motortreiber
    
    #define  FALSE	0
    #define  TRUE	1
    
    #define  OFF    0
    #define  ON     1
    
    #define GREEN	1
    #define RED		2
    #define YELLOW  3
    
    
    int main(void)
    {
    	unsigned int x, y;
    	MotorInit();
    	MotorDir(FWD,FWD);
    	MotorStop();
    	MotorSpeed(500,500);
    	for(;;)
    	{
    		MotorDir(FWD,FWD);
    		MotorSpeed(500,500);		// Beide Motoren gleiche Richtung vorwärts
    		for(x=0;x<=40000;x++) asm volatile ("nop");       // Pause
    		MotorStop();
    		MotorDir(FWD,BWD);
    		MotorSpeed(500,500);		// Motoren verschiedene Richtungen und Geschwindigkeiten
    		for(x=0;x<=40000;x++) asm volatile ("nop");       // Pause
    		MotorStop();
    		MotorDir(BWD,FWD);
    		MotorSpeed(500,500);		// Motoren verschiedene Richtungen und Geschwindigkeiten
    		for(x=0;x<=40000;x++) asm volatile ("nop");       // Pause
    		MotorStop();
    		for(x=0;x<=60000;x++)        // Längere Pause
    			{
    				for(y=0;y<=60000;y++) asm volatile ("nop");
    			}
    	}
    	return 0;
    }
    und Motor.c
    Code:
    /*
    Motortreiber für das RN-Control Board 
    mit 2 Getriebemotoren 
    Der Treiber ist an den Treibern für den ASURO angelehnt
    by Stefan 18.09.2005
    */
    
    #include <avr/io.h>
    
    #include "motor.h"
    
    void MotorInit(void) // Initialisierung der Motoren
    {
       DDRD= (1<<PD4) | (1<<PD5);   // PWM Pins als Ausgang festlegen (links/rechts)
       // Motor Ports für die Richtung festlegen (als Ausgänge)
       DDRC= (1<<PC6) | (1<<PC7);   // 6=Motor 1 Kanal 1    7= Motor 1 Kanal 2
       DDRB= (1<<PB0) | (1<<PB1);   // 0=Motor 2 Kanal 1    1= Motor 2 Kanal 2
       // PWM einstellen
       TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11)|(1<<WGM10); // 10 Bit Pwm, invertierend
       TCCR1B = (1<<CS11);      // Prescaler 8
       // Ausgänge für PWM
       OCR1A=1;         // Mindestzeit für PWM1
       OCR1B=1;         // Mindestzeit für PWM2
       // und in Ausgangswerte setzen
       
    }
    
    /* Motor Geschwindigkeit verändern */
    void MotorSpeed(unsigned int left_speed, unsigned int right_speed)
    {
    	OCR1A = left_speed;
    	OCR1B = right_speed;
    }
    /* Motor Richtung festlegen (FWD; BWD) */
    void MotorDir(unsigned char left_dir, unsigned char right_dir)
    {
    	PORTB = (PORTB &~ ((1 << PB0) | (1 << PB1))) | right_dir;
    	if (left_dir == FWD) 
    		left_dir = (1 << PC6);
    	else
    		left_dir = (1 << PC7);
    	PORTD = (PORTD &~ ((1 << PC6) | (1 << PC7))) | left_dir;
    }
    /* Motoren Stoppen */
    void MotorStop (void)
    {
    	OCR1A = 0;
    	OCR1B = 0;
    }
    und motor.h
    Code:
    /*
    Motortreiber für das RN-Control Board 
    mit 2 Getriebemotoren 
    Der Treiber ist an den Treibern für den ASURO angelehnt
    by Stefan 18.09.2005
    */
    
    
    #define FWD		(1 << PB1) /* (1 << PC7) */
    #define BWD		(1 << PB0) /* (1 << PC6) */
    
    void MotorInit(void); // Initialisierung der Motoren
    
    /* Motor Geschwindigkeit verändern von 0 bis 1024 */
    void MotorSpeed(unsigned int left_speed, unsigned int right_speed);
    
    /* Motor Richtung festlegen (FWD; BWD) */
    void MotorDir(unsigned char left_dir, unsigned char right_dir);
    
    /* Motoren Stoppen */
    void MotorStop (void);
    Vielen Dank
    Gruß Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hi,

    sowas ähnliches hatten wir doch schon vor kurzen irgendwo,
    Du musst in allen Dateien die AVR-inlcudes einbinden, in denen Du auch so sachen wie PB1 verwendest.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Ich verstehe nicht recht. Das compilieren funktioniert - der Motor startet nicht!
    Oder was meinst du?
    Gruß
    Stefan

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    achso, da hab ich wohl etwas zu schnell gelesen,

    mit den Ausgängen passt aber noch was nicht,
    auf PortD Pin 6 und 7 gibts beim RN-Control keinen Motor !

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Hallo, habe ich doch auch nicht:
    Code:
       DDRD= (1<<PD4) | (1<<PD5);   // PWM Pins als Ausgang festlegen (links/rechts)
       // Motor Ports für die Richtung festlegen (als Ausgänge)
       DDRC= (1<<PC6) | (1<<PC7);   // 6=Motor 1 Kanal 1    7= Motor 1 Kanal 2
       DDRB= (1<<PB0) | (1<<PB1);   // 0=Motor 2 Kanal 1    1= Motor 2 Kanal 2
    Habe ich auch nicht.
    Muss man den die Ausgänge für PWM also PD4 und PD5 nicht nur als Ausgang definieren sondern auch noch einschalten?
    Gruß
    Stefan

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    ups, du hattest recht. In MotorDir hatte ich PortD angesprochen.
    Ist behoben und ich habe die PWM PINs in MotorSpeed eingeschaltet.
    Das Ergebnis: Es tut sich immer noch nichts...
    Hier die veränderte Motor.c
    Code:
    /*
    Motortreiber für das RN-Control Board 
    mit 2 Getriebemotoren 
    Der Treiber ist an den Treibern für den ASURO angelehnt
    by Stefan 18.09.2005
    */
    
    #include <avr/io.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include "motor.h"
    
    void MotorInit(void) // Initialisierung der Motoren
    {
       DDRD= (1<<PD4) | (1<<PD5);   // PWM Pins als Ausgang festlegen (links/rechts)
       // Motor Ports für die Richtung festlegen (als Ausgänge)
       DDRC= (1<<PC6) | (1<<PC7);   // 6=Motor 1 Kanal 1    7= Motor 1 Kanal 2
       DDRB= (1<<PB0) | (1<<PB1);   // 0=Motor 2 Kanal 1    1= Motor 2 Kanal 2
       // PWM einstellen
       TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11)|(1<<WGM10); // 10 Bit Pwm, invertierend
       TCCR1B = (1<<CS11);      // Prescaler 8
       // Ausgänge für PWM
       PORTD = PIND &~ (( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
       OCR1A=1;         // Mindestzeit für PWM1
       OCR1B=1;         // Mindestzeit für PWM2
       // und in Ausgangswerte setzen
       
    }
    
    /* Motor Geschwindigkeit verändern */
    void MotorSpeed(unsigned int left_speed, unsigned int right_speed)
    {
    	PORTD = PIND &~ (( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
    	OCR1A = left_speed;
    	OCR1B = right_speed;
    	PORTD = PIND | ( 1 << PD5 )| ( 1 << PD4 );  // Motor an Port PD4 und PD5 an
    }
    /* Motor Richtung festlegen (FWD; BWD) */
    void MotorDir(unsigned char left_dir, unsigned char right_dir)
    {
    	PORTB = (PORTB &~ ((1 << PB0) | (1 << PB1))) | right_dir;
    	if (left_dir == FWD) 
    		left_dir = (1 << PC6);
    	else
    		left_dir = (1 << PC7);
    	PORTC = (PORTC &~ ((1 << PC6) | (1 << PC7))) | left_dir;
    }
    /* Motoren Stoppen */
    void MotorStop (void)
    {
    	PORTD = PIND &~ (( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
    	OCR1A = 0;
    	OCR1B = 0;
    }
    Kann jemand helfen?
    Danke
    Gruß Stefan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •