Programvara för A/D - D/A - kort Till kortet hör en programvara. Denna betår av ett antal filer vilka du behöver flytta till ditt eget h:\. MÄLARDALENS HÖGSOLA Intitutionen för elektronik HÅRDVARULABORATION 4-6 i LR130 Sytem- och reglerteknik Dea laborationer avluta med att ni ka reglera reella fyikalika proceer. Meningen är att vi nu ka gå från imulering till hårdvaruimplementering. Du ka få träning i att programmera och förtå hur en regulator kan dikretiera. Vi kall reglera nedantående proceer. 1. retproce med överföringfunktionen G ( ) (eller G ( ) ( + 1) omkopplare tyr ordningen på proceen.). Vinkelervo med överföringfunktionen G( ) mätning. Då τ << 1 och << 1 e m 4 ( 1+τ )( 1+ ) e τ m 4 + ( 1) 3 τ kan proceen approximera med ( ). En, där betäm utifrån G. 3. En baneproce med både ett vinkelervo och en approximerad överföringfunktion G ( ), e nedan. I laborationen kommer vi att använda ett A/D-D/A-kort. Nedan en kort bekrivning av detta. A/D - D/A - kort Detta kort är ett intickkort för PC. ortet har 16 analoga ingångar (kanaler, ingle ended), amt analoga utgångar (kanaler). Vi kommer att maximalt använda t analoga ingångar och 1 analog utgång. Alla kanaler finn utdragna till ett plintkort om finn på repektive labbänk. Se bilagan it i denna laborationhandledningen. Titta igenom kelettfilen daq.cpp. Se peciellt följande: Samplingen tyr av en leepfunktion, vilket innebär att vi behöver underöka vilken amplingtiden är vid varje ny omprogrammering (mer kod betyder att leepen måte minka i amma grad). Ob att argumentet i leepfunktion är i milliekunder. I kontantdefinieringen (NUM) betäm hur många ampel ka ta in (d v den betämmer alltå totala exekveringtiden). Programavnittet // Spar Matlabfil, par alla intreanta variabler i en fil med namnet data.m. Detta för att vi i MATLAB kall kunna viualiera våra variabler. ompilering kommer att preentera vid laborationtillfället. Tetning av A/D - D/A kort, amt kalibrering Signalerna in och ut från A/D-D/A kortet finn på de må plintarna vid datorn, analog input rep. analog output. Obervera att input är kanal 0-15 (A/D 0-15 i cpp-programmet) och att output är kanal 1- (D/A 0-1 i cpp-programmet). oppla upp ignalgeneratorn med inu ca V topp till topp och 1 Hz till A/D-15 och Tektronix-ocillokopet till D/A-0. Se till att följande rader finn med i cpp-filen. (Raderna kan placera där vi är anviade att kriva regulatorkod.) yad(15); // Anropar AD-funktionen i daq.cpp DA(y,1); // Lägger ut y på DACen ompilera och kör programmet (tar ca 0 ek). Om ditt ytem fungerar kall du att e inuignalen på ocillokopet. alibrering av kortet måte vi göra mjukvarumäigt då intickkortet i datorn är oåtkomligt. Offet få både på in och ut (gör gärna en papperki). Vi löer detta genom att läa in (A/D) amt kriva ut (D/A) en lågfrekvent fyrkantignal. Använd frekvengeneratorn och fyrkantvåg ca Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 1 Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07
1Hz och amplitud 1- volt. Genom mätning och användning av MATLAB får vi fram ungefärliga offetignaler. ompenera dea offetignaler mjukvarumäigt i din daq.cpp. (t ex DA(r + offet, 0)). Nu till MATLAB. Ställ dig i rätt katalog, dv där du kapat ditt projekt. Skriv kommandot data och du läer in ett antal vektorer. Gör plot([r u y]) eller plot(t,[r u y]). (tidvektorn t får du med kommandot t(0:length(y)-1)*t ); Ser nu grafen okey ut, å börja då att programmera din regulator. Programmering av regulator Den tiddikreta regulatorn lägg in i kelettfilen. Du er var i filen daq.cpp algoritmen kan lägga Nu behöver du använda PI-algoritmen med bakåträkning på idan 159 i kompendiet. Vad blir tigtiden t r, överlängen M p, invängningtiden t amt det tatika felet e o?. 4. IMC -reglering. (OBS, ätt omkopplaren på :a ordningen proce) Pröva nu PID-algoritmen med bakåträkning med en :a ordningen IMC-regulator. Sätt t 1 ek. Tip, kriv en criptfil i MATLAB om beräknar regulatorparametrarna. r Vad blir nu famarginalen? Blir tigtiden t r korrekt? Få något tatikt fel e o?. P- reglering av vinkelervot. (behåll börignalen r). Obervera att alla nya parametrar och variabler måte initiera. Hur en regulator programmera hittar du i kurkompendiet Procereglering på idorna 156-160. Hur den fungerar viar du med näta uppgift. 1. Experimentbaerad regulatordeign för retproceen. Vi kall reglera kretproceen med en experimentbaerad regulator vilken bekriv i Procereglering på idan 13-133. Obervera att omkopplaren kall tå på 3:de ordningen proce. 1. Självvängningexperiment. Hur tort p kräv jälvvängning? Vilken blir periodtiden T o?. P-reglering. Hur tort p kräv för att få famarginalen o ϕ m 45. Låt nu börignalen vara ett teg (d v den börignal om finn i daq.cpp) och regulatorn det framräknade p. Vad blir tigtiden t r, överlängen M p, invängningtiden t amt det tatika felet e o? Reultatet finn i den loggade filen data.m. Stämmer detta? 3. PI-reglering (enligt Åtröm-Hägglund parameterval). Näta proce att reglera blir banan vinkelervo. Obervera att vi kan e ervot om en integrator. Vi måte fört identifiera den tatika förtärkningen i proceen. Hur gör du det? Gör det! 1. P-reglering Betäm Extra! p i en P-regulator å att du får en bandbredd på ca 0 rad/. Låt börignalen vara ett teg. Vad blir tigtiden t r? Här vill labbaiten e hur ni gjort. Programmera en ramp, vilken ka använda om börvärde, d v låt r gå från t ex till + V. Behåll din P-regulator och underök det k hatighetfelet e 1. Få ett ådant fel? Om, hur kommer vi i å fall tillrätta med det?. PI-reglering Betäm nu o ϕ m 60. p och i via lag-kompenering å att vi får en famarginal på mint o 60, Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 3 Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 4
3. Reglering av baneproce. u Regulator Vinkelervo Motor F ( ) ( ) G p ulbaneproceen är ett olinjärt ytem. φ ulbana y r θ Momentekvationen kan då förenkla till d θ F r m g in dt J + r m r m r 5 7 ( φ) r 5 g in( φ) 7 r Vi är nu inte intreerade av vinkelpoitionen θ utan av den aboluta poitionen Ekvationen kan då kriva om på följande ätt: 1 d y 5 g in r dt 7 r d y 5 g in dt 7 ( φ ) ( φ ).. y r θ. θ Om denna ekvation linjäriera kring arbetpunkten φ 0 0, d v horiontalläget, få då med hjälp F m g in φ A F g m g y r θ Nedan ge en härledning av differentialekvationen om bekriver hur an poition y beror av banan vinkelläge φ. Följande beteckningar gäller nedan: φ banan vinkelpoition [rad] θ an vinkelpoition, antalet varv den har rullat [rad]. r radien ho an [m] y r θ an läge på banan [m] F g m g tyngdkraften [N] Följande kraftmomentekvation i punkten A kan tälla upp för an rörele. d ( J r m r) F r + dt θ (vridmomentet), där m J r an tröghetmoment [ kg 5 m φ ] och F m g inφ kraften om ätter an i rörele [N]. φ av MacLaurin-utvecklingen för inu: 3 ( ) d y 5 g φ O φ. dt 7 Den linjärierade ekvationen blir då: d y 5 g φ 7 dt och överföringfunktionen blir G ( ) ( ) Y. φ φ, d v 5 g 7 Av överföringfunktionen er vi att vi har en dubbelintegrator. Om vi integrerar en kraft/acceleration får vi hatigheten, ytterligare en integration ger poitionen. Vinkelervot är nabbare än banedynamiken (e datorövning 4), vilket innebär att approximationen φ ( t) u( t) kan göra. Detta innebär att ( t) u blir vinkelervot referenignal och att utignalen (vinkeln) blir tyrignal för baneproceen. Obervera att vi måte kakadreglera, amt att överföringfunktionen från tyrignal u ( t) till poition ( t) y blir G totl ( ) ( ) Y. U Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 5 Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 6
Reglering av banan. 1. P-reglering (obervera kakadreglering!) P-regulator Vinkelervo+ulbana r(t ) + u(t) GP() y(t) F() P Behåll vinkelervot P-regulator. Programmera och provkör banan med en P-regulator. Börja med en låg förtärkning 0. 5, öka på denna gradvi. Vilken typ av ytem får vi?. p. PD-reglering Vi kontruerar nu en PD-regulator (lead-kompenering) enligt kompendiet Procereglering på formen: F ( ) p Td + 1 T + 1 f för att tabiliera banan. Obervera, använd PD-algoritm med bakåträkning Bilaga: Hur man kapar ett projekt i MVC++ 1.) Starta Microoft Viual C++ 6.0.) Menyn File -> New 3.) Dialogflik Project -> Win3 Conole Application 4.) Skriv i location h:\ 5.) Skriv ett namn på projektet i rutan Project name 6.) Tryck O 7.) Välj An empty project 8.) Tryck Finihed 9.) opiera filerna 811PG.dll, 811PG.lib, DLL.h, daq.cpp till katalogen på h:\<projekt namn> (Dea filer kall ligga på L:\IEL\REGLER \REGLAB\) 10.) Lägg till dea filer i projektet genom att välja Project -> Add to Project -> File 11.) Skriv *.* i file name rutan och tryck enter. Markera nu de fyra ovantående filer genom att hålla in CTRL och klicka på filerna. 1.) Tryck O. 13.) lart!! Nedan kelettfilen daq.cpp #include <tdio.h> #include <conio.h> #include <window.h> #include "DLL.h" (Tip, kriv även här en criptfil i MATLAB om beräknar regulatorparametrarna.) Här är de två deignparametrarna önkad kärfrekven ω c och önkad famarginal ϕ m. För att få något vettigt värde på valet av kärfrekven kan vi utgå ifrån proceen egen kärfrekven och prova med värden under ω c och ovanför detta. Teta och pröva igen. #define NUM 000 #define umax 10 #define umin -10 #define BASE 0x0 #define t 8 #define T 0.01 // Styr hur lång tid vi kör programmet // Samplingtid i m // Samplingtid i ek 3. PID-reglering Vi använder PID-regulatorn (lead/lag-kompenering) enligt kompendiet på formen: F ( ) Td + 1 Ti + 1 p T + 1 T för att ockå eliminera kvartående fel. Hur fungerar nu regleringen? Via labbaitenten! För att ha någon törre glädje av att ha reglerat an på banan vill vi att ni doku-menterar de teg ni har gjort för att lycka. Denna dokumentation kan lägga it i den rapport ni gör för Datorövning 4. f i // Här kan du lägga dina regulatorparametrar BOOL mdelay(word cont miliec); double AD(int ch); void DA(double val, int ch); int main(void) // Variabel Deklaration FILE *fp; int i,j 0; double r 0,u 0,y1,y; double rvec[num],uvec[num],yvec[num]; // Initiera ACL81PN kortet W_81_Initial(CARD_1, BASE); Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 7 Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 8
// Regler / Styrloop // while(!kbhit()) // Här gäller evighetloop for(i 0;i < NUM; i++) // Inaktivera om evighetloop // Att kapa börvärde, t ex /* Börignal teg */ // j++; // if(j 000) // j 0; // if(j < 500) // r 0; /* Förta 5 ek 0 V */ // ele // r 1; /* en 1 V */ // Hämta data från A/D-omvandlaren y1 AD(15); // A/D kanal 15 y AD(1); // A/D kanal 1 /*****************************************************/ // Här kan din Algoritm implementera /*****************************************************/ // Spara vektorer för Matlab rvec[i] r; uvec[i] u; yvec[i] y1; // Lägg ut data på D/A-omvandlaren DA(y1, 0); // D/A kanal 0 DA(y, 1); // D/A kanal 1 // Fördröjning mdelay(t); // Den omtalade "leep"-funktionen // Ta tangentbordtryckningen för evighetloopen // _getch(); // Sätt DA-omvandlarna till noll DA(0, 0); DA(0, 1); printf("\nalgoritm avlutad\n\n"); _getch(); mdelay(1000); // Spara Matlabfil if((fpfopen("data.m","w"))!null) fprintf(fp,"r [\n"); for (j 0; j < i; j++) fprintf(fp,"%f\n",rvec[j]); fprintf(fp,"];\n y [\n"); for (j 0; j < i; j++) fprintf(fp,"%f\n",yvec[j]); fprintf(fp,"];\n u [\n"); for (j 0; j < i; j++) fprintf(fp,"%f\n",uvec[j]); fprintf(fp,"];\n"); fcloe(fp); return 0; BOOL mdelay(word cont miliec) tatic BOOL binit TRUE; tatic LARGE_INTEGER lifreq; LARGE_INTEGER lireference; LARGE_INTEGER licount; DWORD dwreult; if( binit ) if(!queryperformancefrequency(&lifreq) ) return FALSE; ele binit FALSE; QueryPerformanceCounter(&liReference); while(1) QueryPerformanceCounter(&liCount); if( lireference.highpart licount.highpart ) dwreult licount.lowpart - lireference.lowpart; if( ( dwreult * 1000 / lifreq.lowpart ) > miliec ) return TRUE; ele dwreult (0xffffffff - lireference.lowpart) + licount.lowpart; if( ( dwreult * 1000 / lifreq.lowpart ) > miliec ) return TRUE; return TRUE; double AD(int ch) tatic int ad_data_old 0; int ad_data; W_81_AD_Set_Channel(ch); Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 9 Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 10
if(w_81_ad_aquire(&ad_data)! ERR_NoError) printf("a/d error.\n"); exit(0); ad_data (ad_data - ad_data_old < -1900)? ad_data + 048: ad_data; ad_data_old ad_data; return(ad_data - 048) / 04.7; void DA(double val, int ch) double val; val val; if(val < -10) val -10; if(val > 10) val 10; W_81_DA(ch, (unigned int) (048 + 04.7 * val)); Fil: Reglab1--3 Joop Lundqvit IEl 003-10-07 11