Sollwert -100 % bis 100 % also -10V bis +10V

Gast #1371620
Lesenswert?

Erstmal danke fürs lesen !!!!

Hallo zusammen ich brauche wieder eure Hilfe, ich muss für meinen 
Regelkreis den Meßbereich softwaremäßig einstellen, d.h. bei -10V soll 
der Sollwert -100% sein und
bei 0 V = 0% und bei +10 V halt 100 %. Die Strecke ist schon vorgegeben 
ein kleiner Lüfter wird als Drehzahlstrecke benutzt und ich soll mit 
einem Atmega128 einen PID Regler bauen/programmieren.
Meine Frage kann man  über den ADC des Atmegas den Meßbereih so 
einstellen, dass z.B 0-511 0V bis -10V ist und von 512- 1023
0V bis +10 V ist.
Danke für eure Tips und Hilfe schonma.
Gast #1371708
Lesenswert?

Hi

danke für die schnellen Antworten, die Eingangsbeschaltung habe ich 
schon mit einem Spannungsteiler realisiert, wäre echt nett wenn du mir 
vielleicht sagen könnest wie ich das Programmieren kann.

Danke
Gast #1371775
Lesenswert?

Ich weiss nicht wieviel du von Regelungstechnik weisst, aber so mal eben 
ist das nicht. Es gibt zwei PID-Algorithmen, den Geschwindigkeits und 
den Stellungsalgorithmus. Der wesentliche Unterschied ist der Ort an dem 
die Integration durchgeführt wird. Beim Stellungsalgorithmus im Rechner 
beim Geschwindigkeitsalgorithmus am Stellglied. Da du wahrscheinlich die 
Drehzahl regeln möchtest, musst du den Stellungsalgorithmus verwenden.

Von Trapezregel und Überintegration verschone ich dich jetzt mal.

Du musst eine Berechnung in einer exakten Abtastzeit aufrufen.

yk=y(k-1)+kr*[(1+Tv/T)*xdk-(1-T/Tn+2*Tv/T)*xd(k-1)+Tv/T*xd(k-2)

mit

yk = Stellgröße
y(k-1) = die Stellgröße einen Abtastschritt vorher

xdk = aktueller Istwert
xd(k-1) = Istwert einen Abtatsschritt vorher
xd(k-2) = kommst du selber drauf

Regelparameter
kr = Proportionalanteil
Tv = D-Anteil
Tn = I-Anteil
T = deine Abtastzeit

Falls du das programmiert bekommst, musst du immer noch die 
Regelparameter finden. Kannst du nicht erstmal mit einer P-Regelung 
evtl. PI-Regelung anfangen? Der D-Anteil wird meiner Meinung nach eh 
überschätzt.
Gast #1371907
Lesenswert?

HI zusammen

@Michael

Danke für deine Antwort, aber das ist nicht wirklich eine Antwort auf 
meine Frage. Stefan M. hatte ja in seinem Betrag geschrieben

>-Dann kannst du recht einfach Programmieren wie das Messergebniss dann 
>-genutzt werden soll.

@Stefan M. wenn du hier noch mal reinschaust wäre ich dir sehr dankbar 
wenn du mir ein Beispiel zeigen könnest.


Nochmal an alle die mir geantwortet haben viele Dank  !!!!!!
Gast #1373427
Lesenswert?

Hi

Danke das du noch mal antwortest, meine Frage war ja wie kann ich den 
Sollwert softwaremäßig einstellen d.h. bei -10V soll
der Sollwert -100% sein und bei 0 V = 0% und bei +10 V halt 100 %, das 
halt per Software. Den Regelalgorithmus zu programmieren, das kommt erst 
im nächsten Schritt.
Also wenn ich einen Sollwert von -100 % haben möchte, will ich meine 
Spannungsquelle auf -10 V einstellen und diese wird von der Beschaltung 
vor dem ADC auf 0V gebracht. Wenn ich z.B 50 % Sollwert haben möchte, 
will ich 5 V vom meiner Spannungsquelle angeben und an den ADC soll halt 
2,5 V.

Ich hoffe mein Anliegen ist bei euch angekommen.

Vielen Dank
Gast #1374559
Lesenswert?

Wie gesagt, du nimmst die Schaltung aus dem obigen Beitrag. Diese 
Schaltung liefert bei -10V -> 0V bis +10V -> 5V. Den Ausgang dieser 
Schaltung schliesst du an einen der ADC Eingänge des µC an. Im Programm 
kannst du nun den 10-Bit ADC verwenden.

-10V -> 0    Digital
0V   -> 511  Digital
+10V -> 1024 Digital
Gast #1374583
Lesenswert?

Hi danke nochmal für die Antworten

aber wie programmiere ich das,

bei -10V ->   - 100% Sollwert
bei 0V   -> bei -0%  Sollwert
bei +10V -> + 100% Sollwert

ist.

Bei

-10V -> 0    Digital ist -10V gleich 0 % Sollwert
0V   -> 511  Digital  ist 50 % Sollwert
+10V -> 1024 Digital  gleich 100 % Sollwert

und das will ich ja so nicht haben.
Gast #1374605
Lesenswert?

In deinen ersten Post klang das aber noch anders!

Nimm dir eine signed int Variable(Variable mit Vorzeichen)
1
unsigned int getADC(unsigned int _channel)
2
{
3
 ....
4

5
 return adcwert;
6
}
7

8
void main (void)
9
{
10
...
11

12
signed int sollwert;
13

14
sollwert = getADC(0)-511;
15

16
...
17

18
}
Gast #1378928
Lesenswert?

Hallo zusammen

Erstmal sorry das ich jetzt erst antworte, ich war etwas beschäftigt. 
Also ich dachte es war von Anfang an klar das ich wissen wollte wie ich 
das Programmieren kann.Wie dem auch sei, vielen dank für deine Antwort. 
Ich werde mich bestimmt noch mal melden.

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