Forum: Mikrocontroller und Digitale Elektronik Taktgeber mit variablem Tastverhältnis


von Patrick M. (pattex66)


Lesenswert?

Hallo,

als absoluter Neuling auf dem Gebiet der AVR Programmierung stehe ich 
vor der Aufgabe einen Taktgeber mit variablem Tastverhältnis zu 
erstellen bei dem sich das Tastverhälnis innerhalb von 30 Sek. von 25% 
HIGH/75% LOW zu 75% High/25% LOW ändert und dann so bleibt. Die Frequenz 
bleibt bei konstant 220 Hz. Hat jemand eine Idee wie ich da rangehen 
könnte?

VG Patrick

von Peter II (Gast)


Lesenswert?

Patrick Müller schrieb:
> Hat jemand eine Idee wie ich da rangehen
> könnte?

dafür bietet sich doch der PWM mode des Timers an.

von Patrick M. (pattex66)


Lesenswert?

Wie schon gesagt, ich bin Neuling. Ich dachte ja erst an Timer und 
Loop´s aber das ist Asche.
Gibts das vielleicht schon einigermaßen fertigen Code den ich nur bissl 
umstricken brauche und vielleicht gleich in einen ATTiny13 passt?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Patrick Müller schrieb:
> Ich dachte ja erst an Timer und Loop´s aber das ist Asche.

Was ist daran Asche? Du mußt nur warten, bis der Timer einen Überlauf 
macht und kannst dann neu über das Tastverhältnis befinden. Das ist 
alles.

von Peter II (Gast)


Lesenswert?

Patrick Müller schrieb:
> Gibts das vielleicht schon einigermaßen fertigen Code den ich nur bissl
> umstricken brauche und vielleicht gleich in einen ATTiny13 passt?

Warum muss es immer schon alles Fertig sein? Programmieren ist nicht das 
gleiche wie copy&paste.

Nimm die das Datenblatt, das steht alles zu den Timern drin. Das ganze 
sind dann nur ein paar Zeilen Code.

von Patrick M. (pattex66)


Lesenswert?

...aber wie viele Zeilen Code sollen das werden wenn ich nach jedem 
Zyklus die Werte neu definieren will?
Von 25/75 zu 75/25 sind es ja doch schon einige Zwischenwerte wenn es 
"gleichmäßig" werden soll. Ich hoffte das es irgendwas gibt was schön 
"smooth´t" und dann dort bleibt.

von Wolfgang (Gast)


Lesenswert?

Patrick Müller schrieb:
> ...aber wie viele Zeilen Code sollen das werden wenn ich nach jedem
> Zyklus die Werte neu definieren will?

Der Timer kann das Tastverhältnis sowieso nur schrittweise erhöhen (und 
nicht kontinuierlich). Bei 30s Flankendauer braucht der Timer mit seinen 
220Hz genau 6600 Durchläufe. Ein 8-Bit Timer müßte also alle 51.5 
Durchläufe den Umschaltpunkt ändern, ein 16-Bit Timer müßte bei jedem 
Durchlauf den Umschaltpunkt um 5 verändern.
Bei Formulierung in einer Schleife werden das wohl etwa 10 Zeilen zzgl. 
Initialisierung des Timer und Verwaltung. Wenn die 30s haarklein 
eingehalten werden müssen, allerdings deutlich mehr.

von Patrick M. (pattex66)


Lesenswert?

Der Code soll eine Schaltung zur "sanften" Einschaltung der Hochspannung 
für eine Röhrenendstufe steuern. Erst wenn die Heizung voll da ist soll 
die HV langsam zugeschaltet werden. Daher sollte es einigermaßen 
gleichmäßig gehen da das SNT für die Röhren HV PWM steuerbar ist und mit 
den Tastverhältnissen die Ausgangsspannung gesteuert wird.
Verstehe ich das richtig, dass am Ende des Timer eine neue Schleife 
begonnen wird die das neue Tastverhältnis im Code hat?

von Wolfgang (Gast)


Lesenswert?

Patrick Müller schrieb:
> Verstehe ich das richtig, dass am Ende des Timer eine neue Schleife
> begonnen wird die das neue Tastverhältnis im Code hat?

Ein Signal mit konstantem Tastverhältnis kann der Timer selbständig 
erzeugen, wenn er richtig für eine PWM-Betriebsart konfiguriert ist. Das 
z.B. auch ist im AVR-GCC-Tutorial/Die Timer und Zähler des AVR 
beschrieben.

von Kurt (Gast)


Lesenswert?

Wie "smooth" soll es werden?

Reichen 70 Zwischenschritte mit je 0,7%, oder sollen es
6600 Zwischenschritte mit < 0,01% sein?

von Patrick M. (pattex66)


Lesenswert?

Naja, ich denke 1% Schritte reichen auch. :-)

von Stefan1234 (Gast)


Lesenswert?

Röhrenendstufe? Wie wäre es mit einer analogen Schaltung?

von Patrick M. (pattex66)


Lesenswert?

Stefan1234 schrieb:
> Röhrenendstufe? Wie wäre es mit einer analogen Schaltung?

Wie analoge Schaltung? Für´s Schaltnetzteil? Der Code soll doch nur die 
Steuerung des SNT´s übernehmen mit dessen Spannung dann die Röhren 
betrieben werden.
Durch die Röhren selbst gehts selbstverständlich analog.

von Kurt (Gast)


Lesenswert?

Meine Güte, das lässt sich beim Tiny 13 mit wenigen Code-Zeilen
zur Initialisierung von Timer/Counter 0 erledigen.

 - WGM02:0 in TCCR0A und TCCR0B        -> Waveform Mode 7
 - OCR0B  und COM0B1, COM0B0 in TCCR0A -> duty cycle an OC0B
 - OCR0A  und CS02:0 in TCCR0B         -> PWM-Frequenz

Dazu kommen vielleicht 20 Zeilen Interrupt-Code (dauert jeweils
nur wenige µs), für das Hoch-Steppen der PWM.

Nach etwas Überschlagsrechnung müsste der Tiny13 eher mit
8 MHz, als mit 1 MHz betrieben werden, um die PWM-Stufung zu
optimieren. - Wenn es denn unbedingt 220 Hz PWM-Frequenz sein
müssen...

Sind die 220 Hz wichtig, oder gingen auch 500 Hz?
Für den Tiny13 wäre das kein Problem...

von Patrick M. (pattex66)


Lesenswert?

> Sind die 220 Hz wichtig, oder gingen auch 500 Hz?
> Für den Tiny13 wäre das kein Problem...

Die 220 Hz sind wichtig da das SNT die erwartet. Der ATTiny13 nicht, 
kann auch ein anderer sein. Hab nur etliche rumliegen und wollte die 
einer sinnvollen Bestimmung zuführen.

Wie schon gesagt, ich bin Neulung.

>Meine Güte, das lässt sich beim Tiny 13 mit wenigen Code-Zeilen
>zur Initialisierung von Timer/Counter 0 erledigen.

> - WGM02:0 in TCCR0A und TCCR0B        -> Waveform Mode 7
> - OCR0B  und COM0B1, COM0B0 in TCCR0A -> duty cycle an OC0B
> - OCR0A  und CS02:0 in TCCR0B         -> PWM-Frequenz

>Dazu kommen vielleicht 20 Zeilen Interrupt-Code (dauert jeweils
>nur wenige µs), für das Hoch-Steppen der PWM.

...ist zwar lieb gemeint, wenn man aber keine Ahnung hat - so wie ich - 
nicht besonders hilfreich. Was helfen würde wäre ein Beispielcode an 
welchem ich die relevanten Stellen nur meinen Bedürfnissen anpassen 
muss. Die Stellen selbst finde ich dann schon, nur das Grundgerüst 
brauche ich.

von Patrick M. (pattex66)


Lesenswert?

...es gibt doch bestimmt irgendwo Code mit dem man eine LED oder einen 
Motor mit PWM softdimmen oder softstarten kann.

