PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Motoransteuerung in C



bergowitch
21.09.2005, 19:56
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

/*
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


/*
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


/*
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

linux_80
21.09.2005, 20:06
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.

bergowitch
21.09.2005, 20:37
Ich verstehe nicht recht. Das compilieren funktioniert - der Motor startet nicht!
Oder was meinst du?
Gruß
Stefan

linux_80
21.09.2005, 21:44
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 !

bergowitch
22.09.2005, 05:05
Hallo, habe ich doch auch nicht:


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

bergowitch
22.09.2005, 05:30
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


/*
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