PID regeling tunen.

Ik ben een PID regeling voor de spanning-mode van mijn algemene DCDC converter aan het maken.

Volgens mij heb ik de PID code nu redelijk simpel maar wel precies zoals het 'hoort".

c code:


int run_pid (struct pid_s *pid, int input)
{
  int de, e;

  e = pid->setpoint - input; 
  de = e - pid->error;
  pid->error = e;

  pid->acc += pid->error * pid->kI;
  
  pid->out = ( (pid->acc>>4) + pid->kP * pid->error + pid->kD * de) >> 8;
  return pid->out;
}

De berekeningen gebeuren dus met 8 bits "achter de comma", omdat de output toch als integer gebruikt wordt, hoop ik dat dit voldoende is. Hmm. Misschien een idee om even niet op CPU cycles te besparen en het ook met floats te implementeren. Niet optimaliseren voordat het werkt. Wie zei dat ook al weer? (*)

Onder belasting krijg ik met parameters:

CV pid: kp=22, ki=32, kd=0. Set=5642, acc=812320, error=-6, out=197.

De Kp heb ik bepaald door Kulitmate te bepalen. Boven de 44 ging ie raar doen, en volgens Ziegler–Nichols moet ik dan een Kp van ongeveer de helft daarvan gebruiken.

Maar als ik dan verder de Ziegler–Nichols methode ga gebruiken, dan snap ik niet goed wat ik met die tijden moet doen en wat de eenheden zijn.

https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method

In dit grafiekje: de output en de error. (error rond de nul, de output rond de 200).

(*) Ik ben grote aanhanger van die uitspraak.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Het algorithme wat je gebruikt heeft diverse tekortkomingen.

Lees deze artikelen eens:

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-in…

En de bullitpoints 1 t/m 7 even volgen. Daarin staat stap voor stap wat de issues zijn met de "beginners PID" implementatie.

(Volgens mij heb ik die jaren gelden hier ook al eens gepost).

Ik heb ook eens PID loops proberen te tunen met het S&N algorithme. Vaak komt dat gewoon niet lekker uit. Vooral als je process niet lineair is ga je de mist in. (Zal hier wel niet).

Wat die timing betreft, volgens mij gebruikte ik iets van 0.2 * oscillatie periode tijd (Tu in de wiki page) voor de D component. Dus als de oscillatie 10Hz is (100 ms periode) bij het kritische punt waar de oscillatie begint zou je de D tijd op 0.2 * 100ms = 20 ms in moeten stellen.
Weglaten van het D stuk werkt eigenlijk niet en heb je echt nodig.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
eSe

Honourable Member

@henri62 In de link die je opgeeft staat inderdaad een zeer goede uitleg:

http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-in…

Bedankt daarvoor, ik was hem kwijt.

Ik heb het enkele jaren geleden gebruikt om een goedkoop/simpel electrisch motortje te regelen en dat werkte geweldig goed. Maar 't is weeral te lang geleden om hier een zinnige uitspraak te doen over @rew zijn probleem.

Maar toch even goed doorlezen, het licht zal schijnen :-)

Groetjes,
eSe

CChheecckk yyoouurr dduupplleexx sswwiittcchh..

Op 12 mei 2021 16:40:44 schreef rew:
Maar als ik dan verder de Ziegler–Nichols methode ga gebruiken, dan snap ik niet goed wat ik met die tijden moet doen en wat de eenheden zijn.

https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method

Mijn interpretatie van dat artikel (ik heb nooit de Ziegler Nichols methode gebruikt) is dat de eenheid van tijd de periode van je regellus is.
Je hebt per definitie een tijd tussen Tn en Tn+1 waarin je je differentiele en geintegreerde error bepaald. Je sample-periode dus.

Verder doe je met die tijden niets in je PID regelaar.

Op 13 mei 2021 04:37:34 schreef blurp:
[...]

Mijn interpretatie van dat artikel (ik heb nooit de Ziegler Nichols methode gebruikt) is dat de eenheid van tijd de periode van je regellus is.

Nee: Het is de periodetijd van de oscillatie op het punt waar je de K zodanig hebt verhoogd dat de hele regeling in oscillatie gaat.

