Forum: Mikrocontroller und Digitale Elektronik Analog Werte einlesen und damit rechnen


von Hugo P. (portisch)


Lesenswert?

Hi,

ich möchte mich etwas zu ADC erkundigen. Also eine kleine 
Machbarkeitsstudie.

Ich möchte probieren ob ich z.B. 2 Spannungen einlesen kann und dann 
damit rechnen. Das Ergebnis wird wieder als Analogspannung ausgegeben.

Ich habe z.b:

u1 und u2

Formel : ((u2)^2) / ((u1-u2)^2)

Das Ergebnis brauche ich dann wieder Analog.

Nun haben aber u1 und u2 einen Bereich von 0-10V. Das kann der AVR ja 
schon mal nicht, oder?

Daher ist mir die Idee gekommen einen I2C ADC Konverter (MAX127) zu 
verwenden.
Dieser kann auch gleich z.B. 8 Analoge Eingänge und auch mit mehr 
Auflösung (z.B. 12Bit).

Das Ergebnis dann halt anders herum einen I2C DAC der die berechnete 
Spannung wieder ausgibt (MAX5842).

Das ganze sollte von alleine laufen. D.H. ich schalte die Versorgung ein 
und der AVR soll zum Rechnen anfangen. Das sollte sich mit einer 
Endlosschleife lösen lassen.

Nun noch eine Frage zu der Schnelligkeit!
Eigentlich war meine Idee das ganze Analog aufzubauen (OPV + AD633).
Die Berechnung hängt in einem Regelkreis eines Netzteiles und muss somit 
schnell und zuverlässig funktionieren. Ansonsten gibt es Probleme mit 
der Leistungsendstufe ;)

Aber das ganze Analog aufzubauen ist ein riesen Aufwand und auch 
ziehmlich Kostspielig.

Kann man irgendwie rausfinden wie lange dann der AVR für einen Durchlauf 
braucht? Wenn der Analoge Ausgang dann nur alle 500ms aktualisiert wird 
gibt es sicher Probleme. Hängt warscheinlich von der Taktrate des AVR 
ab.

Würde dazu ein ATiny85 dann auch reichen oder brauche ich dazu einen 
größeren AVR. Ich weis jetzt nicht ob der ATiny85 überhaupt ein I2C 
Interface besitzt.

Programmieren werde ich mit AVR Studio und GCC.

Jetzt schon einmal Danke für Tipps!

von Tim R. (vref)


Lesenswert?

Das geht natürlich nur in gewissen Grenzen, wenn u1 und u2 bis zu 10V 
sein sollen...

((u2)^2) / ((u1-u2)^2)

z.B. u2=9V, u1=10V ergäbe

9^2 / (10-9)^2 = 81V...

Zitat:
"Die Berechnung hängt in einem Regelkreis eines Netzteiles und muss 
somit
schnell und zuverlässig funktionieren. Ansonsten gibt es Probleme mit
der Leistungsendstufe ;)
(...)
Wenn der Analoge Ausgang dann nur alle 500ms aktualisiert wird
gibt es sicher Probleme."


Vielleicht kannst du mal umgekehrt definieren, wie schnell der 
Regelkreis sein müsste, damit es keine Probleme gibt.

von Net (Gast)


Lesenswert?

Hallo Hugo!

Prinzipiell spricht nichts gegen Deine Idee. Hier noch ein Paar Gedanken 
zum Thema:

1) 10V kann ein AVR nicht wandeln. Die obere Spannungsgrenze ist zum 
einen durch die gewählte Referenzspannung für den ADC begrenzt, zum 
anderen aber durch die Klemmdioden an den Pins. D.h. wenn Du den 
Controller mit 5V betreibst werden diese Dioden ab ca 5,6V leitend -> 
Lösung: Spannungsteiler einbauen und dafür sorgen dass die 
Eingangsspannung nicht den zulässigen Bereich verlässt.
Der MAX127 arbeitet schließlich auch mit einer Referenzspannung und 
einem SW-gesteuertem Spannungsteiler. Was soll der Vorteil (abgesehen 
von einer höheren Auflösung) sein, diesen zu nehmen? Ist die hohe 
Auflösung wirklich notwendig?

2) Rechenaufgabe sollte für einen AVR machbar sein, allerdings sollte 
man sich ein Paar Gedanken zum Thema "Festkommaarithmetik" machen.

3) Diese Funktion analog zu implementieren sollte aus meiner Sicht auch 
keinen enormen Aufwand darstellen. Je nach dem wie schnell das ganze 
wirklich funktionieren soll, würde ich diesen Ansatz nicht gleich 
verwerfen.

