... bin aber immer auf das asurowiki gekommen, wo def teil mit dem pwm signal ausgelassen wurde.
Die asurolib ist ja schon mal ne gute Vorlage für eigene Ansätze. WENN Du etwas mehr Gehirnschmalz (zur Erleuchtung oder Verwirrung - beides ist möglich) möchtest, dann lies Dir vielleicht meinen Code durch. Der ist für nen mega168/328/20MHz geschrieben und bedient einen L263D. Da ist auch - denke ich - die Pindefinition und -funktion einigermassen deutlich. Aber die eigenen Töchter sind ja auch immer die schönsten.
Daher - nicht zum Lesen gedacht:
Code:
/* >>
Sicherung 14Aug12 1704 ..C2\D01_41\D041_mot60.c
===================================================================================
Target MCU : siehe main
Target Hardware : MiniD0
Target cpu-frequ. : In der Quelle wählbar
================================================================================ */
// ============================================================================== =
// == PWM-Routinen zur Motoransteuerung
void TC0PWM_init(void) //Init Timer/Counter0 für Erzeugung des PWM-Signals
{
TCCR0A |= (1<<COM0A1)|(1<<COM0B1); //Clear/set OC0A/OC0B on Compare Match,
// doc S102 , OC0A/OC0B ist Port PD6/D5
TCCR0A |= (1<<WGM01)|(1<<WGM00); // Fast PWM, TOP=0xFF=dez255, doc S104
// das ergibt aus 20 MHz mit Prescaler 1/64 1220 Hz
TCCR0B |= (1<<CS01)|(1<<CS00); // Prescaler ist clk/64 doc S106
TIMSK0 &= ~(1<<OCIE0A)|(1<<OCIE0B); // Tmr/Cntr0 Oput CompB Match intrrpt dsabld
TIMSK0 &= ~(1<<TOIE0); // Tmr/Cntr0 Overflow interrupt disabled
OCR0A = 0; // PWM auf Null setzen
OCR0B = 0; // PWM auf Null setzen
}
// ============================================================================== =
void setPWMrechts(uint8_t speed) //Geschwindigkeit Motor 12 (rechter)
{OCR0B = speed;} // PWM auf PD5/OC0B, korrig. 24mrz09
// ============================================================================== =
void setPWMlinks(uint8_t speed) //Geschwindigkeit Motor 34 (linker)
{OCR0A = speed;} // PWM auf PD6/OC0A, korrig. 24mrz09
// ============================================================================== =
// ============================================================================== =
// Motoransteuerung mit dem L293D, hier werden die Drehrichtungen gesetzt
// Anschlüsse M168 für R3D01 für die Motoransteuerung (Stand 24mrz09 1410) :
// Motor 12 ist in Fahrtrichtung rechts (Kennzeichen 1 Punkt)
// Motor 34 ist in Fahrtrichtung links (Kennzeichen 2 Punkte)
//
// (E7) _|-- 1,2 Guz, PD4___6 23___PC0, SFH 5110, IN irDME 1-2
// . . . . . . . . . . . .
// XTAL1 PB6___9 20___VCC
// XTAL2 PB7 10 19 PB5, SCK, Taster2
// (E6) PWM 1,2 uz+Guz,PD5 11 18 PB4, MISO, _|-- 1,2 uz, Taster1
// (E5) PWM 3,4 uz+Guz,PD6__12 17___PB3, MOSI, Reserve 2
// (E8) _|-- 3,4 uz,PD7 13 16 PB2, Servo
// (E9) _|-- 3,4 Guz,PB0 14 15 PB1, OC1A = SFH 415, OUT (irDME)
// - - - - - - - - - - - - - - - - - - - - - - - - - -
// 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 setzten 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) // Mot12 dreht im Uhrzeigersinn = neg. math.
{ // .. dann fährt rechtes Rad "vorwärts"
// TCCR0A |= (1<<COM0B1); // Enable clear/set OC0B on Compare Match
PORTD &= ~(1<<PD4); // Setze 1A low
PORTB |= (1<<PB4); // Setze 2A high
mdir12 = 1;
} //
// ============================================================================== =
void Mrechtszur (void) // Mot12 dreht im mathematisch positiven Drehsinn
{ // .. dann fährt rechtes Rad "rückwärts"
// TCCR0A |= (1<<COM0B1); // Enable clear/set OC0B on Compare Match
PORTD |= (1<<PD4); // Setze 1A high
PORTB &= ~(1<<PB4); // Setze 2A low
mdir12 = -1; //
} //
// ============================================================================== =
void Mrechtsstop (void) // Motor 12 aus
{ //
// TCCR0A &= ~(1<<COM0B1); // Disable clear/set OC0B on Compare Match
PORTD &= ~(1<<PD4); // Setze 1A low
PORTB &= ~(1<<PB4); // Setze 2A low
} //
// -----------------------
// 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) // Mot3,4 dreht im mathematisch positiven Drehsinn
{ // .. dann fährt linkes Rad "vorwärts"
// TCCR0A |= (1<<COM0A1); // Enable clear/set OC0A on Compare Match
PORTB |= (1<<PB0); // Setze 3A high
PORTD &= ~(1<<PD7); // Setze 4A low
mdir34 = 1;
}
// ============================================================================== =
void Mlinkszur (void) // Mot3,4 dreht im Uhrzeigersinn = neg. math.
{ // .. dann fährt linkes Rad "rückwärts"
// TCCR0A |= (1<<COM0A1); // Enable clear/set OC0A on Compare Match
PORTB &= ~(1<<PB0); // Setze 3A low
PORTD |= (1<<PD7); // Setze 4A high
mdir34 = -1; //
} //
// ============================================================================== =
void Mlinksstop (void) // Motor 34 aus
{ //
// TCCR0A &= ~(1<<COM0A1); // Disable clear/set OC0A on Compare Match
OCR0A = 0; // PWM-Wert Mot34 auf Null setzen
PORTB &= ~(1<<PB0); // Setze 3A low
PORTD &= ~(1<<PD7); // Setze 4A low
} //
// ============================================================================== =
Ach so - kleine Erklärung:
uz ... Uhrzeigersinn - auf Motor-Abtriebswelle gesehen
Guz ... Gegenuhrzeigersinn = math. positiver Drehsinn
1,2 ... Motor eins, Anschlüsse 1,2
3,4 ... Motor "zwei", Anschlüsse 3,4
Lesezeichen