Hallo zusammen,
folgendes Problem, die Variable die in den OCR1A geschrieben wird, zählt
fortlaufend hoch und läuft in die Begrenzung rein.
Ich erläutere jetzt die Hardware und die Software.
Ich habe ein Netzteil mit dessen V+ ein Widerstandsdraht verbunden ist,
dieser hat ca 1 Ohm. An dem Widerstand ist dann ein Spannungsteiler
angeschlossen, an diesem Spannungsteiler ist parallel eine Lastsenke.
Ende des Teilers und der Senke sind mit der Masse des Netzgeräts
verbunden. Auch die Massen der Controller liegen alle auf dem gleichen 0
Potential.
Ich will über den Spannungsteiler, der 24 in Reihe liegende Widerstände
hat, die Spannung messen und diese einlesen, manch einer hat mir ja
schon hierbei geholfen.
Die Erfassung läuft einwandfrei und die Spannungswerte werden in einem
Array gesammelt.
Alle 24 Schleifendurchläufe wenn alle Spannungen gesammelt sind, soll
geregelt werden.
Dazu werden alle Spannungen im Array mit einem Sollwert verglichen und
die niedrigste Spannung wird dann als Istwert verwendet.
Liegen alle Spannung größer gleich dem Sollwert soll nichts getan
werden.
Mein Problem ist, dass der Wert "Senke" den ich in den OCR1A schreibe
fortlaufend hochgezählt wird und somit der Strom steigt. Wenn der Strom
aber steigt, dann steigt auch der Spannungsabfall an dem 1 Ohm
Widerstand und die Spannung am Spannungsteiler wird noch geringer.
Jedoch soll das ganze umgekehrt laufen. Wenn Die Spannung fällt, soll
Strom reduziert werden.
Die Regelung lief einwandfrei als ich den Strom als Istwert genommen
habe, bzw über den Strom alles geregelt habe.
Der Regler ist von einem niederländischen Kollegen.
Gemeten=Istwert
Gewenst=Sollwert
1
volatileint8_tgewenst=0;//Sollwert
2
volatileint8_tgemeten=0;//Istwert
3
volatileuint16_tsenke=0;//Wert für OCR1C
4
volatileint16_ti_hold_value=0;//Variable für Spannungsvergleich
i_zellspannungen[count]=einlesen(0);//Sammeln der Spannungen
91
92
93
94
if(count==24)//Regle erst nachdem alle Zellen abgetastet sind
95
{
96
97
gewenst=10;//Sollwert
98
i_hold_value=gewenst;
99
100
for(i_index=1;i_index<25;i_index++)
101
{
102
//Beginn der 25 For Schleife
103
104
if(i_zellspannungen[i_index]<i_hold_value)//mit i_hold_value als SOLLWERT
105
{
106
107
i_hold_value=i_zellspannungen[i_index];//suche geringste Zellspannung und benutze die als Istwert
108
109
}
110
111
}
112
//Ende der 25er For Schleife
113
114
//Regelkriterium
115
116
if(gewenst>i_hold_value)//ist Sollwert größer als Istwert dann regel
117
{
118
119
gemeten=i_hold_value;//Istwert=Wert der niedrigsten Zelle
120
senke=PID();//Speicher PWM Compare in Zwischenvariable
121
122
//Schränke PWM ein
123
if(senke>1023)
124
{
125
senke=1023;
126
}
127
elseif(senke<0)
128
{
129
senke=1;//hier kommt später ein Highpegel hin, der über einen Thyristor die Senke in standby schaltet
130
}
131
else
132
{
133
;
134
}
135
136
OCR1A=senke;
137
138
}
139
140
else//andersfalls mache gar nichts
141
142
;
143
144
}
145
146
do//wartet so lange bis Timer übergelaufen
147
{//springt in Timer 2
148
}while(i_abbruch!=0);
149
150
count++;
151
152
}
153
//end mainloop
154
}
Entweder ich muss ein Vorzeichen im PID ändern, ich weiss aber nicht
welches, ich habe die allgemeine Konstante K_C schon negiert und die
Differenz zwischen Sollt und Ist umgekehrt, aber es läuft immer wieder
hoch.
Vielleicht kann mir einer helfen bzw mit Fehlersuchen.
Danke im Voraus
Wenn ich da ein minus Vorsetze, dreht dann erhalte ich ja einen
negativen Wert. versteht das ORC1A negative Werte?
Und wenn ja, negiert er dann die Spannung? Habe jetzt kein Board zum
ausprobieren hier, aber mich würde es wundern wenn es so einfach wäre,
weil die Lastsenke ja dann auch ein negatives PWM erhält und PWM ist ja
nichts anderes als ein digitaler Code.
Mark Pisani schrieb:
> Wenn ich da ein minus Vorsetze, dreht dann erhalte ich ja einen> negativen Wert. versteht das ORC1A negative Werte?
Da OCR1A unsigned ist: Nein
Aber diese Negierung kommt praktisch aufs gleiche raus, als wie wenn du
sagen würdest
return MAXIMAL_WERT - output;
> Und wenn ja, negiert er dann die Spannung?
Nein
Ich habe Deine Anwendung zwar nicht wirklich verstanden, aber meiner
Meinung nach machst Du zwei entscheidende Fehler:
1.) Eine Regelung macht nur dann Sinn, wenn immer geregelt wird,
nicht nur wenn Dein Ist-Wert < Soll-Wert ist
2.) Du aktualisierst die PWM nur wenn Du auch regelst,
also Ist < Soll. Dann muss der Ist-Wert ja auch größer werden.
Sobald aber Ist > Soll aktualisierst Du die PWM nicht mehr,
wie soll Ist dann jemals wieder kleiner werden?
Ja ich verstehe,
das habe ich mich auch gefragt. Mein Arbeitskollege meinte, die Senke
soll keinen Strom mehr ziehen, wenn Ist=Soll ist oder Ist>Soll.
Mein Problem ist, ich weiss nicht welchen Wert ich dann übergeben soll
als PWM.
Oder ich mache eine Schleife, das er in jedem Fall regelt und sonst den
letzten PWM Wert wieder übergibt, dieser ist ja relativ nah an dem
Sollwert wenn dieser wieder erreicht wird.
Da ist jetzt nicht böse gemeint, aber ich habe den Eindruck, Du fummelst
an einem bestehenden Programm herum, von dem Du keinen blassen Dunst
hast.
Das ist immer gefährlich, wenn man nicht weiß, was man tut oder tun
soll.
Das tolle an einer Regelung ist ja, dass man sich eigentlich überhaupt
keine Gedanken mehr darüber machen muss, welchen PWM-Wert man übergeben
soll, denn das "Denken" übernimmt ja gerade der Regler... vorausgesetzt,
man hat die Regelparameter "vernünftig" eingestellt.
Sich drumherum winden und Schleifen programmieren, falls nicht ... oder
vielleicht doch... oder was denn nun...?!
Mach Dich mit der Regelungstechnik vertraut und dem zu regelnden System
vertraut und programmier den Regler neu, so dass Du ihn auch
verstehst... sonst wird das nix... mein guter Rat zur Nacht ;-)