- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 19

Thema: 4 WD Fahzeug

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Ok, hier also der Ansatz in Bascom. Basis ist die klassische Ansteuerung in C aus dem RN-W iki, das Beispiel ist für einen 8MHz-Mega8:

    Code:
    $regfile = "m8def.dat"                  ' asuro mit Mega8
    $crystal = 8000000                      ' taktet mit 8MHz
    
    Config Timer0 = Timer , Prescale = 1    ' 100kHz für Servos
    Timer0 = 256 - 80
    On Ovf0 Isr_timer0_ovl
    Enable Ovf0
    Enable Interrupts
    
    Do
    Loop
    End
    
    Isr_timer0_ovl:
       Timer0 = 256 - 80
    
       If Servocount > Servo1 Then Portb.1 = 0 Else Portb.1 = 1
       'If Servocount > Servo2 Then Portb.2 = 0 Else Portb.2 = 1
       'If Servocount > Servo3 Then Portb.4 = 0 Else Portb.4 = 1
       If Servocount < 2000 Then Incr Servocount Else Servocount = 1
       If Delay_10us > 0 Then Decr Delay_10us
    Return
    Wie funktioniert das? Bei jedem Timerüberlauf wird die ISR aufgerufen und in dieser die Anzahl der Aufrufe in Servocount mitgezählt. Wenn die Anzahl der Dauer von 20ms entspricht wird der Zähler auf eins zurückgesetzt. Das entspricht der Wiederholrate eines Servosignals.

    Die Impulslänge für das Servo wird nun ebenfalls in diesen Überlauf-Zeiteinheiten angegeben. Der Zählerstand wird bei jedem Aufruf der ISR mit der Impulslänge verglichen und der Ausgang während des Impulses gesetzt und nach dem Impuls gelöscht. Ein kleines Rechenbeispiel für 8MHz und Prescaler=0:

    Timertakt 8MHz, Vorladung des TCNT-Register ist 256-80, es wird nach 8MHz/80Timertakte bis zum Überlauf der Interrupt ausgelöst. Die ISR wird so alle 0,00001sek aufgerufen (100kHz). Nach 100 Aufrufen ist eine Millisekunde vergangen, nach 2000 Aufrufen sind es 20ms.

    Jetzt muss man dies eigentlich nur noch an die vorgegeben Motoren-PWMs anhängen und die Zählerwerte an die geringere Auflösung des Timers anpassen. Z.B. für einen 16MHz-Kontroller mit 8bit PWM und Prescaler /8: 16000000/256/8 ergibt eine PWM-Frequenz von 7812,5Hz (wird schön pfeifen) und ein Interruptabstand von 1sek/7812,5 oder 0,000128sek. Ein Servosignalzyklus dauert dann 0,02sek/0,000128sek oder 156 ISR-Aufrufe. Oje, eine Millisekunde dauert dann 8 Aufrufe, deutlich geringe Auflösung.

    Naja, sollte ja nur ein Beispiel sein. Für eine höhere Auflösung muss man die PWM-Frequenz erhöhen (kein Prescaler und mehr als 8 Bit -> Timer1).

    Ist es nötig die Antriebe einer Seite getrennt anzusteuern?

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    66
    Beiträge
    358
    @Radbruch
    Erstmal Danke für deine ausführliche Antwort !
    Zwei kleine Fragen hätte ich aber noch:
    1. Ovf0 -- Ist das die Standartmässige Variable für das Timer0 Überlauf Register ?
    2. Enable Ovf0 -- Muss ich das extra Enablen oder ist das automatisch in Betrieb wenn ich Enable Timer0 benutze ?

    Zur Zeit benutze ich für jeden einzelnen Moter ein separates PWM Signal und kann die auch per software verändern.
    So dass ich die Drehzahl jedes Motors einzeln einstellen kann. Anschliessend speicher ich diese Werte im EEprom und nutze diese Werte dann zum Fahren.
    Die Motore laufen aber eigentlich so synchron, dass man fast darauf verzichten kann.
    Nur einer dreht bei voller Ansteuerung etwas schneller als alle anderen.

    Den Rest deines Beispiels habe ich wohl verstanden, falls nicht werde ich nochmal nachhaken.

    Nur werde ich wohl dieses WOE nicht weiter machen können. Ist ja schon wieder 4. Advent

    Gruss

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    "Ovf0" bezeichnet den Overflow-Interrupt von Timer0. Vermutlich bewirken "Enable Ovf0" und "Enable Timer0" dasselbe. Da ich aber eher selten in Bascom programmiere verwende ich hier die eindeutige Variante.

    Konsequent bin ich dabei aber offensichtlich nicht: Timer0 = 256 - 80. Hier ist mit Timer0 das TCNT-Register des Timers gemeint. Zudem schlummert hier auch noch ein kleiner Bug. Die Zähltakte zwischen dem Überlauf und dem Laden des Registers werden unterschlagen.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    66
    Beiträge
    358
    @radbruch
    Da ich festgestellt habe, daß 3 Motore exakt die gleiche Drehzahl bei entsprechenden PWM Werten haben, werde ich das Programm entsprechend ändern!
    Dadurch habe ich dann einen Timer für die Servos frei.
    Kann dann den Servo Befehl in Bascom nutzen, der ist auch viel einfacher zu handhaben als die IRQ Routine mit all den komplizierten Berechnungen.
    Bestimmt aber auch viel ungenauer als Radbruchs Variante.
    Für meine Zwecke aber allemal ausreichend

    Brauche dann kein komplett neues Programm schreiben, sondern nur ein paar Änderungen vornehmen.

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    66
    Beiträge
    358
    Hallo !

    Habe mich nun doch dazu entschlossen, radbruchs Variante zu nehmen.
    Erschien mir viel besser, da ich dadurch weiterhin die Motore mit 4 unterschiedlichen PWM Frequenzen steuern kann (Gleichlauf).
    Die Kamerahalterung ist nun fertig und die Servoansteuerung klappt tadellos.
    War eigentlich einfacher als ich dachte und funktionierte auf Anhieb.
    Nochmal Danke an radbruch für seine Bemühungen !
    Wenn irgenwann endlich die Kamera kommt, gibts neue Bilder, evtl. ein Video !

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Immer prima, wenn es auch noch auf Abhieb funktioniert. Könntest du jetzt noch zeigen, wie du es umgesetzt hast? Oder kommt das noch:
    http://www.sensobot.de/index.php?opt...id=6&Itemid=11

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.12.2008
    Ort
    Essen
    Alter
    66
    Beiträge
    358
    @radbruch

    Möchtest Du das komplette Programm sehen oder nur den Teil für die Servos?

    Roland
    Robotik & Arduino Homepage
    http://www.ardumega.de

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test