www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega8 soft-pwm neben einer Frequenzmessung


Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe bei meinem laufenden Projekt ein Problem. Basis ist ein mega8L.
Ich messe eine Frequenz am ICP mit Timer1. Timer0 ist ein 
allround-Timer, den ich zur Tonausgabe (Tonöhe abhängig von einer 
bestimmten gemessenen Frequenz), Länge der Ausgabe, Länge der Pause etc. 
nutze.

Die gemessene Frequenz kommt von einem Farbsensor und liegt zwischen 20 
Hz und 6,5 kHz (Messung läuft super und auch genau). Jetzt muß ich aber 
noch meine Meßstelle mit einer gedimmten weißen LED beleuchten, um die 
Werte zu normieren. Erster Gedanke war: pwm. 2. Gedanke war, da Timer1 
schon die Frequenzmessung macht, SOFT-PWM (ist ziemlich gefrickelt 
geworden).

Nach Tastendruck wird 10x die f gemessen und aufs LCD geschrieben sowie 
der
PWM-reload-Wert angepaßt.

Der Test ergab: diese Methode versaut mein Timing und somit die 
Frequenzmessung.

Jetzt die Frage:
- Wäre es gut, einen externen DAC zu nutzen (440Hz-2,8kHz, sinus-signal) 
und
  wenn ja, welchen?
- Soll ich auf einen mega162 migrieren, der ja 2 16-Bit-Timer hat?
- Gibt es da nicht noch einen 8-Bit-Timer, der die Soft-PWM machen kann, 
ohne, daß er mich zusehr nervt. (leider muß ich halt gleichzeitig 
beleuchten wie messen.)

Vielen Dank.
sorry daß mein code so broken aussieht.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian (Gast)