Hier is wel van belang dat je regellus natuurlijk een stuk sneller is dan de oscillatie van je hele kring. Anders bepaald je regelloop de roundtrip/oscillatie en heb je er geen barst aan.

[Bericht gewijzigd door henri62 op donderdag 13 mei 2021 11:04:27 (20%)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Ik heb dat artikel ooit gelezen. Misschien ooit wel eens zelf hier gepost, maar ik kon hem deze keer niet meer vinden..... Ik weet zeker dat ik 1 van de hints al onthouden en geimplementeerd heb, maar ik zal het eens van het begin tot het eind weer doorlezen en kijken wat ik vergeten was.

(Anti-windup heb ik nog niet. Denk wel dat het nodig is: Bij het opstarten lijk het er op dat ik wel eens een overflow kan krijgen van m'n I-variabele).

Heren, dank! :-)

P.S. Dan denk je: "ik had hem moeten bookmarken, laat ik dat maar eens doen. Is dat bookmark-sterretje gewoon massief blauw om aan te geven: Deze link HEB je al gebookmarkt". Zucht.

[Bericht gewijzigd door rew op donderdag 13 mei 2021 11:33:10 (17%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

En DC/DC converter in continuous mode is heel gevoelig voor veranderingen in de pulsbreedte; in de ideale situatie is die gelijk aan de verhouding van de spanningen, en elke afwijking daarvan heeft alleen een spanning over de (gewoonlijk heel kleine) inductie en weerstanden.

Ik heb wel eens DC/DC converters geregeld met software, en dan werkt het m.i. beter om eerst een stroom setpoint te bepalen en daar vervolgens op te regelen; als je direct de spanning probeert te regelen zit je alweer aan de tweede-orde proces.

Ken ik deze DC/DC converter?

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 13 mei 2021 14:03:25 schreef SparkyGSX:
Ken ik deze DC/DC converter?

Nope. Sorry.

Ik heb alle truuks uit de blog nu ook geimplementeerd. Dwz. Ik heb van een aantal nu weer paraat wat ze waren en als ik het probleem tegenkom wat ze oplossen, dan zal ik even de oplossing implementeren.

Zou de discretisatie van de output veel roet in het eten gooien?

Mijn "output" (van de PID) zit nu bij 5V output op rond de 200. Dit terwijl de feedback/input op 5642 staat. Ik zou dus hopen dat ie tussen 200 en 201 zou gaan pendelen om gemiddeld bijvoorbeeld 200.34 als output waarde te krijgen zodat over langere tijd de output spanning (=input voor de PID) redelijk in de buurt van die 5614 (= 5.000V) blijft.

Maar ik zie dus veel grotere excursies dan die +/- 1 of 2 die ik zou verwachten.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Er is ook software waarmee ze de optimale parameters zelf kunt bepalen. In jouw geval zou dat kunnen werken omdat je zonder belasting die "PID autotuning" kunt doen.

In een industrieel process is dat ondoenbaar.

Er wordt veel op het internet over gesproken dat het kan maar ik heb nog nooit iets gevonden wat ik in mijn situatie kon gebruiken.

Maar eh: Hoe snel draait je regellus?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Regellus draait iets van 10kHz.

Ik heb de indruk gekregen dat ik een input-sample krijg die "raar hoog" is en dat ie dan een aantal cycli raar doet, waarna het weer enkele cycli duurt voordat eea weer normaal is.

Ik heb nu gemaakt dat als er een "rare waarde" tussen zit, hij de ADC buffer van dan even opslaat.... Ik zie:

En je ziet duidelijk "mooie" metingen, iets meer dan 560, en dan een paar rare van 480 of lager. Vorige keer dat ie triggerde zaten er ook hoge samples bij. (Voor 5.000V is de som van tien stuks ongeveer 5641 dus gemiddeld 564.1 per sample... Kortom, ik heb spijkers in m'n metingen.

Ik overweeg: De spijkers te filteren (dan maar op 9 of 8 samples werken) of synchroon met de PWM te gaan ADC-en.

Ik heb ook een hardware fix voor de dikke pulsen die ik overal zie. Gewoon een ground verkeerd aangesloten. Snap ik nu, maar nog niet toen ik dit ontwierp.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Synchroon samplen lijkt me nogal logisch eigenlijk, anders kun je er toch op rekenen dat je af en toe rommel meet. Wat voor filter heb je nu voor de ADC?

Kun je de stroom meten en daarop regelen? Toevallig weet ik dat jij bordjes hebt liggen die daar specifiek voor ontworpen zijn, en die kunnen dat zelfs cycle-by-cycle doen met de ingebouwde DACs en comparators.

Het vervelende is dat de uitgangsspanning mijn of meer de tweede integraal is van de pulsbreedte. Is dit niet een effect dat bij PWM controllers opgelost wordt met slope compensatie?

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

De stroom wordt gemeten en varieert zo +/- 10 mA als de boel 0mA hoort te leveren.

Als ik die op "nul", maar ongeveer 5V probeer te regelen... wat gaat er dan gebeuren?

Misschien moet ik dit nu even als "goed genoeg" beschouwen en doorgaan met de stroom-terugkoppeling. Voor het laden van Lithium cellen zal het zo ook wel aardig werken, ook al heb ik wat rare golfvormpjes.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Zo. CC mode gisteren aan de praat gekregen. Zojuist ook CCCV mode.

Ik dacht, mwah, ik schakel gewoon op CV mode over als ik het schakelpunt breik. Dat gaat niet goed: Dan ziet ie op een piekje dat ie op CV mode moet overschakelen. Dat is leuk, maar de stroompiek die je dan krijgt omdat ie er nog net niet is... dat is te veel. De labvoeding ging protesteren en wederom gelukkig niets kapot.

Nu kan ie ook weer terugschakelen op CC als de stroom boven de ingestelde stroom komt. Dat zal ie een paar keer doen voordat ie op CV blijft steken.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Waarom zou je zo omschakelen tussen de regelingen? Je kunt ook 2 control loops gebruiken, één voor de stroom en één voor de spanning, en het kleinste resultaat gebruiken. Natuurlijk wel opletten dat de integrator van de ongebruikte loop niet wegloopt; je zou die kunnen bevriezen als de output van die specifieke loop niet gebruikt wordt.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Tja.....

Er is fysiek een omschakeling tussen CC en CV regeling. Mijn labvoeding doet dat ook en heeft een ledje om aan te geven welke regeling actief is.

Dan is de vraag wat DOET jou suggestie nu precies in de praktijk. Als ik in CC mode zit, en de CV regeling mag geen error term accumuleren, dan (accumulatie = huidige output) dan vereenvoudigt de PID regeling tot out = out + error * kP. Om "de kleinste output" te worden moet dus de error*kP term negatief worden. En die error*kP wordt pas negatief als ie voorbij z'n setpoint is.

Dus ik denk dat ik effectief hetzelfde doe, met dien verstande dat ik de het runnen van de nietactieve pid heb weg-ge-optimaliseerd.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Congratulations on your purchase. To begin using your quantum computer, set the power switch to both off and on simultaneously

Je hoeft de integrerende term niet helemaal weg te halen als die regelaar niet actief is, je moet alleen voorkomen dat die (ver) wegloopt. Je zou hem gewoon kunnen clampen, of op een slimmere manier beperken.

Het omschakelen is ook een discontinuïteit in je regelaar; op het moment dat je hem weer actief maakt, is de integrator ofwel leeg, of op de waarde die hij had bij de laatste keer omschakelen, terwijl de spoelstroom intussen flink anders kan zijn, en de ingangsspanning misschien ook wel.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Precies. Dus... conform de tips op die website integreer ik nu kI * error en niet "error".

In "stabiele toestand" dan hoort dat ding gewoon direct gelijk aan "de output" te zijn. dus als ik CC-CV naar 2.5V toemoet, dan gaat de PWM waarde (output) dus richting de 98. Dus op het moment van omschakelen maak ik de andere-integrator-term gelijk aan de laatst berekende OUT (pwm) waarde.

Het probleem en oplossing wordt op deze pagina besproken.

http://brettbeauregard.com/blog/2011/04/improving-the-beginner%e2%80%9…

En dat is dus wat ik doe.

@gatze, Ik ga nog een keer rustig lezen. Het werkt nu voldoende dat ik het kan gebruiken. Optimaliseren kan altijd nog.

Ik heb ondertussen een Lithium 18650 cel opgeladen.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/