PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 PWM Signal auslesen...



derivat
28.11.2005, 11:49
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

Torsten_G
28.11.2005, 12:54
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



'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

askazo
28.11.2005, 13:23
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

derivat
28.11.2005, 14:46
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

DIYLAB
28.11.2005, 16:39
Moin Derivat,

versuchs mal so:


*********************************
* 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

Guy
29.11.2005, 12:03
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

Torsten_G
29.11.2005, 12:57
Danke, Bruno!

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

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

DIYLAB
29.11.2005, 18:57
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_info.php/products_id/6/cPath/1/rc-powertools/ppm-plus.html.

Dieses Tool arbeitet mit 10Mhz externem Quarz und ist äußerst genau - mit Pulsein O:)
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

hrei
29.11.2005, 19:31
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

Torsten_G
29.11.2005, 20:09
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... :mrgreen:

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

hrei
29.11.2005, 20:32
Hallo Torsten,



Danke, Bruno und Henrik, wenn´s gar ein Wort ist, sind 31 Steps/Richtung tatsächlich eher mau...


ich meinte eigentlich eher, daß Du wenn Du eine Bytevariable benutzt, Dir das MSByte flöten geht und Du nur den kümmerlichen Rest im LSByte auswertest/liest. Beim Nachdenken kommt mir das aber auch spansch vor. Eine Millisekunde hat ja nun mal "nur" 1000 Micosekunden, also solltest Du Du bei einem Raster von 10µS Einen Wert zwischen 100 und 200 ehalten. Liegt das Raster jedoch z.B. bei 5µS (wegen höheren Taktes), sprengt das schon den Rahmen eines Byte und Du würdest dann teilweise wirklich nur den kümmerlichen Rest auslesen.

Edit: Ne, das Word musst Du Dir nicht selbstricken. Einfach statt Byte Word dimensionieren.

Viele Grüße
Henrik

DIYLAB
29.11.2005, 20:33
Nö, auch wenn das im Hilfebeispiel als Byte dimensioniert wird. Pulsein liefert ein Word

Habe in meinem PPM-Proggi auch die Variable als Word deklariert O:)
Wobei ich gerade sehe, dass ich in anderen Projekten durchaus auch Byte verwende und es geht.

Hier nochmal ein Auszug ohne die Display-Ausgabe:


'************************************************* ******************************
'* PPM-PLUS 10MHz Quarz, B.Pisarek, V 1.01, 04. November 2005 *
'************************************************* ******************************


'================================================= ==============================
' Compiler Direktiven
'================================================= ==============================
$regfile = "attiny2313.dat"
$crystal = 10000000
$Lib "mcs_10mhz.lib"
'-------------------------------------------------------------------------------


'================================================= ==============================
' Variablen
'================================================= ==============================
Dim messen as Word
Dim summe as Word
Dim i as Byte
Dim stelle as Byte
Dim bcd_aus as Byte
Dim ausgang as Byte
Dim einer as Byte
Dim zehner as Byte
Dim hunderter as Byte
Dim zyklus as Byte
'-------------------------------------------------------------------------------


'================================================= ==============================
' Ein- und Ausgänge
'================================================= ==============================
Ddrb = &B11111111
Ddrd = &B11111110
Portd = &B00000001 'Pullup Widerstand an D0
'-------------------------------------------------------------------------------


'************************************************* ******************************
'* HAUPTPROGRAMM *
'************************************************* ******************************

Do

summe = 0

For i=1 To 16
Pulsein messen , Pind , 0 , 1
summe = summe + messen
Next i

Shift summe , Right , 4

'------
hunderter = summe / 100
hunderter = hunderter mod 10
zehner = summe / 10
zehner = zehner mod 10
einer = summe mod 10
'------

if err = 1 then goto nopulse

Loop
'-------------------------------------------------------------------------------


'===
End
'===


Noch mit drin die Aufdröselung der Stellen für die IRQ-Displayroutine und Mittelwertbildung der Messung aus 16 Einzelmessungen - wird dann schön ruhig die Anzeige.

LG,
Bruno

derivat
02.12.2005, 20:02
Hallo Bruno,

vielen Dank für den Code, es klappt prima...
Wenn ich nun noch weitere Eingänge und Ausgänge mit
anderen Steuerkanälen belegen möchte, wie müsste ich da
vor gehen.

Dank im vorraus
Gruß
Derivat