>Ich messe eine Frequenz am ICP mit Timer1. Timer0 ist ein
>allround-Timer, den ich zur Tonausgabe (Tonöhe abhängig von einer

>Werte zu normieren. Erster Gedanke war: pwm. 2. Gedanke war, da Timer1
>schon die Frequenzmessung macht, SOFT-PWM (ist ziemlich gefrickelt
>geworden).

Und was ist mit Timer 2?

>- Wäre es gut, einen externen DAC zu nutzen (440Hz-2,8kHz, sinus-signal)
>und

?? Willst du die LED statisch mit PWM dimmen oder dynamisch damit einen 
Sinus generieren?

>- Soll ich auf einen mega162 migrieren, der ja 2 16-Bit-Timer hat?

Man kann mittels Output Compare auch auf Timer 1 noch PWM machen. 
Parallel zu ICP.

MFG
Falk

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,
ich wußte nicht, daß man das parallel auf einem Timer nutzen kann. 
Könntest Du mir da ein paar code-Brocken schicken?! Mit den Timern tue 
ich mich recht schwer.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian (Gast)

>ich wußte nicht, daß man das parallel auf einem Timer nutzen kann.
>Könntest Du mir da ein paar code-Brocken schicken?! Mit den Timern tue
>ich mich recht schwer.

Was für eine PWM willst du denn? 8/10/12/16 Bit? PWM Frequenz?

MFG
Falk

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

eine 8-Bit PWM erscheint mir ausreichend. Ich möchte nur halbwegs 
gleiche Bedingungen für meine Farbwertmessung schaffen.

Was die Frequenz angeht - hmm ich arbeite mit 4 MHz CPU-Takt. Die LED 
sollte auch am dunkleren Ende nicht flackern aber es muß nicht 
wahnsinnig schnell sein.

Mach keine fertige Applikation, mir reichen Anhaltspunkte. Ich dachte 
bisher, daß der Timer durch die Nutzung mit dem Flankenfang belegt ist 
und ich nun keinen mehr frei habe. Ich muß auch gestehen, daß ich die 
eingebaute PWM noch nicht richtig zum Laufen gekriegt habe. Vielleicht 
würde dazu schon ein Bsp reichen (initialisierung und start).

vielen dank

Autor: Ulrich harms (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich beschäftige mich auch gerade mit der Farbeerkennung. Ein weiße LED 
ist als Beleuchtung dazu problematisch, da das Spektrum meistens kaum 
rot enthält. Eventuell sollte noch je eine rote und grüne LED dazu. Wenn 
der Farbsensor nicht mit flackerndem Licht zurechtkommt, muß eventuell 
die Spannung an der LED noch geglättet werden.

Ich kenne den Farbsensor zwar nicht, aber wegen des Spektrums der LED 
wird die Farbmessung keine wirklich normgerechten Farben liefern können. 
D.h. 2 Farben die für deinen Sensor gleich aussehn, können unter einer 
normalen Glühbirne oder bei Sonnenlicht verschieden aussehen. Bekanner 
ist der Effekt umgekehrt, also Farben die bei Sonneenlicht gleich 
aussehen, können unter einer Leuchtstoffröhre verschieden aussehen.

Ich benutze übrigens verschieden LEDs (zur Zeit 10) als Beleuchtung und 
eine normale Photodiode, um verschiendene Wellenlängen zu unterscheiden. 
Funktioniert eigentlich schon ganz gut, nur der Abstand zur Probe ist 
noch etwas kritisch.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ulrich:

ja mit einzelnen Photodioden habe ich auch angefangen aber das war arg 
komplex, brauchte ne stabile v- und war unmöglich abzugleichen. Ich 
nutze jetzt den taos tcs230 von conrad. Das Ding hat allerdings ne 
Frequenz statt ner Gleichspannung als Ausgang - daher etwas aufwendiger. 
Intern ein Viertel ohne, und drei mit R B G Filtern. TTL adressierbar 
und 5V/3,3V als Vcc.
Daß die weiße Led ein "verbogenes" Spektrum liefern hab ich schon 
festgestellt aber ich hoffe, daß ich es mit Referenzwerten später 
rausrechnen kann. Ich will ja keine RAL-Farbe erkennen und die passenden 
Werte liefern sondern eher den "supjektiven" Farbeindruck meines Gerätes 
dann als Piepser ausgeben. Und das Gerät sieht ja dann jedes Meßobjekt 
auf die gleiche Art.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian (Gast)

>eine 8-Bit PWM erscheint mir ausreichend. Ich möchte nur halbwegs
>gleiche Bedingungen für meine Farbwertmessung schaffen.

Na dann wirds ja noech einfacher! Die kannst du entweder mit dem freien 
Timer 2 oder parallel mit dem Timer 0 erzeugen. Das Datenblatt sagt wie. 
BEi 4 MHz CPU-Takt hast du 15kHz PWM-Freqeunz, da flackert GAR NICHTS.

MFG
Falk

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
weitere Fragen nach Studium des Manuals vom mega8:

Wenn ich den Timer1 freilaufend nutze, um meine Frequenz über icp zu 
messen, kann ich ihn doch nicht gleichzeitig als 8-Bit-PWM-Modulator 
nutzen, da TCNT1 dann nur bis 255 und wieder zurück läuft und somit 
meine TCNT1 -> ICR1 Übernahme gestört wird, oder?

init code dazu:
TCCR1B = (1<<ICES1)  | (1<<CS10); //ICP nutzen, Timer1 mit f_cpu
TIMSK = (1<<TICIE1) | (1<<TOIE1) | (1<<TOIE0); //ICP, TOVflow, T0 für 
was anderes
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0); //8-Bit PWM, invert.
OCR1A = 128; //PWM 50:50 an/aus (jetzt mal als Bsp.) ->darin sehe ich 
das Problem

Wenn ich Timer2 zur Erzeugung meines PWM-Signals nutze, kommt nach DDRx 
Definition das Ergebnis an OC2 raus. Dieses Pin wird aber auch von der 
SPI-Schnittstelle genutzt, über welche ich den uC programmiere. Kann ich 
diesen Ausgang als PWM-Ausgang nutzen während die SPI-Schnittstelle laut 
Fuses aktiviert ist? Ich kann die ja schlecht abschalten, wenn ich mich 
nicht aussperren will.

Vielen Dank schonmal!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian (Gast)

>Wenn ich den Timer1 freilaufend nutze, um meine Frequenz über icp zu
>messen, kann ich ihn doch nicht gleichzeitig als 8-Bit-PWM-Modulator
>nutzen, da TCNT1 dann nur bis 255 und wieder zurück läuft und somit
>meine TCNT1 -> ICR1 Übernahme gestört wird, oder?

Ja, das geht nicht. Aber du hast ja noch zwei andere Timer.

>Wenn ich Timer2 zur Erzeugung meines PWM-Signals nutze, kommt nach DDRx
>Definition das Ergebnis an OC2 raus. Dieses Pin wird aber auch von der
>SPI-Schnittstelle genutzt, über welche ich den uC programmiere. Kann ich

Ja und? Das machst du doch nicht im laufenden Betireb.

>diesen Ausgang als PWM-Ausgang nutzen während die SPI-Schnittstelle laut
>Fuses aktiviert ist?

Sicher.

>Ich kann die ja schlecht abschalten, wenn ich mich
>nicht aussperren will.

Besser ist das. Aber die kann man sowieso nur per HV-Programmierung 
löschen.

MFG
Falk

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab mir ein kleines Testprogramm geschrieben, um mal TIMER2 zu testen.
Eigentlich soll es während des Laufs möglich sein, mit zwei Tasten das 
Tastverhältnis zu verändern.
Irgendwas mache ich da falsch. Auch die Status-LEDs an PORT D blitzen 
nur ganz kurz auf. Was hab ich vergessen?!

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nabend!
Der Befehl:

sei();

zur globalen Int-Freigabe war Schuld. Jetzt geht alles super. Ich 
forsche mal, was genau passiert ist. Scheinbar wird dadurch noch ein 
OVF-Int oder so freigegeben und der bügelt mir meine Änderungen ständig 
weg. Wenn die Frequenz ganz niedrig war, konnte man soetwas ähnliches 
aus dem Verhalten der LEDs schliessen.

TNX & night.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.