PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM - Motorsteuerun?



bergowitch
07.10.2005, 07:17
Hallo,
ich komme nur langsam voran. Inzwischen ist zwar das Fahrwerk meines Roboters fertig - die Prorammierung des RN-Control Boards klappt noch nicht.
Zwar lässt sich inzwischen die Richtung regeln - nicht jedoch die Geschwindikeit. :-s
Also ich verstehe das doch richtig:
Ausgang PD4 und PD5 regeln die Geschwindigkeit? Also auf 0 setzen => Roboter steht.
OCR1A und OCR1B geben den "Anteil" der Rechteckspannung der 1 ist!? Also 0 => keine Ammplitude => Motoren stehen
Richtig? Wenn ja warum funktioniert das Proramm nicht (Hier der Motortreiber)


#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 &= ~(( 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 &= ~(( 1 << PD5 )| ( 1 << PD4 )); // Motor an Port PD4 und PD5 aus
OCR1A = left_speed;
OCR1B = right_speed;
PORTD |= (( 1 << PD5 )| ( 1 << PD4 )); // Motor an Port PD4 und PD5 an
}
/* Motoren anhalten */
void MotorStop (void)
{
// PORTD &= ~(( 1 << PD5 )| ( 1 << PD4 )); // Motor an Port PD4 und PD5 aus
OCR1A = 0;
OCR1B = 0;
}
/* Motor Richtung festlegen (FWD; BWD) */
void MotorDir(unsigned char left_dir, unsigned char right_dir)
{
PORTB &= ~((1 << PB0) | (1 << PB1));
PORTB |= right_dir;
if (left_dir == FWD)
left_dir = (1 << PC6);
else
left_dir = (1 << PC7);
PORTC &= ~((1 << PC6) | (1 << PC7));
PORTC |= left_dir;
}



Vielen Dank für eure Hilfe.
Gruß
Stefan

pebisoft
07.10.2005, 07:30
OCR1A=1; // Mindestzeit für PWM1
OCR1B=1; // Mindestzeit für PWM2
setzt mal auf 255 bei 8bit pwm´oder 1024 bei 10bit pwm
mfg pebisoft

bergowitch
07.10.2005, 08:23
Ja das wars. Danke!!
Aber wieso? ist OCR1x die Frequenz und bedeutet bei 1024 eine Welle?
Gruß Stefan

Frank
07.10.2005, 16:29
Ja OCR1x legt fest wie lange die Amplitude innerhalb der Welle (Periode) High ist. Bei 10 Bit PWM bedeutet 1023 das quasi das Signal immer auf High ist - Motor hat halt volle Spannung.
Bei 0 ist es immer Low, also Motor aus. Und alle Zwischenwerte erhöhen den High-Anteil innerhalb dieser Welle so das Motorgeschwindigkeit steigt.
So einfach ist es, die Konfiguration sieht übrigens nur in C durch die kryptische Syntax etwas verwirrend aus.

https://www.roboternetz.de/wiki/pmwiki.php?n=Main.PWM

bergowitch
10.10.2005, 17:01
Ja so wie du es beschreibst hatte ich es auch verstanden - aber leider ist es bei meinem Programm genau umekehrt ... bei 1023 steht der Motor. Kann es daran liegen, dass das PWM-Signal "inverted" ist? Also das ganze nur andersrum?
Danke
Gruß Stefan

Frank
11.10.2005, 15:32
Ja offenbar invertiertst du PWM. Du musst in TCCR1A / TCCR1B wohl falsches Bit gesetzt haben.

In Bascom sieht der ganze C Wirrwarr so aus:



Tccr1a = &B10100011
Tccr1b = &B10000001
Pwm1a = 0 ' Geschwindigkeit 0 - 1023
Pwm1b = 0 ' Geschwindigkeit 0 - 1023