Vraag:
Van overdrachtsfunctie naar arduino
MechAvia
2014-09-23 18:16:00 UTC
view on stackexchange narkive permalink

Deze vraag lijkt misschien stom, maar ik ben er al heel lang nieuwsgierig naar.

Dus ik ben een nieuwe technische student en we hebben veel geleerd over "het ontwerpen van een controller". Bijvoorbeeld ontwerpcontroller voor een autostuursysteem enzovoort. Alle "controllers" die we hebben ontworpen, bevinden zich in het Laplace-domein oftewel s-domein. En meestal zal het slechts een overdrachtsfunctie zijn. Dus hoe gebruiken echte ingenieurs van het besturingssysteem deze overdrachtsfuncties in arduino en andere microcontrollers? Ik bedoel, je kunt de functie daar niet zomaar in plaatsen, toch?

Moet je de overdrachtsfunctie naar een andere vorm converteren en de code voor de microcontroller schrijven of is er een eenvoudigere manier om het te doen?

Bedankt voor uw tijd!

Een antwoord:
akellyirl
2014-09-24 14:02:49 UTC
view on stackexchange narkive permalink

Laten we aannemen dat je een Arduino hebt die je hebt afgesproken om een ​​signaal te samplen met een samplefrequentie van 1 / T dat vervolgens wordt verwerkt door je controller. Laten we ook aannemen dat de verwerkingstijd voor uw controller klein is in vergelijking met T, bijv. 0.1 / T

Ten eerste moet u de overdrachtsfunctie van de controller converteren naar discrete tijd. Er zijn veel manieren om dit te doen. Matlab heeft een handige c2d () -functie. Een manier waarop u dit op papier kunt doen (niet de beste manier), is door de methode van Euler te gebruiken.

s = (z-1) / T waarbij T de bemonsteringsperiode is .

Een overdrachtsfunctie omzetten dan: (s + a) / (s + b) => (z- (1-aT)) / (z- (1-bT))

Dus nu heb je een TF in z zoals: Y (z) / X (z) = (zc) / (zd) waar Y de uitvoer is en X is de input.

Om dit in een controller te implementeren heb je dit nodig als differentievergelijking in termen van vertragingen. Dus converteer de vergelijking naar een functie van (z ^ -1) wat een vertraging is:

Y (z) / X (z) = (1-cz ^ -1) / (1 -dz ^ -1)

en herschrijf als: Y (Z) (1-dz ^ -1) = X (z) (1-cz ^ -1 )

Y (Z) -dY (z) .z ^ -1 = X (z) -cX (z) .z ^ -1

en verander naar bemonsteringstijd door z ^ -1 te behandelen als een vertraging: y (n) - dy (n-1) = x (n) - cx (n-1)

herschikken: y (n) = dy (n-1) + x (n) - cx (n-1)

U kunt dit eenvoudig implementeren in de Arduino door te beseffen dat y (n-1) de vorige waarde is van y (n) en op dezelfde manier voor x (n), en x (n) de waarde is die wordt ingevoerd naar de controller; d.w.z. de referentie minus de uitvoer van de ADC.

Kunt u ons een codevoorbeeld geven om dit soort oefeningen te implementeren? Ik zou je erg dankbaar zijn. In mijn geval heb ik een overdrachtsfunctie a / s + a, "a" is een waarde die moet worden ingevoerd via een toetsenbord dat is verbonden met de arduino mega, ik heb de bewerkingen als volgt berekend met behulp van de tustin-methode: a1Z + a2 / b1Z + b2 waarbij elke waarde is: a1 = a2 = (aT / aT + 2); b1: is altijd 1; en b2: aT-2 / aT + 2. T is de sample tijd. Zoals je kunt zien heb ik alles berekend, maar ik heb problemen met de programmeercode in arduino mega, als je me kunt helpen zou ik heel dankbaar zijn.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...