-         

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

Thema: Atmega8 PWM Signal auslesen...

  1. #1

    Atmega8 PWM Signal auslesen...

    Anzeige

    Hallo,

    ich bin neu was den Atmega angeht. Z.zt arbeite ich mit
    dem AVR Board von Rowalt.

    Ich möchte gerne das Empfängersignal vom einem RC Empfänger auswerten.
    Sobald das PWM Signal <1,5ms ist soll ein Port auf high
    gesetzt werden.

    Könnt Ihr mir dazu einen Tip geben wie ich das PWM Signal am besten
    auswerten kann ?

    Dank im vorraus
    Gruß
    Derivat

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hi,

    ich arbeite auch grade an der Auswertung von RC-Kanälen, ich habe
    Dir mal ein paar Auszüge aus meinem Bascom-Programm beigefügt - das ganze Programm ist ellenlang und hat viele Inhalte, die nichts mit der RC-Auswertung zu tun haben.

    Manches ist sicher noch optimierungsfähig, aber die Sache funktioniert!

    Der RC-Kanal hängt an Portd.2, Portc hat LED´s von denen ich einige zur Statusanzeige nutze.

    Masse vom Empfänger und Testboard müssen natürlich verbunden sein.

    Wird der RC-Kanal abgesteckt, schlägt der Errorhandler zu...

    Ist aber kein vollständiges Programm, Variablendeklarationen etc. fehlen!

    Ich hoffe, es hilft Dir trotzdem weiter.

    Viele Grüße

    Torsten

    Code:
    'Timer 1 for RC-Channel measurement
    Config Timer1 = Timer , Prescale = 1
    '==========================================
    ' Interrupt Handlings
    '==========================================
    On Timer1 Read_error
    Enable Interrupts
    
    
    '==========================================
    ' Initializing Timers
    '==========================================
    
    Enable Timer1
    Stop Timer1
    Timer1 = 0
    
    '==========================================
    ' Main Program Loop
    '==========================================
    
    do
    'Jump to RC-channel subroutine
    Enable Interrupts
    Timer1 = 0
    Start Timer1
    Bitwait Pind.2 , Reset
    Stop Timer1
    Gosub Read_channel
    Disable Interrupts
    
    
    .....
    
    Hier der Rest des Programms...
    ...
    
    
    Loop
    
    
    'RC-channel reading
    Read_channel:
    Timer1 = 0
    Start Timer1
    Bitwait Pind.2 , Set
    Timer1 = 0
    Bitwait Pind.2 , Reset
    Stop Timer1
    Error = 0
    Toggle Portc.0
    Return
    
    'Error handler
    Read_error:
    Error = Error + 1
    Timer1 = 0
    While Error = 10
       Stop Timer1
       Portc.2 = 0
       Waitms 30
       Portc.2 = 1
       Waitms 200
    Wend
    
    Return

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Eine relativ einfache Möglichkeit wäre es, das PWM-Signal über einen Tiefpass (einfaches RC-Glied reicht) zu schicken. Du erhälst dann eine Gleichspannung, deren Spannung abhängig vom Tastgrad ist.
    Diese Gleichspannung kannst Du dann leicht mit einem ADC auswerten.

    Gruß,
    askazo

  4. #4
    Hi,

    danke für Eure promten Antworten.

    Ich denke der Weg über den Tiefpass ist der "einfachste" Weg
    für mich im Moment. Werde aber auch das Listing ausprobieren.

    Welche Kennwerte für R&C wäre da angebracht ?

    Gruß
    Derivat

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Moin Derivat,

    versuchs mal so:
    Code:
    *********************************
    * Impulslängenmessung an PINB.0 *
    * PORTB.1 zeigt < 1,5ms an      *
    * I/O beliebig anpassbar        *
    *********************************
    
     DDRB  = &B11111110
    
     Dim messen as Byte
    
     Do
    
      Pulsein messen, PINB, 0, 1
    
      if messen < 150 then
       PORTB.1 = 1
        ELSE
       PORTB.1 = 0
      End if  
    
     Loop
    
     End
    LG,
    Bruno

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    14.09.2005
    Alter
    61
    Beiträge
    77
    Zitat Zitat von askazo
    das PWM-Signal über einen Tiefpass (einfaches RC-Glied reicht) zu schicken. Du erhälst dann eine Gleichspannung, deren Spannung abhängig vom Tastgrad ist. Diese Gleichspannung kannst Du dann leicht mit einem ADC auswerten.
    Das Signal von einer Fernsteuerung hat ein Tastverhältnis vom 1ms bis 2 ms mit einer Frequenz von 50Hz. Mit einem Tiefpass wird das nicht klappen. Entweder ist deine Spannung Wellig, so daß du sie mit dem ADC nicht anständig auswerten kannst, oder sie ist zu Träge, so dass die Spannung den Veränderungen an der Fernsteuerung nachhingt.

    Ist natürlich abhängig was man machen will.

    Außerdem macht es keinen Sinn mit einem Tiefpassfilter wenn man einen Controller mit Timer zur verfügung hat, der das Tastverhältnis genau messen kann.


    Mit freundlichen Grüßen
    Guy

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Danke, Bruno!

    "Pulsein" - au Mann, so lernt man jeden Tag was dazu...

    Ich habe auch gleich etwas damit experimentiert, "Pulsein" liefert das Ergebnis der Messung wohl als Byte - allerdings läuft der Wert bei der Messung eines RC-Kanals (Graupner) nur von 45 bis 107 zwischen minimaler und maximaler Knüppelstellung der Funke, also grade mal 31 Steps für jede Richtung.
    Das ist für meine Anwendung um einiges zu grob, kann man die erreichbare Auflösung des Pulsein-Befehls irgendwie verbessern?

    Prozessor: Mega 8 auf 8Mhz, interner Takt.

    Viele Grüße

    Torsten

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    Zitat Zitat von Torsten_G
    Das ist für meine Anwendung um einiges zu grob, kann man die erreichbare Auflösung des Pulsein-Befehls irgendwie verbessern?
    Prozessor: Mega 8 auf 8Mhz, interner Takt.
    Moin Torsten,

    mhhh - irgendwas läuft da aber bei Dir falsch.
    Die Messung ist zwar abhängig von Deinem Prozessor-Takt, aber bei 8Mhz sollten nicht solche Werte bei Dir herauskommen!

    Wenn PULSEIN richtig kalibriert ist, ist die Messung sogar sehr genau.
    Beispiel (ich hoffe ich kriege jetzt keinen Ärger wegen Werbung..) -> in meinem Shop biete ich zum Einstellen meiner Fahrtregler ein kleines Tool an, dass die Impulsbreite der RC-Anlage von 0 bos 2,55ms misst und anzeigt.

    Guck Dir mal die Bilder an: http://www.heisszeit.de/shop/product.../ppm-plus.html.

    Dieses Tool arbeitet mit 10Mhz externem Quarz und ist äußerst genau - mit Pulsein
    Habe die Software wegen der Einfachheit lieber in Bascom erledigt.
    Kalibriert habe ich wie folgt -> habe mit einem 4MHz Quarz einen Oszillator gebaut und mit einigen Zählern runtergeteil - alles ohne MC. Im Endeffekt gibt mir das Gerät zwei Eichmarken - 1ms und 2ms (positive Impulse gemeint, 50% Duty).
    Wenn ich mein PPM-PLUS dort anschließe, steht die Anzeige wie angepinnt auf 1.00 oder eben 2.00 - das nenn ich genau.

    bei Dir kommt es mir so vor, als wenn Du zwar denkst, dass Du mit 8MHz arbeitest, aber es scheint mir, dass es nur 1MHz sind.
    Das würde Deine Werte erklären!

    Feinjustage kann man selbst machen, wenn man ein bisschen an der MCS.LIB rumspielt und in der Sektion PULSE_IN die Wartezeit verändert.
    Das geht super genau, denn Du kannst Feintuning mit NOP machen.

    Viele Grüße,
    Bruno

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    Zitat Zitat von Torsten_G
    Ich habe auch gleich etwas damit experimentiert, "Pulsein" liefert das Ergebnis der Messung wohl als Byte
    Nö, auch wenn das im Hilfebeispiel als Byte dimensioniert wird. Pulsein liefert ein Word:
    "On return XL + XH hold the 16 bit value".
    Insofern ist der Bytewert den Du liest, ein eher zufälliges Ergebnis .

    Viele Grüße
    Henrik

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hallo,

    Danke, Bruno und Henrik, wenn´s gar ein Wort ist, sind 31 Steps/Richtung tatsächlich eher mau... naja, ich werde mal ein wenig forschen, Versuch macht ja bekanntlich kluch...

    Wenn das klappt, könnte ich evtl. meinen Code deutlich kleiner bekommen!

    Meine Annahme mit dem Byte beruhte auf dem Bascom-Beispiel, war ein wenig irreführend...

    Aber wie es scheint, muss man sich das Wort dann aus XL und XH selbst zusammenstricken - ich muß mal schauen, was diese praktische Routine in dem Low- und Highbyte zur Verfügung stellt.

    Viele Grüße

    Torsten

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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