Forum: Mikrocontroller und Digitale Elektronik PWM Eingänge für ATMega32


von Quehl (Gast)


Lesenswert?

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

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

von Fred (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von Stefan W. (wswbln)


Lesenswert?

...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).

von Ralph (Gast)


Lesenswert?

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.

von Ralph (Gast)


Lesenswert?

Und zu Assembler:

Wer Assembler zu mehr als direkten Registerzugriffe nutzt, ist ein 
Masochist.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

@ 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

von Wolfram Q. (quehl)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von quehl (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.