Forum: Mikrocontroller und Digitale Elektronik DutyCycle bei variabler Frequenz auswerten (AVR, C)


von Freakster235 (Gast)


Lesenswert?

Hallo Community,

Thread mit Informationen zum Stromwandler und verschaltung:
Beitrag "Abfragen von mehreren Stromwandlern (PWM, DutyCycle)"

Ich habe an einen ATMega644 mit 14.7456 Mhz mehrere Stromwandler ueber 
einen analogschalter CD4067 am ICP pin den Atmega angeschlossen.

Nun frage ich mich wie ich das ganze am einfachsten und 
resourcensparendesten Auswerten kann. Die Stromwandler haben 
normalerweise eine PWM Frequenz von 125Hz, allerdings schwankt die 
Frequenz im Bereich von 120-130Hz.
Damit ich nun den DutyCycle errechnen kann muss ich quasi mit den 
Interrupt Capture Mode auf beide Flanken triggern, und immer einen Cycle 
als ganzes aufzeichnen um quasi meine 100% zu haben und davon dann den 
DutyCycle errechnen zu koennen, soweit richtig?

Nun die andere Frage, wenn ich den Timer1 16Bit ohne Prescaler laufen 
lasse wird er mit ja zwangslaeufig ein oder mehrmal ueberlaufen, dass 
muesste ich ja auch mit verrechnen, um eine moeglichst hohe Aufloesung 
zu bekommen?

Und dann noch der Punkt, die PWM scheint etwas zu schwanken auch bei 
konstanten Stromwert, sieht zumindest auf den OSZI so aus, aber mit 
einer 4er Mittelwertbildung siehts dann ganz gut aus. Kann ich fuer 
diese Mittelwertbildung einfach den NoiseCancleer des AVR verwenden oder 
muss ich das in Software loesen?

Wie das ganze theoretisch aussehen soll ist mir durchaus klar, aber wie 
ich das moeglichst effizient umsetzen kann weiss ich nicht, weil 
wahrscheinlich das Rechnen mit einer 16Bit zahl auf den Atmega nicht 
grad sparsam ist oder?

Vielen Dank fuer eure Unterstuetzung.

Freakster235

von Karl H. (kbuchegg)


Lesenswert?

Freakster235 schrieb:

> Damit ich nun den DutyCycle errechnen kann muss ich quasi mit den
> Interrupt Capture Mode auf beide Flanken triggern, und immer einen Cycle
> als ganzes aufzeichnen um quasi meine 100% zu haben und davon dann den
> DutyCycle errechnen zu koennen, soweit richtig?

Im Prinzip: ja.
Du stellst die Dauer das Low-Pegels fest, du stellst die Dauer des 
High-Pegels und fest, und die Summe davon ist dann die Periodendauer. 
Der Duty-Cycle ist dann ja nichts anderes als das Verhälnis von 
High_pegel zur Periodendauer.

> Nun die andere Frage, wenn ich den Timer1 16Bit ohne Prescaler laufen
> lasse wird er mit ja zwangslaeufig ein oder mehrmal ueberlaufen, dass
> muesste ich ja auch mit verrechnen, um eine moeglichst hohe Aufloesung
> zu bekommen?

möglichst hohe Auflösung ist eine Sache.
möglichst hohe SINNVOLLE Auflösung ist eine ganz andere Sache.

Wie genau ist denn dein Stromwandler?
Wie sinnvoll ist es denn, wenn du auch noch die 8-te Nachkommastelle 
berechnest?

> Und dann noch der Punkt, die PWM scheint etwas zu schwanken auch bei
> konstanten Stromwert, sieht zumindest auf den OSZI so aus, aber mit
> einer 4er Mittelwertbildung siehts dann ganz gut aus. Kann ich fuer
> diese Mittelwertbildung einfach den NoiseCancleer des AVR verwenden oder
> muss ich das in Software loesen?

Das musst du in Software machen.