4) Wie lange der Controller für die Berechnung tatsächlich braucht hängt 
natürlich von der Taktrate ab, die Zeit kann man aber experimentel 
bestimmen, in dem man z.B. ein mal pro Schleifendurchlauf einen Pin 
toggeln lässt und die Zeit dann mit nem Oszi misst.

Gruß

Eugen

von Hugo P. (portisch)


Lesenswert?

Danke schon mal für die Antworten!

@Tim R.:
klar, 10V * 10V = 100V, kann nicht gehen.

Hier würde ich dann wie der AD633 verfahren: x = (u1 * u2) / 10

Somit 10V * 10V = 100V / 10 = 10V

Da es sich um einen Spannungsmonitor und Strommonitor handelt (also U*I) 
kann man dann den Faktor auch gleich so anpassen, damit ein guter 
Masstab für den Leistungsmonitor heraus kommt.

Bei der Formel ((u2)^2) / ((u1-u2)^2) handelt es sich um ein 
Verhältnis/Faktor. Somit sind Werte von 0..1 als Ergebnis zu erwarten.

Ich reche mir sozusagen zuerst P_Forward aus. Dann mit dem Faktor 
multiplizieren = P_Delivered.
P_Reflected =P_Forward - P_Delivered .

Also um zuerst P=U*I zu berechnen: 1 STK AD633
Dann um den Faktor zu berechnen: 2 STK AD633 + Dividierer (1 STK AD633 + 
OPV)
Dann die beiden miteinander multiplizieren: 1 STK AD633

Somit kommen hierzu schon 5 STK AD633 zusammen. Das STK kostet ~10,-

Um alles auszurechnen brauche 4 analoge Inputs und 3 analoge Ausgänge.
Den MAX127 haben wir schon in einer Anwendung. Dieser braucht keine 
Referenzspannung. Er hat eine interne 4.096V Referenz. Und man kann 
direkt 0..10V oder sogar -10..10V anlegen.

Hier wieder ein extra Spannungsteiler 10V -> 5V zu verwenden bringt mir 
wieder einen Fehler durch die Bauteiltoleranzen. Es würden auch viele 
Bauteiltoleranzen wegfallen wenn ich es per AVR und MAX127 umsetze. Denn 
die AD633 oder auch OPV brauchen auch wieder Widerstände um die 
Verhältnise anzupassen.

Man könnte auch eine Kalibrierstation für den AVR machen. D.h. man 
steckt ihn auf ein Testboard wo alle Eingangsspannung kalibriert sind. 
Somit weis man was rauskommen muss und der AVR kann sich selber den 
Fehler berechnen und im EEPROM ablegen. Vorteil: kein Poti nötig wo 
wieder irgendeiner etwas herumdreht ;). Auch ob die 10Bit genug wären... 
Bin mir nicht sicher. Müsste man probieren.

Wenn ich nun überlege 12Bit^2:
Der Wert wird auf 16Bit erweitert: 65535^2 = 4294836225
Das Ergebnis sollte also in ein UInt32 passen.

Danke auch für den Tipp mit Festkommaarithmetik!
Werde ich mir gleich einmal ansehen. Vor allem da der Faktor genau 
berechnet werden soll. Zumindest 2 Kommastellen sollten es schon sein: 
0,00 - 1,00
Oder kann man nicht einfach Gleitkommazahlen verwenden? Also Float?
Verwendet wird wie gesagt der GCC Kompiler

Wegen der Geschwindigkeit:
Muss ich morgen nocheinmal überprüfen.
Der Regler ist ein analoger PI Regler. Dieser muss dann halt langsam 
genug sein.

von Net (Gast)


Lesenswert?

>Hier wieder ein extra Spannungsteiler 10V -> 5V zu verwenden bringt mir
>wieder einen Fehler durch die Bauteiltoleranzen. Es würden auch viele
>Bauteiltoleranzen wegfallen wenn ich es per AVR und MAX127 umsetze. Denn
>die AD633 oder auch OPV brauchen auch wieder Widerstände um die
>Verhältnise anzupassen.

Im Datenblatt vom MAX127 auf der Seite 9 sehe ich ebenfalls einen 
Spannungsteiler am Eingang.. Auch wenn dieser schon im Chip integriert 
ist. Aber wenn Du mit dem Baustein vertraut bist, kannst Du ihn 
natürlich verwenden. Nur bei dem Stückpreis + Zusatzaufwand für die I2C 
Kommunikation (-> evtl. erhöhte Laufzeit) würde ich mir doch überlegen 
den ADC zu verwenden, den der µC mitbringt..
Und bei 10-Bit Auflösung hast Du knapp 10mV pro Digit(!). Würd mich echt 
mal interessieren was Du da so baust, wenn die Auflösung nicht ausreicht 
;-)

Gruß

Eugen

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.