Sowas wie hier scheint etwas zu sein was meinen Vorstellungen nahe 
kommt, oder?
http://maxembedded.com/2012/01/avr-timers-pwm-mode-part-ii/

von Kurt (Gast)


Lesenswert?

Ich könnte mich eine Stunde hinsetzen und das in Assembler
aufschreiben.

Als Antwort kommt dann wahrscheinlich:
 - ASM versteh ich nicht.
 - Wie krieg ich den Code in den ATTiny?

"Ich bin Anfänger" hört sich an, als ob du was lernen willst.
Fang an und stell Fragen... Dazu bekommst du hier Hilfe.

Wenn du nicht ANFANGEN willst, vergiss es.

von Patrick M. (pattex66)


Lesenswert?

Sicher will ich´s lernen. Allerdings kann ich mir gut vorstellen das 
dies ein langwieriger Prozess werden wird von dem ich bezweifle das es 
sich langfristig rentiert.
Wenn ich nach Griechenland in den Urlaub fahre lerne ich ja nun auch 
nicht gleich perfekt griechisch sondern frage Leute dies es schon können 
oder nutze ein Übersetzungtool um mich zu verständigen.
Schließlich muss man ja auch nicht alles wissen und sollte seine 
begrenzten Synapsen für Dinge bereithalten die wirklich wichtig sind. 
Das programmieren ist schon irgendwie eine Kunst für sich und wer 
Künstler ist, ist das aus gutem Grund.

von c-hater (Gast)


Lesenswert?

Patrick Müller schrieb:

> Sicher will ich´s lernen.

Das ist doch ein sehr guter Vorsatz.

> Allerdings kann ich mir gut vorstellen das
> dies ein langwieriger Prozess werden wird

Das ist leider zu erwarten, ja. Von nix kommt nix.

> von dem ich bezweifle das es
> sich langfristig rentiert.

Wer da so rangeht, negiert seinen guten Vorsatz schon in dem Moment, da 
er ihn angeblich fasst...

> Wenn ich nach Griechenland in den Urlaub fahre lerne ich ja nun auch
> nicht gleich perfekt griechisch sondern frage Leute dies es schon können
> oder nutze ein Übersetzungtool um mich zu verständigen.

Blöder Vergleich. Was hat der Plan, einen Urlaub in Griechenland zu 
verbringen mit einem Plan zu tun, Griechisch zu lernen? Richtig: Garnix.

> Schließlich muss man ja auch nicht alles wissen

Sicher nicht, das ist auch völlig unmöglich.

> Das programmieren ist schon irgendwie eine Kunst für sich und wer
> Künstler ist, ist das aus gutem Grund.

Nein. Programmieren hat mit Kunst nix zu tun, das ist reines Handwerk. 
Meinetwegen Kunsthandwerk, aber immer noch deutlich mehr Handwerk als 
Kunst. Und ein guter Handwerker wird man nur dadurch:
Indem man das Handwerk erlernt, selber regelmäßig ausübt und nur "mit 
den Augen" bei den anderen guten Handwerkern klaut und nicht nur deren 
fertige Produkte einbaut. Das ist wäre dann "Industrie".

von Patrick M. (pattex66)


Lesenswert?

Mit "langfristig rentiert" will ich nichts negieren. Ich denke aber, 
dass ich ein, zwei mal im Jahr in die Verlegenheit komme irgend einen 
Code zu brauchen - und das auch nicht mal zu wirklich wichtigen Dingen. 
Dafür viele Resourcen in Form von Zeit und Geduld aufzuwenden um extra 
das Coden zu lernen halte ich für bedenklich. Daher der Vergleich mit 
Griechenland. Ich hätte auch schreiben können das ich nicht extra eine 
Kuh kaufe um ein Glas Milch trinken zu können.
Das mit dem Handwerk triffts aber ganz gut. Wenn ich nicht schweißen 
kann gehe zu zu nem Kumpel der´s kann. Der kann wiederum nicht mit SMD´s 
umgehen. So wäscht eine Hand die andere.

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.