Bei meinen Anfängen (Teillösungen zusammengeschnitten und auf einen Controller gebracht) hatte ich auch Probleme mit der Motorsteuerung.Zitat:
... schön langsam denke ich eher in Richtung Hardware defekt da es nur die Steuerung der Fahrmotoren betrifft
Was half dann:
- Leitungstest Motorausgang vom Treiberbaustein zum Motoreingang auf Platine und Verdrahtung
- Leitungstest von Kurzschlüssen (Übersprechen) von einer Motorleitung zur andern
- GENAUE Inspektion der Schaltbefehle - also Testprogramm dass nacheinander für je 30 sec einen Motorpin nach dem andern schaltet - und das Ganze mit dem DMM nachverfolgen.
- Prüfung der PWM-Funktion statt Nur-Motorpinne-ein-aus
- GENAUE, aufmerksame (umständliche *gg*) Programmiererei, gut kommentierte Motoransteuerung, siehe Beispiel unten
- Zusammenbau der Grundfunktionen Motoransteuerung und NUR die in einem Test prüfen in der Art Mot1 vor, Mot1 zurück, Mot2 ...
- Die Motoren werden softwareseitig NUR über diese Funktionen geschaltet!!
Nur so, als (m)ein Beispiel - und das läuft und läuft. BTW: die Motoren werden softwareseitig NUR über diese Funktionen geschaltet!!
Code:// ============================================================================= =
// Motoransteuerung mit RN VN2 MotorControl, hier werden die Drehrichtungen gesetzt
// Anschlüsse am mega1284 auf MoCo4 (eigne Platine, Stand Anfang Sep14 ) :
// Motor12 ist in Fahrtrichtung rechts, Rad rechts vom Motor
// Motor34 ist in Fahrtrichtung links, Rad links vom Motor
// Motorbefehle: Mxxxxvor => Rad bewegt Gefährt VORwärts etc.
// A C H T U N G : Motoranschlüsse der VN haben (+) "innen" und GND/(-) "aussen"
// ############### ########## ############
// - - - - - - - - - -
// XTAL1 PB6___9 20___VCC
// XTAL2 PB7 10 19 PB5, SCK, _|-- 3,4 Guz
// PD5 11 18 PB4, MISO
// Mot12 _|-- 1,2 uz, PD6__12 17___PB3, MOSI, Reserve 2
// Mot12 _|-- 1,2 Guz, PD7 13 16 PB2, OC1B => PWM4 für Mot34
// Mot34 _|-- 3,4 uz, PB0 14 15 PB1, OC1A => PWM1 für Mot12
// - - - - - - - - - - - - - - - - - - - - - - - - - -
// vgl. Erklärung von Hubert.G (zu L293D)
// https://www.roboternetz.de/community/threads/59146
//-Wieso-benötigt-RN-Control-(1-4-)-für
//-integrierten-Motortreiber-gleich-3-freie-Ports?p=558716&viewfull=1#post558716
// Zitat Mit Setzen von Kanal 1 und 2 auf 0 ist der Motor im Freilauf
// Werden beide Kanäle auf 1 gesetzt wird der Motor gebremst
// - - - - - - - - - - - - - - - - - - - - - - - - - -
// -----------------------
// Drehrichtungsbefehle für Motor 1,2 = "rechter" Motor
// r r r r r r r Motor 1,2 = rechter Motor r r r r r r
// ============================================================================= =
void Mrechtsvor (void) // Recht Mot12 dreht rechts=Uhrzeiger=math-negativ
{ // dann fährt recht. Rad "vorwärts" = Mrechtsvor
TCCR1A |= (1<<COM1A1); // Clear/set OC1A on Cmp Match enabled 132
PORTD |= (1<<M11); // => 1; Setze M1-IN1 high
PORTD &= ~(1<<M12); // => 0; Setze M1-IN2 low
m12dir = 1; // m12dir ist positiv, weil Antrieb VORWÄRTS
} //
// ============================================================================= =
void Mrechtszur (void) // ReMot12 dreht links=Gegenuhrzeigersinn=math-pos
{ // .. dann fährt rechtes Rad "rückwärts"
TCCR1A |= (1<<COM1A1); // Clear/set OC1A on Cmp Match enabled 132
PORTD &= ~(1<<M11); // => 0; Setze M1-IN1 low
PORTD |= (1<<M12); // => 1; Setze M1-IN2 high
m12dir = -1; // m12dir ist negativ, weils Antrieb RÜCKWÄRTS
} //
// ============================================================================= =
void Mrechtsaus (void) // Motor 12 aus
{ //
TCCR1A &= ~(1<<COM1A1); // Disable clear/set OC0B on Compare Match
OCR1A = 0; // PWM-Wert Mot12 auf Null setzen
PORTD &= ~(1<<M11); // Setze M1-IN1 low
PORTD &= ~(1<<M12); // Setze M1-IN2 low => beide low => Freilauf
m12dir = 0; //
} //
// ============================================================================= =
void Mrechtsbrms (void) // Motor 12 BREMSEN
{ //
TCCR1A &= ~(1<<COM1A1); // Disable clear/set OC0B on Compare Match
OCR1A = 0; // PWM-Wert Mot12 auf Null setzen
PORTD |= (1<<M11); // Setze M1-IN1 high
PORTD |= (1<<M12); // Setze M1-IN2 high => beide high => Bremsen
m12dir = 0; //
} //
// -----------------------
// Drehrichtungsbefehle für Motor 3,4 = "linker" Motor
// l l l l l l l Motor 3,4 = linker Motor l l l l l l
// ============================================================================= =
void Mlinksvor (void) // LiMot34 dreht im Gegenuhrzeigersinn = math. neg
{ // dann fährt linkes Rad "vorwärts" = Mlinksvor
TCCR1A |= (1<<COM1B1); // Enable clear/set OC0B on Compare Match
PORTC &= ~(1<<M41); // => 0; Setze M4-IN1 low
PORTC |= (1<<M42); // => 1; Setze M4-IN2 high
m34dir = 1; // m34dir ist positiv, weils Antrieb VORÄRTS
} //
// ============================================================================= =
void Mlinkszur (void) // Linkr Mot34 dreht im Uhrzeig=math-pos.
{ // .. dann fährt linkes Rad "rückwärts"
TCCR1A |= (1<<COM1B1); // Enable clear/set OC0B on Compare Match
PORTC |= (1<<M41); // => 1; Setze M4-IN1 high
PORTC &= ~(1<<M42); // => 0; Setze M4-IN2 low
m34dir = -1; // m34dir ist negativ, weil Antrieb RÜCKWÄRTS
}
// ============================================================================= =
void Mlinksaus (void) // Motor 34 aus
{ //
TCCR1A &= ~(1<<COM1B1); // Disable clear/set OC1B on Compare Match
OCR1B = 0; // PWM-Wert Mot34 auf Null setzen
PORTC &= ~(1<<M41); // => 0; Setze M4-IN1 low
PORTC &= ~(1<<M42); // => 0; Setze M4-IN2 low
m34dir = 0; //
} //
// ============================================================================= =
void Mlinksbrms (void) // Motor 34 BREMSEN
{ //
TCCR1A &= ~(1<<COM1B1); // Disable clear/set OC1B on Compare Match
OCR1B = 0; // PWM-Wert Mot12 auf Null setzen
PORTC |= (1<<M41); // => 1; Setze M4-IN1 high
PORTC |= (1<<M42); // => 1; Setze M4-IN2 high => beide high = Bremsen
m34dir = 0; //
} //
// ============================================================================= =
// Wahrheitstabelle für die Motoren gemäß VN2 und Drehsinn-Definitionen
// #define M11 PD6 // M1-IN1 auf PD6 Motor 1 (12) weil er auf
// #define M12 PD7 // M1-IN2 auf PD7 den Anschlüssen 12 liegt
// #define M41 PC4 // M4-IN1 auf PC4 Motor 4 (34) weil er auf
// #define M42 PC5 // M4-IN2 auf PC5 den Anschlüssen 34 liegt
// - - - - - - - - - - - - - - -
// MoRe "vor" =: Vorwärtsfahrt "rechts" =: Drehsinn Mot
// Beispiel mot12 dreht mathematisch negativ bei Befehl "vor" = "rechts"
// vor/re zur/li stop brems vor/zur = Rad-/Fortbewegung
// M11= 1 0 0 1 re / li = Motordrehrichtung
// M12= 0 1 0 1
// - - - - - - - - - - - - - - - -
// MoLi =: Mot34, "vor/links" dreht Motor mathematisch positiv
// vor/li zur/re stop brems vor/zur = Rad-/Fortbewegung
// M41= 1 0 0 1 re / li = Motordrehrichtung
// M42= 0 1 0 1
// - - - - - - - - - - - - - - -
// ============================================================================= =
// ===== ENDE Subroutinen ================================================= =
// ============================================================================= =