Spannung - Frequenz - Umsetzung ( U - f - Umsetzung)

Gast #319443
Lesenswert?

Hallo,

ich brauche für ein Projekt eine Spannungs-Frequenzumsetzung. Ich will
eine analoge Spannung mit einem ATMega8 oder ATtiny26 am ADC einlesen,
und dann an einem Ausgang eine Frequenz ausgeben, die direkt
proportional zur eingelesenen Spannung ist: z.B. 0V entspricht 1000 Hz,
3V entspricht 2000Hz.
PWM scheidet aus technischen Gründen leider aus.

Nun meine Frage: Hat jemand so ein Problem in Assembler schon einmal
gelöst? Dabei geht es mir nicht um das einlesen (ist ja kein Problem),
sondern viel mehr darum, wie ich die U - f - Umsetzung Software-mäßig
realisiere.
Für ein Grundgerüst oder nützlichen Hinweisen wäre ich sehr dankbar.

Noch ein Hinweis: Die Pulsdauer der Frequenz sei konstant, nur eben der
Abstand der Pulse sei von der Spannung abhängig.

Vielen Dank für die Tipps.

Gruß
Jan Purrucker
Gast #319445
Lesenswert?

Das mit dem 555 wird vermutlich wenig Linearität haben.
Es gibt auch spezielle ICs dafür.
Mit einem µC geht das ebenso gut.

Du kannst dafür einen PWM-Ausgang verwenden, nur dass Du statt des
Längen-registers das Modulo-Register veränderst, dann hast Du konstante
Ein-Dauer.
Formeln:
f= 1 / (highdauer + lowdauer)
lowdauer = 1/f - highdauer (brauchst Du nicht)

#define clock = 8000000L   //z.B. 8MHz  L:32-bit!
#define highdauer = 1234  //gewünschte High-Dauer
#define f_offset 1000
#define lin_faktor 1234  //in Promille, da hernach /1000
longint f;
f = f_offset + adc;   //oder f=f_offset+ (lin_faktor*adc/1000)
PWMmodulo  = clock / f;   //evtl. Prescaler beachten
PWMhigh = highdauer;

ungeprüft, ich kenne die PWM-unit des AVR nicht
Gast #319448
Lesenswert?

Hallo Profi,

das ich die PWM des yC nehmen kann ist schon einmal ein guter Tipp.
Leider bräuchte ich die U - f - Umsetzung genauer. PWM hat beim ATMega8
und beim ATtiny ja nur 8bit (=256 Stufen). Ich bräuchte aber eine
Auflösung von etwa 1000 Schritten.
Vielleicht kann mir hier jemand mit einem Assembler-Code Vorschlag
weiterhelfen, da ich (bis jetzt) C nicht sehr verstehe.
Vielen Dank für weitere Anregungen.

MfG
Jan Purrucker
Gast #319450
Lesenswert?

Hallo,

ich habe mich nun in meiner Schaltung auf den ATtiny26 festgelegt (aus
Platzgründen, und wegen der besseren Lötbarkeit in SMD)
Es müsste doch irgendwie eine Möglichkeit geben, mit diesen yC eine
deraritge Umsetzung mit 1000 Schritten zu erzielen.
Für Assemblercodes wäre ich sehr dankbar.

Jan
Gast #319451
Lesenswert?

Könnte schon gehen: Du musst hat den PWM-Timer im laufenden Betrieb
progammieren. Wenn er also auf 900 zählen soll, dann lass ich 3x die
vollen 256 durchlaufen ohne PWM, und erst danach darf er nach den
abschliessenden 132 am Ausgang rütteln.
Gast #319452
Lesenswert?

Nochmal, ohne Schreibfehler:

Könnte schon gehen: Du musst halt den PWM-Timer im laufenden Betrieb
progammieren. Wenn er also auf 900 zählen soll, dann lass ihn 3x die
vollen 256 durchlaufen ohne PWM, und erst danach darf er nach den
abschliessenden 132 am Ausgang rütteln.
Gast #319456
Lesenswert?

>und dann an einem Ausgang eine Frequenz ausgeben

Bitte genauer: Sinus, Rechteck, Dreieck, Rampen, Strohhalme, Handtücher
? Wenn's was anderes ist wie Rechteck wird vermutlich DDS nicht
verkehrt sein.
Eine Lösung des Problems hängt sehr von der Vorgabe ab...

>PWM scheidet aus technischen Gründen leider aus.
Warum ? Schreib mal mehr dazu, vielleicht meinst du das nur...

Gruß
Stefan
Gast #319457
Lesenswert?

Such mal nach dem Datenblatt vom XR-4151 (oder Abkömmlingen).
Das ist ein U/F-Wandler mit typ. 1kHz/V im Bereich 0-10kHz mit 0,05%
Linearität im 8-pol. DIL.
Oder aber auch irgendein spannungsgesteuerter Oszillator wie XR-2206.
Meines Erachtens die einfachste Lösung (ohne µP).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren