Ich habe mehrere Sensoren mit PWM Ausgang, die ich mit dem Mega32
verarbeiten will. Wie kann man das am Besten machen und wieviele solcher
Sensoren sind max. anschließbar. Der Wert des Sensors ist das PWM
Verhältnis.
Falls Beispiele genannt werden, möglichst in Assembler.
mfg
Quehl
Wenn deine Sensoren mit PWM ausgängen arbeiten, dann schliess sie
am ADC des ATM32 an,..
7 Ports, (ausser bei differentieller)
beispiele findest du in C und ASM im datasheet von ATmel
www.atmel.com
grüüüüße
Hi,
@Kai: da sagt das Datenblatt aber etwas anderes:
- 8 single ended channels
- 7 differential channels (TQFP only)
- 2 differential channels with gain (1x, 10x, 200x)
Und ich würde lieber versuchen, das ganze über die capture funktion des
timers zu realisieren. Also bei steigender/fallender Flanke einen
Interrupt generieren und die entsprechenden Timerwerte ermitteln. Die
Zeitabstände kann man dann in das PWM Verhältnis umrechnen.
Gruß
Fred
Es kommt (wie immer) auf die Details an. Der Umweg über Tiefpass und ADC
ist prinzipiell eine gute Lösung, aber nicht immer die beste.
Capture ist die beste Lösung, die AVRs (zumindest die mir näher
bekannten) haben aber nur einen Hardware-Capture-Kanal.
Nun kommt es auf die Frequenz der PWM-Signale an. Ist sie langsam genug,
kann man die Eingänge pollen und auf Änderung prüfen (mehrkanaliges
Software-Capture).
Es lohnt sich auch, darüber nachzudenken, ob man nicht einen AVR mit
Pinchange-Interrupt benutzt, da lässt sich Software-Capture einfacher
realisieren.
Also, nenne die zu erwartenden Frequenzen, dann sehen wir weiter...
...
...oder man schaltet mit ein paar Port-Pins einen Muxer und legt so die
zu messenden Eingänge der Reihe nach an den Capture-Eingang zum Messen.
Dauert dann aber halt immer min. 2 Taktperioden (eine während der
(asynchron) umgeschaltet wird, die nächste kann man dann messen).
oder man sucht sich eine µC aus, der die entsprechenden Anzahl an
Capture Kanälen hat.
Man sollte dochmal darüber nachdenken ob der Mega32 dann für DIESE
Anwendung der richtige µC ist.
Ralph wrote:
> Und zu Assembler:>> Wer Assembler zu mehr als direkten Registerzugriffe nutzt, ist ein> Masochist.
Wie kommst Du zu dieser (diskriminierenden) Aussage?
Ich nutze auch Assembler zum Programmieren von AVRs.
...
@ Fred:
ja ne sry,
meinte 8ports,
zu den sogenannten 7 differentiellen:
man kann ADC0..6 nur differentiell zu ADC0..2 also 3 ports messen,
womit man bei
>>NUR 3 'wirkliche' differnentielle kanäle hat,
nimmt man differentiell nur ein externe refferenzspannung
an port ADC1 kann man effektiv 7 spannungen differentiell messen.
und natürlich wenn
8 kanäle...
aber ein frage stellt sich noch:
>>Wie groß ist die ausgangsauflösung deiner sensoren ,10mV?
den der ATMega32 hat nur ein 10bittigen ADC.
grüüüüße
also PWM ist digital und darum nicht an den Analogeingängen zu
gebrauchen, sonst bitte mehr Informationen.
Zeitdauer hatte ich mal was mit 300ms gelesen. Aktuell müßte ich das
noch nachsehen. Das captureregister fiel mir zwar auch ein, nur gibt es
dafür nur einen Eingang. Kann man vielleicht die Int. Eingänge benutzen,
sind immerhin 3 Eingänge mit Captureeingang 4 Eingänge. Da müßte man
doch im Interupt Zweig nur den Timer1 Stand auslesen und sichern.
Kleines Problem ist, wenn die Interrupts gleichzeitig auftreten. Bleibt
die Interruptanforderung solange bestehen, bis der aktuelle Interrupt
abgearbeitet ist? Dann hätte ich eine kleine Ungenauigkeit drin, die
aber evtl. akzeptiert werden könnte, wenn die Int.abarbeitung kurz
gehalten wird.
Pollen ist nicht ganz so gut, weil durch bedingte Jumps unterschiedl.
Laufzeiten entstehen und die Programme recht groß werden sollen. Nicht
nur Tests sondern auch Anwendung.
Welcher AVR hat Pinchange Interrupt? Verwenden will ich nur DIP Gehäuse.
mfg
Quehl
Also bei 300ms Periodendauer schafft das der AVR mit Software-Capture
mit links uns 40 Fieber...
Ich würde die Eingänge (einen Port für 8 Signale, bei Bedarf einen
weiteren Port für weitere 8 Signale) im Timer-Interrupt abfragen. Mit
der modifizierten PeDa-Tastenabfrage (Entprellung raus, dafür beide
Flanken auswerten) ist das mit wenigen Takten in der Timer-ISR getan.
Das Hauptprogramm wertet dann die Flanken-Flags aus und liest den
(Software-) Zähler ab, den die Timer-ISR hochzählt.
Der (beim Pollen) von Dir befürchtete Jitter durch unterschiedliche
Programmlaufzeiten tritt nicht auf, das Pollen erfolgt im
Timer-Interrupt mit einem von Dir frei bestimmbaren Zeitraster.
Da das Programm vermutlich noch etwas mehr tun soll, muss man sehen, wie
man die restlichen Jobs mit der Timer-ISR verzahnt.
PCI findest Du z.B. bei der Mega[4/8/16]8-Serie (DIL28). Das ist bei der
langsamen Signalfrequenz aber nicht nötig.
Betreffs ADC: Jedes PWM-Signal lässt sich mit einem Tiefpass zu einem
Analogsignal wandeln und dann mit ADC messen. Ob das sinnvoll ist,
entscheidet der Einzelfall. Signale mit Periodendauer über 10ms (unter
100Hz) würde ich durch Tastgradmessung (Zeitmessung, Software-Capture)
auswerten.
...
danke, das hört sich ganz gut an. Meine Gedanken waren von den Flanken
als genaueste Möglichkeit vernebelt. Und weil das so in den
Datenblättern steht.
PCI sind doch die Interruptpins? Die gibt es beim Mega32 auch. da sogar
3 Pins und beim Mega8 nur 2 Pins. Sonst hab ich beim Mega8 nichts
darüber gefunden.
Je nach Anforderung werde ich mal beides im Auge behalten.
mfg
Quehl
PCI: Ich sprach nicht vom Mega8 sondern vom Mega48, Mega88 und Mega168.
Schau mal in dessen Datenblatt. Externer Interrupt und PCI sind
Zweierlei.
Bei Deinem Tempo (unter 100Hz) fährts Du aber mit Scann im
Timer-Interrupt bedeutend ressourcenschonender. Außerdem kannst Du einen
Software-Zähler nehmen, dessen Zähltakt Du mit einem Timer Deinen
Wünschen anpassen kannst. Dies kann (falls alle Sensoren mit halbwegs
gleicher Frequenz "klappern") Divisionen einsparen, die beim AVR recht
ressourcenfressend sind.
...