Allerdings: die genau Frequenz interessiert dich doch eigentlich gar 
nicht. Dich interessiert doch nur das Verhätlnis von High-Pegel zur 
Periodendauer. Beides bestimmst du, in dem du die Pegel ausmisst. Wenn 
wir davon ausgehen, dass sich während einer einzigen PWM der Duty-Cycle 
nicht wesentlich ändern wird, dann ist es eigentlich egal, ob die 
PWM-frequenz ein wenig schwankt. Denn wichtig ist ja nur das Verhältnis 
von High zu Low.

> wahrscheinlich das Rechnen mit einer 16Bit zahl auf den Atmega nicht
> grad sparsam ist oder?

16 Bit ist noch kein großes Problem.

von Freakster235 (Gast)


Lesenswert?

Hallo Karl Heinz,

also die moegliche Aufloesung meiner Stromwandler ist hoechstens eine 
veraenderung des DutyCycles um 0.01ms, dass ist aber dann das ausserste 
was ich.
Laut Datenblatt liefert er sogar nur eine Veraenderung von 0.1ms.

Also duefte es rein von der Aufloesung her ja kein problem sein und ich 
kann den Timer1 sogar mit Prescaler laufen lassen, oder?

Ja genau, die Frequenz interessiert mich ueberhaupt nicht, ich will nur 
das Verhaeltnis von high zu low und daraus dann evtl. das mittel bilden 
wenn es zu unruhig ist, was es auf dem Oszi auch ist.

Wie kann ich denn am einfachsten einen Mittelwert bilden auf den AVR, 
ich hab hier im Forum mal ein Bespiel gesehen da wurden bits geshiftet 
fuer mittelwert, nur war mir nicht wirklich klar wie das mit den shiften 
funktionieren soll, also zur mittelwertbildung.

Vielen Dank

von Falk B. (falk)


Lesenswert?

@ Freakster235 (Gast)

>Wie kann ich denn am einfachsten einen Mittelwert bilden auf den AVR,

So wie immer. Einfach mehrere Messwerte addieren und duch Anzahl der 
Messwerte teilen. Dabei darf kein Überlauf auftreten, also große (16/32) 
Bit Variablen nutzen.

von Axel S. (a-za-z0-9)


Lesenswert?

Freakster235 schrieb:

> also die moegliche Aufloesung meiner Stromwandler ist hoechstens eine
> veraenderung des DutyCycles um 0.01ms, dass ist aber dann das ausserste
> was ich.
> Laut Datenblatt liefert er sogar nur eine Veraenderung von 0.1ms.

Was für ein Glück, daß die Einheit des duty cycle bzw. - warum reden wir 
eigentlich nicht deutsch? - Tastverhältnisses gar nicht Millisekunden 
sind.

Aber sei es drum. Bei 125Hz nominaler Wiederholfrequenz haben wir eine 
Periodendauer von 8ms. Deine 10µs sind dann 1/800 davon. Oder knapp 10 
Bit Auflösung (0.1ms bzw 80:1 wären gar nur 6.3 Bit).

> Also duefte es rein von der Aufloesung her ja kein problem sein und ich
> kann den Timer1 sogar mit Prescaler laufen lassen, oder?

Der Timer sollte zwischen zwei fallenden Flanken mindestens 10 Bit 
durchlaufen. Oder anders ausgedrückt: die Differenz der Capture-Werte 
zwischen zwei fallenden Flanken muß mindestens 800 sein. Sonst 
verschenkst du Genauigkeit. Zwischen 800 und den maximal möglichen 65536 
für einen 16-Bit Timer sollte irgendein passender Prescaler-Wert zu 
finden sein. So lange die Wiederholfrequenz des Sensors größer ist als 
die Überlauffrequenz des Timers kannst du dann ganz bequem mit 16-bit 
unsigned Arithmetik arbeiten.

Da die Information im Tastverhältnis steckt, ist die genaue Zahl 
irrelevant. Eine Mittelung würde am besten über den Quotienten erfolgen.


XL

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.