Anmerkung... hat sich mit Radbruchs Post überschnitten...
Eigentlich recht wenig. Von unten hoch... stell dir vor, irgendwo im RP6 (Prozessor) gibts einen Taktgenerator den man VOReinstellen kann... das passiert indem auf das Register TCCR1A geschrieben wird. Damit der Zähler weis wie weit er zählen soll, beschreibt man die Register OCR1BL und OCR1AL wobei das Einfluß auf die Energiemenge der Motoren hat. 0 heisst Motor hat kein Strom bzw. 0%, 210 ist Vollgas und 100%... bei 2 Ketten bzw. 2 Motoren (OCR1BL=links und OCR1AL=rechts) kann man also je Kette getrennt die angelegte Leistung kontrollieren. Da der Wert von 210 nicht überschritten werden sollte ( hängt u.a. mit dem Teilerfaktor zusammen ), werden die Werte zwischengespeichert und geprüft bzw. auf max=210 gesetzt.
Jetzt von oben nach unten...
Die Funktion bekommt die Speed für beide Motoren übergeben, prüft diese auf positive 210 max und setzt sie ggf. runter, zwischenspeichert das in eine externe Variable, schreibt beide Werte in die jeweiligen PWM Zählerregister OCR1xx und setzt PWM Modus, Vorteiler usw.
Die Funktion ist also quasi das Gaspedal für den RP6.
Würde man dort z.B. auch die Richtung setzen wollen.. was nicht mal so dumm wäre... würde man schreiben:
Code:
void setMotorPWM_spezial(uint8_t power_links, uint8_t power_rechts, uint8_t left_dir, uint8_t right_dir)
{
extern uint8_t mleft_ptmp, mright_ptmp;
if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;
mleft_dir = left_dir;
mright_dir = right_dir;
mleft_des_dir = left_dir;
mright_des_dir = right_dir;
OCR1BL = power_links;
OCR1AL = power_rechts;
if(left_dir)
PORTC |= DIR_L;
else
PORTC &= ~DIR_L;
if(right_dir)
PORTC |= DIR_R;
else
PORTC &= ~DIR_R;
if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
dann noch den Prototypen bauen... nen "extern" muss da glaub ich auch noch rein.. damit c nicht meckert.. und schon hast du eine Funktion die nicht nur Geschwindigkeit sondern auch die Richtung verarbeitet. Bei der Richtungsverarbeitung wird einfach nur festgelegt, an welchen der 4 möglichen Pins die Signale abgegeben werden soll wobei nur 2 aktiv sein dürfen. Nachteil ist, das man nun auch ständig die Richtung mitgeben muss und sie sollte sich nicht spontan ändern wenn das Getriebe läuft. Schaut man sich die anderen Motorfunktionen an (was ich Dir empfohlen hatte!!!), stellt man aber fest, das es sowas schon in der RP6lib gibt.
Da steht auch sehr deutlich: IT IS A BETTER IDEA NOT TO USE THIS FUNCTION AT ALL!
Man kann das ganze noch aufhübschen.. in dem man z.B. auf echte % umrechnet, negative Werte als rückwärts verarbeitet und damit die 2 extra Parameter spart... aber "zweckmäßig" reicht meist auch vollkommen und ist meist kürzer im Speicher.
Nun solltest du dich aber mal mit der Theorie und Praxis von PWM beschäftigen... dazu finden sich schöne Artikel im Wiki ebenso wie in der Docu vom Prozessor.
Gruß Rolf
Lesezeichen