PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : F/U Wandlerdurch Microcontroller



bob37
04.07.2007, 07:45
Hallo Jungs,

ich möchte ein Frequenz/Spannung Wandler mit einem Microcontroller programmieren. Am Eingang ist ein Rechtecksignal (Frequenz) und am Ausgang soll eine Konstante Spannung sein (0.....10V).

Problem: ich weiß nicht, wie ich anfangen soll. Es wäre nett, wenn mir jemanden die Grundidee oder Vorgehensweise mitteilt.

Danke

bob37
04.07.2007, 07:49
noch dazu: Dir Frequenz am Eingang ist einstellbar, d.h. der Ausgang(Spannung) abhängig vom Eingang sein soll.

zumgwadrad
04.07.2007, 08:26
Hi,
da musst du dich durchs Datenblatt von deinem Atmega wälzen!
Brauchst einen Eingang als Counter, der die die Anzahl der Empfangenen Signale pro Zeit zählt, und als Ausgang nimmst du einen deiner ADC, oder in dem Fall Digital-Analog converter.
Dann musst du in deinem Prog nur festlegen welche Frequenz welcher Spannung entspricht und gut ist!!
Viel Erfolg

bob37
04.07.2007, 08:33
vielen dank für die Antwort.

Ehrlich gesagt, ich bin anfänger beim Programmieren von Microcontroller. ich hab schon ein Paar kleine Aufgaben an der FH gemacht. aber wie soll ich den counter programmieren???. Wie kann er steigende Flange von fallende Flange unterscheiden??????

zumgwadrad
04.07.2007, 08:37
Hi,
des kann man dem alles sagen, Kannst glaub ich auch auf Pegel einstellen!
Um zu wissen wie du des deinem Controller sagst, wirst du nicht darum herumkommen ins Datenblatt zu schauen!
Ich weiß ja nichtmal welchen Controller du verwendest!!
Schau mal hier im Wiki da ist des meiste erklärt!!

bob37
04.07.2007, 08:49
ich verwende ATmega8535

ba4_philipp
04.07.2007, 10:29
In welchem Frequenzbereich bewegt sich das ganz denn?
Als kurze Idee (nur jetzt mal so aus dem Ärmel kann also locker Denkfehler enthalten) würde ich sagen wenn die Ausgangsspannung proportional zur Frequnz sein soll, dann ist die Periodendauer umgekehrt proportional zur Ausgangssapannung.
Ich würde dann zB mit dem ICP0 Pin die Periodendauer messen. Den Timer möglichst so einstellen, dass er bei der kleinsten Frequenz die vorkommen kann gerade noch nicht überläuft aber trotzdem noch ein wenig was bei der größten Frequenz zu zählen hat.
Auf dem gleichen Timer (kenne den meg8535 nicht, benutze immer den mega8) würde ich dann die gemessene Zeit in das Compare Register schreiben. Jetzt brauchst Du nur noch im Compare IRQ einen Pin einschalten und bei Overflow wieder aus. Dann hast du schonmal eine PWM die proportional zur Frequenz ist. Das ganze noch durch einen Tiefpass und dann sollte es das gewesen sein.

Gruß Philipp

PS: Das neue setzen des Compare Wertes vielleicht erst nach einem Timeroverflow wieder freigeben, damit da nix durcheinander geht. Sollten in C nicht viel mehr als 10 Zeilen Code werden.

PPS: ;) Diese Variante misst die gesamte Periodendauer, also von steigender zu steigender oder fallender zu fallender Flanke (was IMHO auch sinn macht, wenn man eine Frequenzabhängigkeit haben möchte). Wenn du mit der Capture Funktion nur die Hightime zB messen möchtest, dann kannst du die Triggerung in der ISR umschalten musst, dann aber das IRQ Bit löschen, weil das sonst sofort wieder einen IRQ Triggern würde. Steht aber auch im Datenblatt ganz gut beschrieben

bob37
04.07.2007, 14:33
Danke Philipp für deine Antwort.
ich gehe davon aus, dass es zwischen ATmega8535 und ATmega8 keinen großen Unterschied gibt.

Der frequenzbereich ist 0....3,636 kHz.

bob37
09.07.2007, 14:05
hallo,
ich hab schon den Datenblatt von ATmega8535 durchgelesen, aber ich weiß nicht wie ich den ICP verwenden soll. Ich bin ein anfänger im Microcontroller-Programmierung. Kann mir jemanden bitte helfen und ein Beispiel ausführlich erklären???????? Der Ausgang muss mittel PWM ermittelt werden.:cry:

ba4_philipp
09.07.2007, 16:55
Eigentlich ganz einfach, wenn Du den ICP Pin richtig konfiguriert hast, dann wird beim erscheinen der von Dir eingestellten Flanke der aktuelle Timerstand in das ICP Register kopiert und danach der ICP IRQ ausgelöst in dem kannst Du dann den Wert verarbeiten.

Gruß Philipp

bob37
11.07.2007, 12:05
kannst du mit bitte sagen wie es mit der Konfiguration von ICP geht????

ba4_philipp
11.07.2007, 14:08
Einfach den ICP IRQ bei deinem Controller einschalten (wie gesagt kenne deinen da nicht). Und dann setzt Du noch worauf er reagieren soll (zB rising Edge) das ist im Prinzip genauso wie bei INT0 und INT1 nur das er vor dem IRQ aufruf noch den Timerstand in das ICP Regsiter kopiert. Die Einstellungen dazu solltest Du im Datenblatt bei dem Timer finden, den Du dafür benutzen möchtest.

Gruß Philipp

bob37
13.07.2007, 11:46
was ist IRQ eigentlich ?????

ba4_philipp
13.07.2007, 20:42
ein Interrupt

Gruß Philipp