-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: RC Summensignal Atmega8

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356

    RC Summensignal Atmega8

    Anzeige

    Hallo, ich habe folgendes Problem:
    Ich möchte mit dem Atmega ein RC Summensignal generieren.
    Die Auflösung sollte mindestens 200 Schritte sein.
    Die wertvorgabe soll über RS232 vom pc kommen.
    Kanalanzahl ist ja eigentlich egal, aber es müssen mindestens 4 sein.

    So nun das, was es zu einem Problem macht:
    Ich habe nur einen Myavr MKII zur verfügung, und der läuft nur mit 3,6468 MHz
    Ich vermute mal, das das ziemlich kanpp wird oder ?
    Ich hab mir schonmal von dem rntool dafür die zeiten für die timer ausrechnen lassen, sowie das beispiel im Wiki angekuckt.
    kann mir vieleicht einer einbeispiel geben wie ich das regeln kann ?
    Hab nicht wirklich ahnung von Bascom und microcontrollern, aber eine fertige lösung, die das summensignal ausspuckt hab ich nicht gefunden.
    DAS RS232 Protokoll soll so aufgebaut sein:
    #S als startmarkierung und dann die werte der einzelnen kanäle als bytes.

    Ne fertiglösung wär mir am liebsten, aber das kann ich hier nicht erwarten oder ?

    MFG Thalhammer

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    Ne fertige Lösung habe ich jetzt nicht parat. Und ich weiß auch nicht ob mein erster Gedanke brauchbar ist oder total ineffizient aber ich probiere es trotzdem und lasse mich gerne korrigieren:

    Ich würde einen Timer mit Compare-Interrupt initialisieren. den ersten Interrupt gleich bei 0 oder 1 auslösen lassen -> Pin auf High, den Wert für den ersten Kanal auf die Timerlaufzeit umrechnen und den Timer bei diesem Wert den nächsten Interrupt auslösen lassen. Bei diesem dann entsprechend den Pin auf Low und neuen Interruptwert festlegen. Das ganze Spiel dann so oft wiederholen lassen bis die gewünschte Anzahl an Kanälen entstanden ist.
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    Also hab jetzt ein bischen mit den timerwerten gespielt und nach gerechnet.
    bei dem 16 Bit timer und einem prescaler von 1 währe 0,1 ms ungefär ein timer wert von 369.
    heist: um die werte die vom pc kommen(1 -200) in timer werte umzurechenen währe folgende gleichung nötig:
    1 : pc_wert * 3690 = Timerwert für den impuls
    oder irre ich mich da ?
    heist um die zeit bis zum nächsten interupt einzustellen müsste ich doch nur den timer auf den maximalwert des timers minus diesen wert setzen oder ?
    Ich hab noch nicht viel mit timern gearbeitet, von daher weis ich nicht wie genau man sowas realisieren kann.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    Dein Timer macht bei einem Prozessortakt von 3,6468 MHz und einem Prescaler von 1 entsprechend 3,6468*10^6 Schritte pro Sekunde. Bei einer Periodendauer von 20ms pro Kanal macht der Timer (3,6468*10^6)/50=72936 Schritte. Ein 16bit-Timer läuft bei 2^16-1=65535 (man fängt bei 0 an zu zählen) über. Du musst also einen Vorteiler wählen, damit dein Timer innerhalb von 20ms diesen Wert nicht überschreitet. (3,6468*10^6)/65535 = 55,6 also brauchst du einen Prescaler von 64.

    Damit macht dein Timer in den 20ms Periodendauer, die ein RC-Kanal hat, (3.6468*10^6)/64 = 56981 Schritte. Ein Servosignal ist im Normalfall 1ms (Stellung ganz links) bis 2ms (Stellung ganz rechts) HIGH (man kann den Verfahrweg durch entsprechend kleinere bzw. größere Werte noch aufbohren, das müsstest du dann ausprobieren was du brauchst).

    Wenn du den Verfahrweg jetzt noch in 200 Schritten auflösen möchtest unterteilst du die "High-Zeit" für jeden Kanal in 1ms/200Schritte = 0,005 ms/Schritt. Damit ergibt sich für jeden Schritt Auflösung eine Timerlaufzeit von rund 14,25 Schritten.

    ACHTUNG: In meinen Ausführungen bitte nicht die Schritte, die der Timer macht mit den Schritten deiner Auflösung verwechseln/durcheinander bringen.
    Geändert von Arkon (10.08.2011 um 16:42 Uhr)
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    Also ich hab mal meinen code angehangen.
    nur irgendwie funktionierd der nicht
    Der servo macht nicht, und der Controller giebt komischerweise auch nichts über den RS232 aus.
    Angehängte Dateien Angehängte Dateien

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    Wie gesagt habe ich von Bascom keine Ahnung. Da du aber fleißig kommentierst und man sich ja ein paar Sachen ableiten kann versuch ich mal etwas zu dem Code beizutragen:

    Prescale = 1
    Wie oben berechnet musst du den Prescaler auf mindestens 64 setzen, da der Timer sonst zu schnell arbeitet und überläuft bevor die 20ms Periodendauer vom RC-Signal rum ist. Außerdem weiß ich nicht, ob du in Bascom den Interrupt definieren musst. Ein Timer kann wie gesagt bei verschiedenen Einflüssen einen Interrupt. Wir benötigen den "Clear Timer on Compare match" (CTC) wobei man einstellen kann, ob beim treffen des eingestellten Wertes (Compare-Wert) der Timer genullt werden oder weiter laufen soll. Bei meiner Idee müsste der Timer weiterlaufen.

    In deiner Interruptroutine steht der Befehl Timer1=64428. Ich gehe mal davon aus, dass du damit versucht den neuen Wert festzulegen, bei dem der Timer einen Interrupt auslöst. Einen solchen Befehl finde ich aber nicht während der Initialisierung. Dem Tmer würde also ein Wert fehlen bei welchem er den ersten Interrupt auslöst.

    Ausserdem hast du unter
    If Phase = 3 Then
    den Befehl Phase = 3. Da sollte bestimmt =4 stehen damit er in die letzen Phase springt.

    Zudem sieht mir die ganze Interruptroutine nicht so aus, als würde es ein verlässliches Servosignal erzeugen.
    Geändert von Arkon (11.08.2011 um 08:46 Uhr)
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    Nein du denkst falsch, ich will ja das der timer überläuft, den dann wird die rutine ausgeführt,
    Der Befehl Timer1=64482 oder wie auch immer sorgt dafür, das der timer schon eher überläuft.
    Der Code den ich angehangen habe ist nur für 1 servo,
    in Phase 1 wird der timer so vorgladen, dass 0,3ms Pause entstehen, ind Phase 2 so, das die zeit, die das Servosignal braucht entsteht, und in Phase 3 wieder 0,3ms pause.
    in Phase 4 wird dann der Start geschrieben.

    Daraus das du dich mit Bascom nicht auskennst schliese ich mal, das du C programmierst.
    Wie würdest du es denn dort lösen ?
    Schlieslich Programmiere ich auf dem PC auch C++.

    MFG Thalhammer

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    So, ich hab jetzt bischen weiter gesucht, und das:
    http://www.mitchsoft.de/Modelbau/PPM-Encoder/index.html
    sowie das gefunden:
    http://www.ulrichradig.de/home/index.php/avr/avr_-_rc

    Das erste würde sogar eine Steuerung über RS232 zulassen, Problem: die arbeiten alle mit 8Mhz, was die sache enorm vereinfacht.
    Nur die hab ich leider nicht.

    MFG Thalhammer

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    Was mir grade einfällt: Kann der Atmega kein PWM-Signal erzeugen? Also ich meine mal ein Programm geflasht zu haben, bei dem ich nur die Periodendauer und die HIGH-Zeit definieren musste. Damit habe ich ein einzelnes Servo angesteuert. Das kann man bestimmt anpassen um ein Summensignal zu erzeugen. Ich muss grade mal einkaufen und gucke dann ob ich was entsprechendes finde.
    Alles ist möglich. Unmögliches dauert nur etwas länger!

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.04.2008
    Alter
    32
    Beiträge
    563
    http://www.mikrocontroller.net/topic/177721
    Ist zwar C-Code aber damit hast du zumindest einen Ansatz.

    Timer1 kann intern ein PWM-Signal erzeugen. In dem Beitrag geht es darum ein Servo anzusteuern. Ich weiß nicht wie du das Summensignal weiterverwenden möchtest. Servos sind, was die Periodendauer angeht, sehr kulant. Wenn du das PWM jetzt mit einer Periodendauer von 5ms (20ms/4Kanäle) initialisierst und nach jedem HIGH-Pegel das OCR1A-Register mit dem neuen Wert für den jeweiligen Kanal beschreibst hast du dein Summensignal.

    OCR1A
    Alles ist möglich. Unmögliches dauert nur etwas länger!

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. 12 Kanal Summensignal
    Von MiniMax im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 19.12.2010, 14:08
  2. Summensignal Empfänger
    Von Bongo1st im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 10.11.2010, 20:43
  3. RC Summensignal erzeugen
    Von YaNnIk im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 25.02.2010, 17:44
  4. Welche Timerwerte bei Summensignal?
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 01.09.2009, 22:34
  5. Summensignal bei RC-Empfänger
    Von robotfreak im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 05.08.2007, 22:53

Berechtigungen

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