Experimentul Quanser Pendulul Invers Rotativ
CUPRINS
1 INTRODUCERE
1.1 SCOPUL
2 SISTEME DE REGLARE
2.1 STRUCTURA GENERALĂ A UNUI SISTEM DE CONDUCERE
2.2 LEGI TIPIZATE DE REGLARE
2.2.1 Prezentare generală
2.2.2 Element Proporțional Integrator Derivator ideal ( PID ideal )
2.2.3 Element Proporțional Integrator Derivator real
2.2.3.1 Conexiune paralelă dintre un element I si un element PD real
2.2.3.2 Conexiune paralelă dintre un element PI și un element D real
2.2.3.3 Conexiune serie dintre un element PID real și un filtru trece-jos
2.3 DISCRETIZAREA FUNCȚIEI DE TRANSFER A UNUI ELEMENT PID
3 PREZENTAREA PLĂCII DE DEZVOLTARE DSPIC PRO4
3.1 PREZENTARE GENERALĂ
3.1.1 Principalele caracteristici ale plăcii de dezvoltare dsPIC PRO4
3.1.2 Microcontroler
3.1.3 Conector USB
3.1.4 Interfața serială RS-232
3.1.5 Convertorul digital-analogic
3.1.6 Ceas de timp real
3.1.7 LED-uri
3.1.8 Butoane
3.1.9 Afișajul LCD
3.1.10 Afișaj LCD graphic
3.1.11 Touch Panel
3.1.12 Convertoare analog-numerice
3.1.13 Pini pentru acces direct la microcontroler
3.2 O SCURTĂ PREZENTARE A FACILITĂȚILOR MICROCONTROLERULUI DSPIC30F6014A
3.2.1 Prezentare generală
3.2.2 Caracteristicile Perifericelor
3.2.3 Caracteristici Analogice
4 PENDULUL ROTATIV
4.1 DESCRIERE
4.2 SISTEM DE CLASIFICARE ȘI COMPONENTE
4.3 CONFIGURAȚIA SISTEMULUI ȘI ANSAMBLAREA
4.4 ENCODER (COMPONENTA 4)
5 MOTORUL DE CURENT CONTINUU QUANSER SRV 02
5.1 DEDUCEREA MODELULUI MATEMATIC. CALCULUL FUNCȚIEI DE TRANSFER.
5.2 DISCRETIZAREA FUNCȚIEI DE TRANSFER.
6 MODELUL MATEMATIC AL PENDULULUI ROTATIV INVERS
6.1 DERIVAREA SISTEMUL DE ECUAȚII DINAMICE.
7 DRIVERE ȘI HANDLERE UTILIZATE
7.1 DRIVERUL MCU (MICROCONTROLLER UNIT)
7.1.1 Descrierea modulului
7.1.2 API-URI
7.2 DRIVERUL DE GPT (GENERAL PURPOSE TIME)
7.2.1 Descrierea modulului
7.2.2 API-uri
7.2.3 Dependințe de alte module:
7.3 DRIVERUL PWM (PULSE WIDTH MODULATION)
7.3.1 Descrierea modulului
7.3.2 API-uri
7.3.3 Dependințe de alte module
7.4 DRIVERUL ENCODER
7.4.1 Descrierea modulului
7.4.2 API-uri
7.5 HANDLERUL BRGDH (BRIDGE)
7.5.1 Descrierea modulului
7.5.2 API-uri
8 CONVERSIA EXPERIMENTULUI DIN MEDIUL SIMULINK MATLAB IN COD C
8.1 INTRODUCERE
8.2 COMPONENTA Q_SRV02_ROTARY_PENDULUM_SE_MULTIQ
8.3 COMPONENTA SRV02-E ROTPEN-E
8.4 COMPONENTA SWING UP CONTROLLER
8.5 COMPONENTA CONTROL STATE
9 CONCLUZII
10 BIBLIOGRAFIE
11 REFERINȚE WEB
A. CODUL SURSĂ
C. CD / DVD
INDEX
LISTA FIGURILOR
Figura 2-1 Structura generală a unui sistem de conducere 19
Figura 3-1 Placa de dezvoltare dsPIC PRO4. 25
Figura 3-2 Microcontroller-ul dsPIC30F6014A 26
Figura 3-3 Conector USB și depanator integrad mkroICD ( In Circuit Debugger ) 26
Figura 3-4 Infertața serială 27
Figura 3-5 Convertor digital-analogic 27
Figura 3-6 Ceas de timp real 28
Figura 3-7 Dispunerea LED-urilor 29
Figura 3-8 Butoane 30
Figura 3-9 Afișaj LCD alphanumeric 30
Figura 3-10 Potențiometru pentru selectarea contrastului afișajului LCD 31
Figura 3-11 Afișaj LCD grafic 31
Figura 3-12 Convertoare analog-numerice și testere 32
Figura 3-13 Port-uri pentru accesul direct la pinii microcontroller-ului 33
Figura 3-14 Diagrama bloc a dispozitivului dsPIC30F6014A 36
Figura 4-1 ROTPEN – Optiunea Encoder 38
Figura 4-2 ROTPEN 39
Figura 4-3 Contents of ROTPEN Package 40
Figura 4-4 Tightening the setscrew 41
Figura 4-5 Attaching to the SRV02 42
Figura 4-6 Encoder Wiring 43
Figura 5-1 Schema electrică a motorului de curent continuu 43
Figura 5-2 Schema mecaniă a motorului de curent continuu 45
Figura 5-3 Modeul Simulink pentru o periodă de 0.1 49
Figura 5-4 Răspunsul motorului la o perioadă de eșantionare de 0.1 50
Figura 5-5 Modeul Simulink pentru o periodă de 0.01 50
Figura 5-6 Răspunsul motorului la o perioadă de eșantionare de 0.1 50
Figura 6-1 SRV02 w/ ROTPEN Module 52
Figura 6-2 Top View of Rotary inverted pendulum 53
Figura 6-3 Side View with Pendulum in Motion 54
Figura 7-1 Inițialiarea Modulelor 58
Figura 7-2 Semanlul PWM 62
Figura 8-1 Structura unui timer 67
Figura 8-2 q_SRV02_Rotary_Pendulum_SE_MultiQ 69
Figura 8-3 SRV02-E ROTPEN-E 71
Figura 8-4 Puntea H 72
Figura 8-5 Swing Up Controller 75
Figura 8-6 Swing Up Logic 76
Figura 8-7 Ieșirea blocului "Repeating Sequence" 77
Figura 8-8 Control State 79
LISTA TABELELOR
Tabel 4-1 Numele componentelor 38
Tabel 6-1 Descrierea simbolurilor 53
Introducere
Scopul
Obiectivul în acest experiment este de a proiecta o reglare dupa stare pentru modulul pendulul invers rotativ folosind placa de dezvoltare DSPIC PRO4. Controlerul va menține pendulului în poziție inversată (verticală) și ar trebui să fie robust în scopul de a menține stabilitatea acesteia în cazul unei perturbări.
Pânǎ la finalizarea experimentului, următoarele puncte vor fi atinse:
• Modelul matematic al sistememului pendul invers rotativ.
• Liniarizarea modelului despre un punct de echilibru.
• Utilizarea metodei LQR în proiectarea unei reglari dupa stare.
• Utilizarea feedback-ul pentru a stabiliza un sistem instabil.
Lucrarea are la bazǎ experimentul Quanser „Pendulul Invers Rotativ” realizat in mediul Simulink Matlab iar scopul principal al acestei lucrǎri este traducerea aplicației Simulink Matlab in limbaj de programare C folosit in aplicații embedded.
Sisteme de reglare
Structura generală a unui sistem de conducere
În orice sistem de conducere automată se deosebesc următoarele patru elemente interconectate ca în Fig. 1.1. :
Figura – Structura generală a unui sistem de conducere
Obiectul condus;
Dispozitivul de conducere;
Elemente de execuție;
Sistemul informatic de culegere și transmitere a informațiilor privind obiectul condus;
Dispozitivul de conducere elaborează decizii care se aplică obiectului condus, prin intermediul elementelor de execuție pe baza mărimilor măsurate. Deciziile de conducere au ca scop respectarea unor criterii de calitate, a satisfacerii unor restricții când asupra obiectului acționează o serie de factori perturbanți.
Structura de mai sus este o structură de conducere în circuit închis, deoarece la elaborarea deciziilor se ține cont de mărimile măsurate. Dacă ar lipsi legătura de reacție sistemul ar fi în circuit deschis.
Un sistem de conducere în structura de mai sus se poate numi sistem de conducere automată deoarece este capabil să elaboreze decizii de conducere folosind mijloace proprii de informare.
Un caz particular de sisteme de conducere automată îl constituie sistemele de reglare automată.
Prin sistem de reglare automată se înțelege un sistem de conducere automată la care scopul conducerii este exprimat prin anularea diferenței dintre mărimea condusă și mărimea impusă, diferență care se mai numește abatere sau eroarea sistemului.
Procesul de anulare a erorii într-un sistem de reglare automată se efectuează folosind două principii:
Principiul acțiunii prin discordanță – în acest caz, acțiunea de reglare apare numai după ce abaterea sistemului s-a modificat datorită variației mărimii impuse sau a variației mărimii de ieșire provocată de variația unei perturbații.
Principiul compensației – una sau mai multe mărimi perturbatoare sunt măsurate și se aplică la elementele de execuție, comenzi care trebuie să compenseze pe această cale efectul acestor perturbații asupra mărimii de ieșire transmis pe cale naturală. Are avantajul că poate realiza, în cazul ideal, compensarea perfectă a anumitor perturbații fără ca mărimea de ieșire să se abată de la programul impus. Are dezavantajul compensării numai a anumitor perturbații, nu a oricăror perturbații .
Un sistem de reglare care îmbină cele două principii se numește sistem de reglare combinată.
Legi tipizate de reglare
Prezentare generală
În practica industrială a reglării automate s-au impus așa numitele legi de reglare de tip PID ( proportional – integrator – derivator ) care satisfac în majoritatea situațiilor cerințele tehnice impuse sistemelor de reglare convențională.
Se pot utiliza diverse combinații ale celor trei componente: proportional, integrator sau derivator.
Prin utilizarea acestor legi tipizate în cadrul unor regulatoare tipizate, proiectarea dimensional valorică a legii de reglare se reducere la alegerea tipului de lege și poziționarea unor butoane prin care se prescriu valorile parametrilor acestor legi rezultate în urma proiectării analitice a sistemului.
Nu se poate stabili precis efectul fiecărei componente a unei legi de reglare asupra calității unui sistem de reglare automată deoarece acestea depinde de instalație.
Componenta proporțională, cu factorul de proporționalitate K, determină o comandă proporțională cu eroarea sistemului.
Componenta integrală, exprimată prin constanta de timp de integrare T, determină o comandă proporțională cu integrala erorii sistemului . Un regim staționar este posibil numai dacă această eroare este nulă.
Componenta derivativă, exprimată prin constanta de timp de derivare , determină o comandă proporțională cu derivata erorii sistemului.
Element Proporțional Integrator Derivator ideal ( PID ideal )
Funcția de transfer a unui element PID ideal are forma:
– factorul de proporționalitate
– constanta de timp de integrare
– constanta de timp de derivare
Element Proporțional Integrator Derivator real
După modul de realizare fizică se deosebesc mai multe structuri.
Conexiune paralelă dintre un element I si un element PD real
Funcția de transfer are forma:
Conexiune paralelă dintre un element PI și un element D real
Funcția de transfer realizată este:
Conexiune serie dintre un element PID real și un filtru trece-jos
Discretizarea funcției de transfer a unui element PID
În urma masivei dezvoltări a sistemelor numerice a venit și necesitatea de realizare a regulatoarelor sub formă numerică. Avantajele folosirii sistemelor numerice pentru implementarea regulatoarelor sunt:
Posibilitatea de realizare software a regulatoarelor;
Ușurința de modificare a regulatoarelor;
Flexibilitate;
Posibilitatea de păstrare a evoluției în memorie;
Pentru a putea implementa un regulator numeric pentru a controla un proces continuu semnalele primite de la traductoare trebuie să fie eșantionate ( discretizate ). Aceasta înseamnă că semnalul nu mai este continuu, ci este construit dintr-o multitudine de puncte măsurate la anumite intervale de timp bine determinate.
Perioada dintre două masurători se numește perioadă de eșantionare
În urma acestor modificări apare necesitatea de a calcula o formă discretă a funcției de transfer pentru regulatoarele numerice.
Funcția de transfer discretizată are forma:
Prezentarea Plăcii de dezvoltare dsPIC PRO4
Prezentare generală
Placa de dezvoltare dsPIC PRO4 este produsă de MikroElectronika și reprezintă o soluție bună pentru implementarea regulatoarelor deoarece este construit cu port-uri pentru intrări și ieșiri analogice.
Este ușor de programat prin cablu USB de la calculator, și poate fi alimentat separat de la o sursa a cărei tensiune poate varia între 9 și 32V.
Este echipată cu microcontroler dsPIC30F6014.
Principalele caracteristici ale plăcii de dezvoltare dsPIC PRO4
În continuare sunt prezentate unele dintre facilitațile oferite de placa de dezvoltare dsPIC PRO4. Ele se pot vedea pe Fig. 3.1.
Alimentare externă 9-32V , curent continuu sau alternativ;
Conector USB 2.0 prin intermediul căruia poate fi programat și alimentat;
Conector serial RS232-A;
Conector serial RS232-B;
Referința voltajului 4.096V;
Conector Ethernet;
Afișaj alfanumeric LCD 2×16;
Potențiometru pentru stabilirea contrastului afișajului LCD;
Convertoare analog-digitale și potențiometre pentru testarea acestora, sau pentru simularea unor semnale;
Conector pentru senzor de temperatură tip DS1820;
Stabilirea rezistenței pentru fiecare port în parte;
Ceas de timp real;
Convertor numeric-analogic;
Conector serial RS485;
Conector CAN;
LED-uri corespunzând fiecărui pin al microcontroller Funcția de transfer realizată este:
Conexiune serie dintre un element PID real și un filtru trece-jos
Discretizarea funcției de transfer a unui element PID
În urma masivei dezvoltări a sistemelor numerice a venit și necesitatea de realizare a regulatoarelor sub formă numerică. Avantajele folosirii sistemelor numerice pentru implementarea regulatoarelor sunt:
Posibilitatea de realizare software a regulatoarelor;
Ușurința de modificare a regulatoarelor;
Flexibilitate;
Posibilitatea de păstrare a evoluției în memorie;
Pentru a putea implementa un regulator numeric pentru a controla un proces continuu semnalele primite de la traductoare trebuie să fie eșantionate ( discretizate ). Aceasta înseamnă că semnalul nu mai este continuu, ci este construit dintr-o multitudine de puncte măsurate la anumite intervale de timp bine determinate.
Perioada dintre două masurători se numește perioadă de eșantionare
În urma acestor modificări apare necesitatea de a calcula o formă discretă a funcției de transfer pentru regulatoarele numerice.
Funcția de transfer discretizată are forma:
Prezentarea Plăcii de dezvoltare dsPIC PRO4
Prezentare generală
Placa de dezvoltare dsPIC PRO4 este produsă de MikroElectronika și reprezintă o soluție bună pentru implementarea regulatoarelor deoarece este construit cu port-uri pentru intrări și ieșiri analogice.
Este ușor de programat prin cablu USB de la calculator, și poate fi alimentat separat de la o sursa a cărei tensiune poate varia între 9 și 32V.
Este echipată cu microcontroler dsPIC30F6014.
Principalele caracteristici ale plăcii de dezvoltare dsPIC PRO4
În continuare sunt prezentate unele dintre facilitațile oferite de placa de dezvoltare dsPIC PRO4. Ele se pot vedea pe Fig. 3.1.
Alimentare externă 9-32V , curent continuu sau alternativ;
Conector USB 2.0 prin intermediul căruia poate fi programat și alimentat;
Conector serial RS232-A;
Conector serial RS232-B;
Referința voltajului 4.096V;
Conector Ethernet;
Afișaj alfanumeric LCD 2×16;
Potențiometru pentru stabilirea contrastului afișajului LCD;
Convertoare analog-digitale și potențiometre pentru testarea acestora, sau pentru simularea unor semnale;
Conector pentru senzor de temperatură tip DS1820;
Stabilirea rezistenței pentru fiecare port în parte;
Ceas de timp real;
Convertor numeric-analogic;
Conector serial RS485;
Conector CAN;
LED-uri corespunzând fiecărui pin al microcontroller-ului;
Întrerupătoare pentru activare/dezactivare LED-uri;
Suport pentru microcontroller-e cu 64 sau 80 pini;
Întrerupătoare pentru activarea/dezactivarea componentelor plăcii;
Connectori pentru accesul direct la pinii microcontroller-ului;
Cititor card-uri de memorie tip MMC și SD;
Buton pentru resetarea circuitului;
Butoane corespunzând fiecarui pin al microcontroller-ului;
Conector pentru Touch Panel;
Conector pentru afișaj LCD grafic;
Potențiometru pentru stabilirea contrastului afișajului LCD grafic;
Controller pentru Touch Panel;
Jumperi pentru stabilirea rezistențelor port-urilor;
Figura – Placa de dezvoltare dsPIC PRO4.
Microcontroler
Placa de dezvoltare dsPIC PRO4 folosește microcontrolerul dsPIC30F6014A
( Fig. 3.2 ), însă acesta se poate schimba cu oricare alt microcontroller cu 64 sau 80 de pini.
Schimbarea microcontroller-ului de pe placă se face ușor, având grijă ca pinii să nu fie îndoiți sau rupți.
Pinii microcontroller-ului sunt conectați la diferite periferice ale plăcii (interfață serială, ethernet, convertoare, etc).
Toți pinii sunt conectați la LED-uri, asta făcând foarte ușoară monitorizarea stării acestora în timpul aplicațiilor.
Figura – Microcontroller-ul dsPIC30F6014A
Conector USB
Programarea dsPIC se face direct de la calculator prin intermediul interfeței USB, fară să fie nevoie de circuite suplimentare pentru programare.
Deasemenea, placa dsPIC PRO 4 conține un depanator integrat ( Fig. 3.3 ), acesta comunicând cu calculatorul pentru ajutorul depanării programelor scrise pentru acesta.
Figura – Conector USB și depanator integrad mkroICD ( In Circuit Debugger )
Interfața serială RS-232
Comunicațiile pe interfața serială sunt folosite de obicei în aplicațiile de achiziție de date facilitând transferul de date dintre microcontroler și calculator.
Placa dsPIC PRO4 este prevăzută cu 2 conectoare seriale, acestea putând fi activate prin intermediul jumperilor J12-J15.( Fig. 3.4)
Figura – Infertața serială
Convertorul digital-analogic
Convertorul digital-analogic operează pe 12 biți, transformând valoarea digitală în curent analogic la ieșire. Tipul convertorului este MCP4921(Fig. 3.5).
Figura – Convertor digital-analogic
Ceas de timp real
Ceasul de timp real PCF8583P este folosit pentru a îmbunătăți performanțele microcontrolerului în aplicații în timp real (Fig. 3.6). Acesta are o frecvență de 10MHz și trimite microcontroller-ului întreruperi când acesta este activat din program.
În aplicațiile de reglare automată, ceasul de timp real este folosit pentru alegerea perioadei de eșantionare pentru discretizarea semnalului analogic. În funcție de perioada de eșantionare, ceasul de timp real poate fi programat printr-un registru pentru a da întreruperi începând de la secunde, până la o secundă.
Pentru a activa ceasul de timp real, comutatorul 8 al grupului de comutatoare SW2 și comutatoarele 7 si 8 ale grupului de comutatoare SW 4 sa fie în starea ON.
Figura – Ceas de timp real
LED-uri
LED-urile ( Light emitting diode ) , diode emițătoare de lumină, sunt componente folosite în principal pentru a vizualiza starea pinilor microcontroller-ului(Fig. 3.7).
LED-urile sunt în număr de 67 și pot fi activate/dezactivate prin intermediul grupului de comutatoare SW1. Fiecare comutator din acest grup îi corespunde un grup de LED-uri corespunzătoare port-urilor microcontroller-ului.
Pinii microcontroller-ului se împart în 9 grupuri de pini numite port-uri. Aceste porturi sunt denumite astfel: PORTA, PORTB low, PORTB high, PORTC, PORTD low, PORTD high, PORTF, PORTG low, PORTG high.
Figura – Dispunerea LED-urilor
Butoane
Placa de dezvoltare dsPIC PRO4 conține deasemenea 67 butoane de apasare corespunzătoare fiecarui pin al microcontroller-ului și implicit, fiecărui LED de pe placă(Fig. 3.8). La apăsarea unuia dintre butoane, prin pin-ul corespunzător al microcontroller-ului trece o tensiune echivalentă cu starea “1” logic, adica 5V și implicit, LED-ul corespunzător se aprinde.
Figura – Butoane
După cum se observă în figurile 3.7 și 3.8 repartiția butoanelor pe placă este similară cu cea a LED-urilor.
Afișajul LCD
Afișajul LCD 2×16 ( 2 rânduri și 16 coloane ) poate afișa caractere standard și este cea mai răspândită componentă pentru vizualizare a datelor(Fig. 3.9). Poate afișa mesaje pe 2 linii, caractere alfanumerice. Fiecare caracter este construit din 5×8 pixeli. Afișajul comunică cu microcontroller-ul printr-o magistrală de date pe 4 biți.
Figura – Afișaj LCD alphanumeric
Contrastul afișajului alfanumeric LCD poate fi modificat prin intermediul unui potențiometru ca în Fig. 3.10.
Figura – Potențiometru pentru selectarea contrastului afișajului LCD
Afișaj LCD graphic
Afișajul LCD grafic reprezintă o metodă avansată pentru afișarea mesajelor vizuale. În timp ce display-ul LCD poate afișa doar caractere alfanumerice, afișajul grafic poate afișa mesaje sub formă de poze sau desene(Fig. 3.11).
Rezoluția este de 128×64 pixeli, iar contrastul poate fi modificat prin intermediul unui potențiometru similar cu cel din Fig. 3.10.
Figura – Afișaj LCD grafic
Touch Panel
Touch panel-ul este o folie subțire, transparentă care poate fi pusă peste display-ul grafic. El este format din două folii separate formând o structură de tip “sandwich” .
Este foarte sensibil la atingere, până și cea mai ușoara apăsare va modifica voltajul de ieșire.
Convertoare analog-numerice
Placa de dezvoltare dsPIC PRO4 este prevăzută cu 8 porturi ce pot realiza conversia analog numerică. Acești pini corespund portului PORTB high al microcontrolerului. Tensiunea de intrare poate fi între 0 și 5V, valoare transformată într-un număr pe 12 biți, adică între 0 și 4096.
Pe lângă convertoarele analog-numerice, placa este prevăzută și cu două potențiometre ce pot produce un semnal între 0 și 5V pentru testarea programelor ce folosesc convertorul analog-numeric(Fig. 3.12). Deasemenea aceste potențiometre pot avea diferite aplicații, spre exemplu pentru a specifica referința unui regulator implementat pe aceasta placă.
Figura – Convertoare analog-numerice și testere
Convertoarele analog numerice sunt foarte importante la folosirea microcontrolerului ca regulator sau pentru conducerea proceselor, deoarece nu mai este nevoie de folosirea de circuite suplimentare pentru măsurarea mărimilor procesului ce trebuie controlat.
Pini pentru acces direct la microcontroler
Pinii port-urilor microcontrolerului pot fi accesate direct prin intermediul pinilor pentru acces direct aflate în extremitatea dreaptă a plăcii de dezvoltare dsPIC PRO4. Acestea au aceleași denumiri ca pinii microcontrolerului, LED-urile și butoanele de pe placă.Aplicarea unei tensiuni de 5V la unul dintre acești pini va face ca LED-ul corespunzător pin-ului să se aprindă. Analog, apăsarea unui buton va face ca pe pinul corespunzător acelui buton sa poată fi măsurată o tensiune de 5V.
Acești pini sunt direct conectați la microcontroller și pot fi accesați și modificați direct în urma programării microcontrolerului.
Fiecare pin este numerotat corespunzător, după cum se poate vedea în Fig. 3.13.
Pinii corespunzători fiecărui PORT sunt grupați, și împreună cu aceștia, pentru fiecare port sunt atașați pini pentru referința de tensiune Vcc , la o tensiune de 5V, și masă ( GND ).
Figura – Port-uri pentru accesul direct la pinii microcontroller-ului
O scurtă prezentare a facilităților microcontrolerului dsPIC30F6014A
Prezentare generală
Un dispozitiv dsPIC30F conține funcționalităti DSP (Digital Signal Processor) extinse, cuprinse in arhitectura microcontrolerului pe 16 biți de înaltă performanță. În figura 3.14 este prezentată diagrama bloc a dispozitivului dsPIC30F6014A.
Acest microcontroler cuprinde următoarele facilități:
Arhitectură Harvard modificată
Arhitectură complilator C cu set de instrucțiuni optimizate
Moduri de adresare flexibile
84 de instrucțiuni de bază
Instrucțiuni pe 24 de biți și date pe 16 biți
Până la 144 Kbytes de spațiu de program Flash pe cip
Până la 48 K cuvinte de instrucțiuni
Până la 8 Kbytes de date RAM pe cip
Până la 4 Kbytes de date nonvolatile EEPROM
16 x 16 biți vector de registri de lucru
Până la 30 de operații MIP:
Intrare de ceas externă de 40 MHz
Oscilator de intrare de 4 MHz – 10 MHz cu PLL activ (4x, 8x, 16x)
Până la 41 surse de intrerupere:
8 nivele de priorități selectabile de utilizator
5 surse de întrerupere externe
4 capcane de procesor
Caracteristicile Perifericelor
• 5 Timere/countere de 16 biti ce pot fi cuplate câte 2 pentru a fi folosite pe 32 de biti
• Functii de captare pe 16 biti
• Comparare/iesire PWM pe 16 biti
• Module SPI™ (suportă 4 frame-uri)
• Două porturi Serial
• Două magistrale CAN conform standardului CAN 2.0B
Caracteristici Analogice
• Convertor Analog Numeric pe 12 biti:
– 200 Ksps rată de conversie
– Până la 16 canale de intrare
– Conversie valabilă în timpul modului Sleep și modului Idle
Figura – Diagrama bloc a dispozitivului dsPIC30F6014A
Pendulul rotativ
Descriere
Modulul pendul rotativ constă dintr-un braț plat, care este instrumentat cu un senzor la un capăt, astfel încât arborele senzorului este aliniată cu axa longitudinală a brațului. O prindere este disponibil pentru a atașa pendul la arborele senzorului.Capătul opus al brațului este conceput pentru a monta la o instalație servo rotativ Quanser (SRV02) rezultând un braț orizontal rotativ cu un pendul la capăt.
Modulul pendul rotativ oferă studenților posibilitatea de a echilibra o tijă verticală prin manipularea unghiul de la baza. Aceasta este o problema clasică de tip pendul doar că acum traiectoria este circulară. Acest modul poate fi configurat în 3 configurații distincte.Modulul poate fi folosit ca un pendul invers clasic; o macara portal sau în pendul invers selferecting.
Pendulul rotativ este echipat cu un senzor pentru a măsura poziția unghiulară tijei.Modulul poate fi echipat fie cu un potențiometru analogic sau un traductor optic. Potențiometru poate fi folosit numai pentru funcționarea în modul invers (vertical) -mișcarea de rotație este limitată(-360 – 360) iar traductorului permite mișcare de rotație continuă.
Sistem de clasificare și componente
Figura 1 de mai jos prezintă modul standard rotativ pendul invers cuplat la SRV02. Figura 2 de mai jos prezintă ROTPEN – E (opțiune encoder). * Notă modul în care pendulul se poate roti complet la 360 ° cu opțiunea encoder. Consultați următorul tabel pentru a asocia componentele cu fotografiile lor corespunzătoare.
Tabel – Numele componentelor
Figura – ROTPEN – Optiunea Encoder
Figura – ROTPEN
Configurația sistemului și ansamblarea
Modulul pendulul rotativ necesită o asamblare minimală. Figura 3 de mai jos prezintă cele 3 componente ale pachetului.
Figura – Contents of ROTPEN Package
Primul pas este de a fixa pendulul în dispozitivul de fixare. Acest lucru se face prin slăbirea șurubului de reglare de la marginea dispozitivului de prindere, introducerea pendulul în dispozitivul de fixare și strângere șurubul opritor așa cum se vede în figura 4 de mai jos.
Figura – Tightening the setscrew
Ultimul pas este de a monta ROTPEN pe SRV02. Asezati ROTPEN pe arborele de sarcină (arbore de mijloc) și asigura ROTPEN în loc prin strângerea celor două șuruburi așa cum se vede în Figura 5 de mai jos.
Figura – Attaching to the SRV02
Encoder (Componenta 4)
ROTPEN-E vine cu un encoder optic folosit pentru a măsura poziția unghiulară a pendulului. Modelul utilizat este un US Digital Optical Kit Encoder. Acesta oferă de înaltă rezoluție (4096 contează în cuadratură), și măsoară unghiul relativ al arborelui (spre deosebire de potențiometru care măsoară numai un unghi absolut la o 0 ° locație predefinită).
Encoder trimite un semnal digital și ar trebui să fie conectat direct placa DSPIC PRO4 folosind un standard de cablu 5-pin DIN. Schema 1 este schema de conexiuni de encoder.
Figura – Encoder Wiring
Motorul de curent continuu Quanser SRV 02
Deducerea modelului matematic. Calculul funcției de transfer.
Motorul de curent continuu SRV 02 produs de firma Quanser este un exemplu de sistem adaptativ folosit în majoritatea exprimentelor didactice. În funcție de raportul de transfer al mecanismului format din roți dințate motorul poate avea 2 configurații:
Configurația de viteză mică în care raportul de transmisie este egal cu 14
Configurația de viteză mare în care raportul de transmisie este egal cu 70
Configurația folosită de către motorul studiat este cea de viteză mare.
Pentru a putea întelege fenomenele implicate în controlul acestui motor de curent continuu se impune calcularea unui model matematic care să simuleze comportarea acestui echipament într-o schemă de reglare. Pentru a realiza acest lucru trebuie sa luăm în calcul 2 aspecte prezente în funcționarea acestui motor.
Din punct de vedere electric motorul SRV 02 are următoarea schemă electrică:
Figura – Schema electrică a motorului de curent continuu
Dacă vom scrie teorema a 2 – a a lui Kirchhoff pentru acest circuit vom obține următoarea ecuație:
în care:
Vm(t) – tensiunea de alimentare
Rm – rezistența armăturii
Im(t) – intensitatea curentului de alimentare
Lm – inductanța armăturii
Eemf(f) – tensiunea electromotoare generată de motorul de curent continuu
Dacă ținem cont de faptul că , atunci ecuația devine:
În continuare vom extrage expresia intensității curentului de alimentare din ecuația precedentă:
Știim că tensiunea electromotoare generată de un motor este direct proporțională cu viteza unghiulară a axului motor, deci:
unde
Km – constanta de tensiune a motorului
– viteza unghilulară a axului motor
Din ultimele două relații scrise rezultă :
Trebuie să analizăm acum funcționarea motorul SRV 02 din punct de vedere mecanic, folosind următoarea schemă:
Figura – Schema mecaniă a motorului de curent continuu
Aplicăm legea a doua a mișcării a lui Newton pentru axul motor și obținem:
în care
Jm – inerția armăturii
ωm(t) – viteza unghiulară a axului motor
Tm(t) – momentul de torsiune generat de motor
Tl(t) – momentul de torsiune generat de încărcarea motorului
ηg – randamentul mecanismului cu roți dințate
Kg – raportul de viteză
Aplicăm legea a doua pentru axul care antrenează sarcina:
Extragem Tl(t) din prima ecuație:
și îl introducem în a 2 – a
Știim de asemenea că:
unde:
– randamentul motorului de curent continuu
Kt – constanta de torsiune a motorului
Deci :
După înlocuirea Im(t):
Trecem în domeniul s și obținem:
Deci funcția de transfer pentru motorul SRV 02 este:
Se poate observa din expresia funcției de transfer că sistemul primește ca intrare o tensiune și la ieșire se culege o viteză unghiulară. Deoarece pozitionarea motorului prin controlul vitezei unghiulare este destul de dificilă, ar trebui să modificăm funcția de transfer pentru a returna unghiul la care se află axul motor față de poziția sa inițială. Deoarece viteza unghiulară este derivata unghiului este suficient să înmulțim funcția de transfer rezultată cu transformata Laplace a operației de integrare. Deci vom obține următoarea funcție de transfer:
Prezentăm în continuare valorile pentru parametrii implicați în calculul expresiei funcției de transfer:
După introducerea parametrilor și efectuarea operațiilor rezultă următoarea funcție de transfer:
În mediul Matlab aceasta funcție de transfer se va experima sub forma:
sys=tf([0.397],[0.0043 0.2236])
Discretizarea funcției de transfer.
Deoarece în general prelucrările se realizează pe semnale numerice și calculatorul nu poate primi semnale continue de la echipamente se lucrează cu modele matematice discrete. Pentru a discretiza funcția de transfer a motorului vom apela la metoda transformării biliniare care se bazează pe aproximarea prin forme raționale. Vom folosi metoda de substituție a lui Tustin și anume relația:
Făcând înlocuirea în funcția de transfer calculată ajungem la următoarele relații:
în care Te – timpul de eșantionare.
Termenul care apare în funcția de transfer a motorului are rolul de traductor și trebuie discretizat și el pentru a asigura buna funcționare a sistemului discret:
Deci funcția de transfer a sistemului discret este dată de relația:
În mediul Matlab pentru a calcula forma discreta a funcției de transfer a unui sistem vom folosi funcția c2d astfel:
sysd=c2d(sys,Te,’tustin’)
În acest moment avem toate informațiile necesare pentru a realiza un model Simulink care sa aproximeze funcțioarea acestui motor în circuit deschis la un timp de eșantionare de 0.1 s(Fig 4.3):
Figura – Modeul Simulink pentru o periodă de 0.1
iar graficul rezultat este prezentat mai jos:
Figura – Răspunsul motorului la o perioadă de eșantionare de 0.1
Pentru a observa influența timpului de eșantionare asupra rezultatelor obținute vom realiza un al doilea model cu timpul de eșantionare de 0.01:
Figura – Modeul Simulink pentru o periodă de 0.01
iar raspunsul este:
Figura – Răspunsul motorului la o perioadă de eșantionare de 0.1
Se observa că semnalul de răspuns își păstrează forma dar că amplitudinea lui scade mult până la nivele comparabile cu intrarea de amplitudine 1, deoarece datorită perioadei de eșantionare mai mici se pot calcula mai exact valorile semnalelor de ieșire.
Observație. În practică modelul reprezentat de prima funcție de transfer va fi înlocuit de către un bloc funcțional care permite comunicarea cu echipamentul real: generatorul de semnale va fi legat la un convertor numeric – analogic și ieșirea CNA va fi legată la un bloc de tip “Quanser analog output” iar pentru obținerea ieșirii din blocul funcție de transfer se va folosi fie un bloc “Quanser analog input”, fie un bloc “Quanser Encoder input”, după care va fi trecută printr-un convertor analog – numeric.
Modelul matematic al pendulului rotativ invers
Figura 1 de mai jos prezintă modul pendul invers rotativ cuplat la motorul SRV02 în configurația corectă.Modulul este atașat de motorul SRV02 de două șuruburi.Brațului pendulului este atașat de corpul modulului cu un șurub de fixare.Experimentul pendul invers este un exemplu clasic al modului în care reglarea poate fi folosită pentru a stabiliza un sistem inerent instabil.Pendulul inversat este, de asemenea, un model exact în pitch și yaw al unei rachete în zbor și poate fi folosită ca referință pentru multe metodologii de control.
Figura – SRV02 w/ ROTPEN Module
Tabelul de mai jos este o listă de nomenclatori utilizat în următoarele ilustrații și derivatii.
Tabel – Descrierea simbolurilor
Figura – Top View of Rotary inverted pendulum
Figura – Side View with Pendulum in Motion
Figura 2 de mai sus descrie pendul invers de rotație în mișcare. A se observa direcția in care brațului se mișcă. Figura 3 prezintă pendulului ca un nod de masă la jumătate din lungimea pendulului. Brațul este deplasat cu o anumită α. Observați că direcția θ este acum pe axa X a acestei ilustrații. Vom începe prin examinarea derivatei vitezei a centrului de masă a pendulului.
Referindu-se din nou la figura 3, observăm că există două componente pentru viteza a nodului de masei a pendului:
De asemenea, știm că brațul pendulului este, de asemenea, în mișcare, cu brațul rotativ, la o rată de:
Folosind ecuațiile [3.1] și [3.2] și rezolvand componentele vitezei x și y:
Ecuația [3.3] ne oferă viteza completă a pendulului. Putem trece acum la obținerea sistemul de ecuații dinamice.
Derivarea sistemul de ecuații dinamice.
Acum, că am obținut vitezele a pendulului, sistemul de ecuații dinamice pot fi obținute folosind formula Euler-Lagrange. Obținem energiile potențială și cinetică în sistemul nostru ca:
Energia potențială – singura energia potențială în sistemul este gravitație:
Energia cinetică – energiile cinetice din sistem apar dib mișcarea punctului central , viteza a punctului de masă pe axa x, viteza puctului de masă pe axa y și rotația pendulului în jurul centrului său de masă:
* Notă: Deoarece am modelat pendulului ca un punct de masă situat la centrul său de masă, energia cinetică totală a pendulului este energia cinetică a punctului de masa plus energia cinetică a rotației pendulului în jurul centrului său de masă.
Momentul de inerție al unei tije cu privire la centrul său de masă este:
întrucât ne-am definit L să fie jumătate din lungimea pendulului, atunci R în acest caz, ar fi egal cu 2L. Prin urmare, momentul de inerție al pendulului in jurul centrului său de masă este:
În cele din urmă, energia noastră cinetică T poate fi scrisă ca:
După extinderea ecuația [3.7] și colectarea termenii, putem formula Lagrange:
Cele 2 coordonate generalizate sunt θ și α. Prin urmare, avem 2 ecuații:
Rezolvȃnd ecuațiile [3.9] și [3.10] și liniarizȃnd ȋn jurul α = 0, rămanem cu:
Potrivit Experiment # 1 – controlul poziției, știm că cuplul de sarcina de la motor este:
În cele din urmă, prin combinând ecuațiile [3.11], [3.12] a [3.13], am rămas cu următoarea reprezentare ȋn spațiu stărilor al sistemului complet:
Unde:
În configurația tipică a sistemului SRV02 & ROTPEN (Pendul / pendul invers), reprezentarea de mai sus ȋn spațiu stărilor al sistemului este:
Drivere și Handlere utilizate
Driverul MCU (Microcontroller Unit)
Descrierea modulului
Driverul MCU asigură servicii pentru inițializarea microcontrolerului, funcționalitatea Power Down, reset și funcționalitățile specifice microcontrolerului cerute de alte module software MCAL. Inițialiarea servicilor permit o flexibilă si aplicabilă inițializare la pornirea codului (vezi figura de mai jos). Pornire codului este specifică MCU-ului.
Figura – Inițialiarea Modulelor
Driverul MCU accesează direct hardware-rul microcontrolerului si este localizat in Microcontroller Abstraction Layer (MCAL).
Caracteristicile driverului MCU:
Inițializarea ceasului MCU, PLL-ul, prescalerul ceasului și distribuția ceasului MCU.
Activarea modului puterii reduse uC
Activarea a resetului uC
API-URI
mcuDrvInit ():
Acestă funcție inițializează driverul MCU. Această inițialiare constă in stergera tuturor flagurilor de întrerupere, resetarea priorităților acestora și setarea valorilor regiștrilor ce nu sunt utilizați de celălalte module. Funcția returnează MCU_ERR_OK.
mcuDrvInitClock ():
Această funcție va seta cesul operațional al microcontrolerului la o anumita valoare.Funcția va returna MCU_ERR_OK dacă operațiile se realizează fară erori și MCU_ERR_INIT dacă modulul nu a fost inițializat corespunzător.
mcuDrvPerformReset ():
Acestă funcție implementează operatia necesară realizării unui reset al microcontrolerului.
mcuDrvGetResetReason(Mcu_ResetReasonType*ResetReason):
Această funcție returnează prin intermediul parametrului motivul pentru care microcontrolerul s-a resetat. Acesta va returna MCU_ERR_OK dacă funcția s-a terminat fără erori și MCU_ERR_INIT dacă modulul nu afost inițializat.
Driverul de GPT (General Purpose Time)
Descrierea modulului
Driverul GPT este parte din statul de abstractizare al microcontrolerului (MCAL). Acesta inițializează si controlează timerele interne ale microcotrolului.
Driverul de GPT asigură serviciiprecum și configurarea parametrilor pentru:
Pornirea și oprirea timerelor hardware
Accesul la valoarea timerului
Controlarea triggeruli notificării intreruperii timerului
Controlarea triggerului intreruperii de trezire al timerului, dacă este suportat de hardware.
Durata unui tick a unui canal de timer depinde de setările specifice ale canalului (parte a driverului GPT) ,de ceasul de sistem și setările ceasului controlate de driverul de MCU. Durata unui tick nu este limitată de aceste specificații.
Nu toate timerele hardware sunt controlate de modulul CPT. Unele timere sunt controlate de sistemul de operare.Numărul de canale timer controlate de driverul de GPT depinde de hardware, implementare și configurarea sistemului.
Driverul GPT generează doar baza de timp dar nu servește și ca un contor de evenimente.
API-uri
gptDrvInit(void):
Acestă funcție inițiaizează regiștri hardware necesari pentru a configura timerul hardware cum ar fi setarea prescalerului, selectarea periodei timerului, alegerea priorității și pornirea timerul.
Acestă funcție va returna in totdeauna GPT_ERR_OK.
gptDrvSetCallBack(GPT_CallbackFunctionType pfnCallbackFunction):
Această funcție permite posibilitatea de a alege funcția de callback a timerului. Această funcție callback va fi apelată din intreruperea timerului atunci când perioada de callback a expirat.Această functie returnează GPT_ERR_OK când funcția se termină cu succes. Deasemeneareturnează GPT_ERR_INVALID_POINTER atunci când pointerul va fi NULL, și GPT_ERR_INIT atunci când modulul nu a fost inițializat corespunzător.
gptDrvSetCallbackPeriod(GPT_ValueType callbackInterval_t):
Acestă funcție este utilizată pentru a seta perioada după care funcția callback vafi apelată. Funcția va returna GPT_ERR_OK dacă funcția s-a terminat cu succes, GPT_ERR_INIT dacă modulul nu a fost inițializat cu succes și GPT_ERR_INVALID_PARAM dacă perioada dată ca parametru nu esteinvalidă(perioada de callback este un numar negativ).
gptDrvTimerISR(void):
Această funcție este apelată atunci când timerul hardware a dat overflow. Acesta incrementează o variabilă internă utilizată pentru a măsura timpul de la pornirea timerului. Măsurarea timpului se face in milisecunde(intervalul dintre două apeluri ale acestei funcții este de 1 ms).
gptDrvGetTime(GPT_ValueType *timerValue_t):
Această funcție este utilizată pentru a avea acces la valoarea timerului acumulată de la pornirea acestuia. Acestă funcție va returna GPT_ERR_OK dacă funcția lucrează corect, GPT_ERR_INVALID_POINTER dacă parametrul pointer este NULL sau GPT_ERR_INIT dacă modulul nu a fost inițializat corespunzător.
gptDrvGetElapsedTime(GPT_ValueType timeSince_t,GPT_ValueType *timeElapsed_t):
Acestă funcție calculează timpul scurs de la momentul de start dat de primul parametru și stocarea acestei valori in al doilea parametru. În realizarea acestui calcul această funcție ține cont de overflow-ul variabilei ce contorisează timpul. Acestă funcție returnează GPT_ERR_OK dacă funcția funcționează corespunzător, GPT_ERR_INVALID_POINTER dacă un pointer NULL este dat ca parametru și GPT_ERR_INIT dacă modulul nu afost inițializat.
Dependințe de alte module:
Modulul MCU
GPT depinde de ceasul de sistem, prescaler si PLL. Schimbările ceasului de sistem afectează deasemenea setările ceasului al hardware-lui GPT .Modulul GPT nu are grijă de setările care configurează ceasul, prescalerul și PLL in funcția sa de inițializare. Acestea trebuie realizate de către modulul de MCU.
Driverul PWM (Pulse Width Modulation)
Descrierea modulului
Fiecare canal PWM este legat de hardware-lui PWM care aparține microcontrolerului. Tipul semnalului PWM nu este definit in aceste specificații și este lăsat pentru implementare.
Driverul de PWM asigură funcții pentru inițializarea si controlul stării PWM interne a microcontrolerului.
Modulul PWM generează puls cu lătimea pulsului variabilă. Acesta permite selecția factorului de umplere și a frecvenței semnalului.
Figura – Semanlul PWM
API-uri
pwmDrvInit():
Această funcție inițializează regiștri necesari pentru a controla canalele PWM. In această funcție se precizează canalele PWM, frecvența inițială a semnalelor PWM, factorul de umplere inițial a semnalelor PWM, alegerea timerului pe baza căruia se generează semnalele de PWM, alegerea prescalerului și pornire generatorului de PWM.
Această funcție returnează intotdeuna PWM_ERR_OK.
pwmDrvSetPeriod(Pwm_ChannelIdType pwmChannel_t,Pwm_ChannelPeriodType channelPeriod_t):
Această funcție configurează perioada semnalului de PWM. Această funcție returnază PWM_ERR_OK dacă operația se termina fără erori, PWM_ERR_INVALID_VALUE dacă frecvența nu este validă(frecvența este un numar pozitiv), PWM_ERR_INIT dacă modulul nu a fost inițializat corespunzător.
pwmDrvSetDutyCycle(Pwm_ChannelIdType pwmChannel_t,Pwm_ChannelDutyCycleType channelDutyCycle_t):
Acestă funcție setează factorul de umplere al calului PWM. Acestă funcție returnează PWM_ERR_OK dacă operația se termina fără erori, PWM_ERR_INIT dacă modulul nu a fost inițializat corespunzător, PWM_ERR_INVALID_VALUE dacă factorul de umplere nu este valid (cuprins intre 0 și 100)
Dependințe de alte module
Modulul PWM depinde de ceasul de sistem. Astfel, schimbările asupra ceasului de sistem afectează deasemenea setările cesului hardwarelui PWM.
Driverul PWM depinde de urmatoarele module:
Driverul MCU: Pentru a seta prescalerul, ceasul de sistem si PLL.
PortDirection: Pentru a selecta funcționalitatea pinilor respectivi.
Handlerul ErrH: Pentru a raporta respectivele erori.
Driverul ENCODER
Descrierea modulului
Prin intermediul acestui modul se poate determina poziția unghiulară a motorului de curent contiuu ce este prevăzut cu un encoder(traductor rotativ) hardware. Este cunoscut faptul că encoderul hardware furnizează două trenuri de impulsuri și anume un canal principal denumit canalul A și un canal secundar denumit canalul B ce sunt decalate cu 90 de grade unul față de celălalt. Folosindu-se de această informație driverul Encoder utilizează o intrerupere pentru canalul A și un canal digital de intrare pentru canalul B.
L-a apriția unei intreruperi dictată de frontul crescător al trenului de inpulsuri de pe canalul A, driverul verifică nivelul canalului B. In funcție de acest nivel contorul intern este incrementat sau decrementat.
Encoderul hardware furnizează 1024 de impulsuri pentru o rotație completă. Pe baza acestui contor intern aplicănd o conversie aritmetică driverul furnizează unghiul motorului.
API-uri
encDrvInit(void):
Aceată funcție este utilizată sa inițializeze driverul ENCODER. In aceată funcție se selectează prioritatea intreruperii, alegerea canalului principal și secundar al encoderului.Această funcție va returna intotdeauna ENCDRV_ERR_OK.
encDrvEncoderISR(void):
Aceată funcție este apelată de către hardware atunci când encoderul motorului de curent continuu va determina ca motorul a incrementat poziția unchiulară.
encDrvGetEncoderAngle(EncDrv_ChannelType encoderChannel_t, EncDrv_ValueType *encoderAngle_t):
Aceată funcție este utilizată pentru a lua unghiul curent al traductorului primit ca parametru. Aceată funcție returnează ENCDRV_ERR_OK dacă operația se termină cu succes, ENCDRV_ERR_INVALID_POINTER dacă pointerul dat ca parametru este NULL, ENCDRV_ERR_INVALID_CHANNEl dacă canalul primit ca parametru este mai mare ca 2, ENCDRV_ERR_INIT dacă modulul nu este inițializat.
encDrvGetEncoderCounter (EncDrv_ChannelType encoderChannel_t, EncDrv_CounterType *encoderConter_t):
Aceată funcție este utilizată pentru a lua valuarea curenta(in impulsuri) al traductorului primit ca parametru. Aceată funcție returnează ENCDRV_ERR_OK dacă operația se termină cu succes, ENCDRV_ERR_INVALID_POINTER dacă pointerul dat ca parametru este NULL, ENCDRV_ERR_INVALID_CHANNEl dacă canalul primit ca parametru este mai mare ca 2, ENCDRV_ERR_INIT dacă modulul nu este inițializat.
Handlerul BrgdH (Bridge)
Descrierea modulului
BrgdH controlează circuitul punte al motorului pentru a :
– a merge motorul in ambele directii
– a oprii motorul electric
– a lua informatii diagnostice legate de curentul incărcat
Pentru a controla modul de rotire al motorului, circuitul punte are nevoie de 2 semnale PWM în care fiecare semnal este corespunzator direcției de mers. Acesta direcție este dictată de un flag de direcție ce determină ce semanal este activ la un monment dat.
Atât softul cât si circuitul hardware prezintă protecții astfel încât nu se poate ca ambele semnale sa fie active in acelasi timp.
Datorita fapt ului că motorul electric poate contine unul sau mai multe circuite punte de control, este posibil să se realizeze mai mult instanțe de module BrdgH.
API-uri
BrdgH_Init():
Aceată funcție este utilizată sa inițializeze handlerul Bridge. Aceată funcție returnează întotdeauna BRDGH_ERR_OK..
BrdgH_Cyclic():
Aceată funcție este apelată ciclic de către sistemul de operare și scrie valoarea fiacărei instanțe a driverului punte (direcție și viteza – ce reprezinta factorul de umplere a unui canal PWM). Aceată funcție returnează intotdeauna POUTH_ERR_OK..
BrdgH_SetBridgeCommandSpeed(BrdgH_ChannelIdType Id, BrdgH_ValueType *Value ):
Aceată funcție este utilizată să seteze direcția și viteza corespunzătoarea canalului PWM dictat de flagul de direcție. Valorile sunt date sub forma unei structuri ce reprezintă al doilea parametru al funcției. Aceată funcție returnează BRDGH_ERR_OK dacă operația se incheie cu succes, BRDGH_ERR_INVALID_VALUE dacă direcția sau viteza nu este validă, BRDGH_ERR_INIT dacă modulul nu a fost inițializat.
Conversia Experimentului din mediul Simulink Matlab Ȋn cod C
Introducere
Programul C necesar implementării experimentului "Pendulul invers rotativ" pe placa de dezvoltare DSPIC PRO4 păstrează aceași structura ca și cel implementat in mediul Simulink Matlab oferit de către Quanser.
Asa cum se va observa ȋn continuare anumite blocuri utilizate ȋn mediul Simulink Matlab sunt inlocuite de drivere sau handlere capabile să configureze și să utilizeze perifericele microcontrolerului dsPIC30F6014A cum ar fi PWM, Encoder, etc.
Un prim pas in trecerea a experimentului din mediul Simulink Matlab intr-un program embedded este trecerea de la timp continuu la timp discret. Pentru o rezoluție suficient de bună s-a ales o perioadă de eșantionare de o 1 ms. Acest lucru, ȋn cod C, se realizează prin intermediul driverului GPT(General Purpose Time) ce permite setarea unui timer cu o anumită valuare (timp), care ȋn cazul nostru avȃnd o frecvență de intrare de 80 MHz este 78 (~1 ms), și o funcție "callback".
Figura – Structura unui timer
O funcție „Callback” este o bucată de cod executabil care este transmis ca un argument de alt cod, care este de așteptat să returneze argumentul la un moment convenabil.
gptDrvInit();
gptDrvSetCallbackPeriod(1); //Period of timer is 1 ms
gptDrvSetCallBack((GPT_CallbackFunctionType) &Scheduler_Task);
Așa cum se observă in codul prezentat mai sus numele funcției "callback" este Scheduler_Task ce simulează un task al unui sistemul de operare. Această functie este apelată de o intrerupere internă generată atunci cȃnd timer-ul configurat de driverul GPT a ajuns la valuarea 0 adică la după fiecare ms.
void gptDrvTimerISR(void)
{
CurrentTime++; //increaseing time
TMR2=CLR; //cleareing time
IFS0=IFS0&CLR_T2_INT; //cleareing interrupt flag
if((CallbackFunction!=NULL)&&(Period==TimeElapsed))//if the pointer is not null and the callback period has passed
{
CallbackFunction(); //executing callback function
}
}
In funcția Scheduler_Task se realizează discretizarea propriu-zisă adică experimentul este apelat cu o perioadă de eșantionare de o ms.
void Scheduler_Task (void)
{
BrdgH_ReturnType Ret_Val = 0;
LATD |= 0x0080; /* used to test system load */
SRV02_Rotary_Pendulum_Main();
Ret_Val = BrdgH_Cyclic();
LATD &= 0xFF7F; /* used to test system load */
}
Explicarea funcție BrdgH_Cyclic este explicată in subcapitolul 7.5.2.
Ȋn continuare se va prezenta conversia fiecărei componente a experimentului "pendulul invers rotativ".
Componenta q_SRV02_Rotary_Pendulum_SE_MultiQ
Ȋn figura de mai jos este prezentată implementarea in mediul Simulink Matlab al acestei componente:
Figura – q_SRV02_Rotary_Pendulum_SE_MultiQ
q_SRV02_Rotary_Pendulum_SE_MultiQ este reprezentat in programul C printr-o funcția SRV02_Rotary_Pendulum_Main așa cum se poate observa in funcția Scheduler_Task.
Această componentă nu aduce nici o schimbare majoră in programul C fiind doar simple adunari, inmulțiri, si apeluri de funcții. O mica interpretare poate fi adusă asupra grupului de blocuri format din blocul "Matix Gain" și blocul "Switch". Acest grup este convertit in cod C astfel:
if(Switch_Value >= 1)
{
Vm = -(K_PEND[0]*Theta + K_PEND[1]*Alpha + K_PEND[2]*Theta_Dot + K_PEND[3]*Apha_Dot);
}
else
{
Vm = Swing_Up_Output;
}
Ȋntreaga funcție SRV02_Rotary_Pendulum_Main este:
void SRV02_Rotary_Pendulum_Main(void)
{
float Vm = 0;
static float Theta = 0;
static float Alpha = 0;
static float Theta_Dot = 0;
static float Apha_Dot = 0;
static float Swing_Up_Signal = 0;
float Trigger_Angle = (PI * Amplitude_SetPoint) / 180;
float Swing_Up_Output = 0;
char Switch_Value = 0;
Swing_Up_Output = Swing_Up_Controller_Main(Theta, Swing_Up_Signal);
Switch_Value = Control_State_Main(Alpha);
if(Switch_Value >= 1)
{
Vm = -(K_PEND[0]*Theta + K_PEND[1]*Alpha + K_PEND[2]*Theta_Dot + K_PEND[3]*Apha_Dot);
}
else
{
Vm = Swing_Up_Output;
}
SRV02_E_ROTPEN_E_Main(Vm, &Theta, &Alpha, &Theta_Dot, &Apha_Dot, &Swing_Up_Signal);
Theta -= Trigger_Angle;
}
Componenta SRV02-E ROTPEN-E
Ȋn figura de mai jos este prezentată implementarea in mediul Simulink Matlab al acestei componente:
Figura – SRV02-E ROTPEN-E
SRV02-E ROTPEN-E este reprezentat in programul C printr-o funcția SRV02_E_ROTPEN_E_Main așa cum se poate observa in funcția SRV02_Rotary_Pendulum_Main.
Ȋn acestă componentă apar blocuri speciale ale familiei Quanser (Analog Output și Ecoder Input) ce permit mediului Simulink să comunice cu placa de achiziții Quanser SE MultiQ. Aceste blocuri au fost inlocuite cu drivere special realizate pentru a comunica cu perifericele microcintrolerului dsPIC30F6014A după cum urmează:
Blocul "Analog Output" este folosit de mediul Simulink Matlab și placa de achiziți Quanser pentru a trimite către motorul SRV02 intre [-10 10]V. Ȋn cazul experimentul realizat pe placa de dezvoltare DSPIC PRO4 acest bloc a fost ȋnlocuit de handler-ul BrgdH și driver-ul PWM (atȃt driver-ul cȃt și handler-ul sunt descrise ȋn capitolul 7) ce controlează 2 semnale pwm iar placa de achiziții Quanser este inlocuită de o punte H a cărei schemă electrică este prezentată ȋn continuare.
Figura – Puntea H
Astfel tensiunea electrica [-10 10]V este convertita intr-un factor de umplere și o directie, iar acest lucru este realizat de funcția SRV02_Set_Command_To_PWM:
void SRV02_Set_Command_To_PWM(float Vm)
{
BrdgH_ReturnType Ret_Val = BRDGH_ERR_OK;
BrdgH_ValueType Calculated_Value;
float Local_Voltage = 0;
int Local_Duty = 0;
//Convert volatage to PWM value
if(Vm < 0)
{
Calculated_Value.brdg_direction = 1;
Local_Voltage = -Vm;
}
else
{
Calculated_Value.brdg_direction = 0;
Local_Voltage = Vm;
}
// Voltage -10V – 10V => 0V – 10V
// Duty 0% – 100%
Local_Duty = (unsigned int)(Local_Voltage * 10 );
if(Local_Duty < 0)
{
Local_Duty = 0;
}
else if(Local_Duty > 100)
{
Local_Duty = 100;
}
Calculated_Value.brdg_speed = Local_Duty;
Ret_Val = BrdgH_SetBridgeCommandSpeed((BrdgH_ChannelIdType)1, Calculated_Value);
}
Blocul "Encoder Input" este folosit de mediul Simulink Matlab și placa de achiziți Quanser pentru a citii valorile curente ale celor 2 traductoare (encodere) ale sistemului. Ȋn cazul experimentul realizat pe placa de dezvoltare DSPIC PRO4 acest bloc a fost ȋnlocuit de driver-ul Encoder (prezent in capitolul 7). Acest driver folosește, penru fiecare instanță, o intrerupere externă folosită pentru a contoriza numărul de impulsuri furnizat de către traductor și un canal digital de intrare de direcție ce este folosit să incrementeze sau să decrementeze numărul de impulsuri.
void __attribute__((__interrupt__,__auto_psv__)) _INT2Interrupt (void) /* External Interrupt #2 -> RA13*/
{
if(( PORTA & 0x0040 ) == 0x0040 ) /* RA6 is set */
Contor_INT[INT2_INDEX]++;
else
Contor_INT[INT2_INDEX]–;
IFS1 &= 0xFF7F; /* External Interrupt 2 Flag Status bit is clear */
}
void __attribute__((__interrupt__,__auto_psv__)) _INT3Interrupt () /* External Interrupt #3 -> RA14*/
{
if(( PORTA & 0x0080 ) == 0x0080 ) /* RA07 is set */
Contor_INT[INT3_INDEX]++;
else
Contor_INT[INT3_INDEX]–;
IFS2 &= 0xFFEF; /* External Interrupt 3 Flag Status bit is clear */
}
Ȋn program citirea celor 2 encodere este realizată de funcția SRV02_Get_Encoder_Value:
long int SRV02_Get_Encoder_Value(unsigned int Channel)
{
EncDrv_ReturnType Ret_Val = 0;
EncDrv_CounterType Current_Counter = 0;
Ret_Val = encDrvGetEncoderCounter ((EncDrv_ChannelType) Channel, &Current_Counter);
return Current_Counter;
}
Dat fiind faptul că sistemul nostru este acum unul discret, funcțiile de transfer denumite "Derivative with Filter" trebuiesc discretizate. Acest lucru s-a realizat prin metoda Tustin cu o perioadă de eșantionare de o ms. Ȋn cod cele 2 funcții de trasfer sunt realizate de funcțiile SRV02_Derivative_with_Filter_Theta și SRV02_Derivative_with_Filter_Alpha;
float SRV02_Derivative_with_Filter_Alpha(float Input)
{
// Derivative with Filter – Transfer function:
// 50 s 48.78 z – 48.78
// –– = Tustin (Ts = 0.001) = –––––
// s + 50 z – 0.9512
float Output = 0;
static float Last_Input_Alpha = 0;
static float Last_Output_Alpha = 0;
Output = 48.78*Input – 48.78*Last_Input_Alpha + 0.9512*Last_Output_Alpha;
Last_Input_Alpha = Input;
Last_Output_Alpha = Output;
return Output;
}
Un caz special este dat de blocul "mod" din mediul Simulink Matlab deoarece diferă de operandul "%" din C. Formula care stă la baza blocului "mod" este X – floor(X/Y)*Y. Problema este generată de funcția floor pentru valori negative. De exemplu floor(10.3) este egal cu 10 la fel ca și cast-ul la int din C dar floor(-10.3) este egal -11 pe cȃnd cast-ul la int din C returnează -10. Fucționalitatea blocului "mod" este redată de funcția SRV03_Mod.
float SRV02_Mod(float X, float Y)
{
float Ret_Val = X;
if(Y != 0)
{
// return X – floor(X/Y)*Y;
float result = (X/Y);
if(result < 0)
{
Ret_Val = X – Y*(float)((int)(result – 0.99999));
}
else
{
Ret_Val = X – Y*(float)((int)result);
}
}
return Ret_Val;
}
Ȋntreaga funcție SRV02_E_ROTPEN_E_Main este:
void SRV02_E_ROTPEN_E_Main(float Vm, float *Theta, float *Alpha, float *Theta_Dot, float *Apha_Dot, float *Swing_Up_Signal)
{
float Local_Vm = 0.0;
float Enc_Input_Theta = 0;
float Enc_Input_Alpha = 0;
//Cable Gain Pre-Compensation
Local_Vm = Vm/K_CABLE;
//Direction Convertion: (Right-Hand) system
Local_Vm *= -1;
//Get encoder value
Enc_Input_Theta = (float)SRV02_Get_Encoder_Value(THETA_CHANNEL);
Enc_Input_Alpha = (float)SRV02_Get_Encoder_Value(ALPHA_CHANNEL);
//Conversion to Radians
Enc_Input_Theta *= K_ENC;
Enc_Input_Alpha *= K_ENC;
// Derivative with Filter
*Theta_Dot = SRV02_Derivative_with_Filter_Theta(Enc_Input_Theta);
*Theta = Enc_Input_Theta;
*Swing_Up_Signal = Enc_Input_Alpha – PI;
Enc_Input_Alpha = SRV02_Mod(Enc_Input_Alpha, (2*PI));
Enc_Input_Alpha -= PI;
*Alpha = Enc_Input_Alpha;
// Derivative with Filter
*Apha_Dot = SRV02_Derivative_with_Filter_Alpha(Enc_Input_Alpha);
//Send command (Local_Vm) to Analog Output (PWM)
SRV02_Set_Command_To_PWM(Local_Vm);
return;
}
Componenta Swing Up Controller
Ȋn figura de mai jos este prezentată implementarea in mediul Simulink Matlab al acestei componente:
Figura – Swing Up Controller
Componenta " Swing Up Controller" este reprezentat in programul C printr-o funcția Swing_Up_Controller_Main așa cum se poate observa in funcția SRV02_Rotary_Pendulum_Main.
Așa cum am spus și ȋn subcapitolul anterior sistemul nostru este acum unul discret, funcțiile de transfer trebuiesc discretizate. Acest lucru s-a realizat prin metoda Tustin cu o perioadă de eșantionare de o ms. Ȋn cod cele 2 funcții de trasfer sunt realizate de funcțiile SUC_Transfer_Function și SUC_Derivative_with_Filter;
float SUC_Transfer_Function(float Input)
{
// Transfer function:
// 350 s 297.9 z – 297.9
// ––- = Tustin (Ts = 0.001) = –––––
// s + 350 z – 0.7021
float Output = 0;
static float Last_Input = 0;
static float Last_Output = 0;
Output = 297.9*Input – 297.9*Last_Input + 0.7021*Last_Output;
Last_Input = Input;
Last_Output = Output;
return Output;
}
Blocul "Swing Up Logic" prezentat in figura de mai jos este implementat de funcția SUC_Swing_Up_Logic.
Figura – Swing Up Logic
Această componentă nu aduce nici o schimbare majoră in programul C fiind doar simple adunari, inmulțiri, comparări.
float SUC_Swing_Up_Logic(float Pos, float Neg)
{
static float Degrees = 0;
float Local_Degrees = 0;
float Local_Pos = 0;
float Local_Neg = 0;
if(Pos >= 1)
{
Local_Pos = 20;
}
else
{
Local_Pos = 0;
}
if(Neg >= 1)
{
Local_Neg = -20;
}
else
{
Local_Neg = 0;
}
Local_Degrees = Local_Pos + Local_Neg;
//Enabled Subsystem
if(Pos || Neg)
{
Degrees = Local_Degrees;
}
return Degrees;
}
Un caz special al acestei componente ȋl reprezintă blocul " Repeating Sequence" ce genereaza urmatorul semnal ciclic:
Figura – Ieșirea blocului "Repeating Sequence"
Așa cum se observă ȋn figura de mai sus și din configurația blocului, acesta generează ciclic urmatorele valori [0, 35, 35, 35, 35, 35, 30, 25, 20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20] cu o perioadă de 0.5 sec. Funcționalitatea acestui bloc este realizată de către funcția SUC_Repeating_Sequence:
float SUC_Repeating_Sequence(void)
{
float Output = 0;
float Sequence[21] = {0, 35, 35, 35, 35, 35, 30, 25, 20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20};
static unsigned int Index = 0;
static unsigned int Timer_Cnt = 0;
Timer_Cnt++;
if(Timer_Cnt >= 50)
{
Timer_Cnt = 0;
Index++;
}
if(Index >= 20)
{
Index = 0;
}
Output = Sequence[Index];
return Output;
}
Ȋntreaga funcție Swing_Up_Controller_Main este:
float Swing_Up_Controller_Main(float Theta, float Swing_Up_Signal)
{
float Swing_Up_Output = 0.0;
static char Switch_Value = 0;
float TF_Output = 0;
float Local_Swing_Up = 0;
float Filter_Output = 0;
char Pos = 0;
char Neg = 0;
float Degrees = 0;
TF_Output = SUC_Transfer_Function(Theta);
TF_Output *= 0.5;
Local_Swing_Up = SUC_Mod(Swing_Up_Signal, (-2*PI));
Local_Swing_Up += PI;
//Rad to Dec
Local_Swing_Up = 180/PI * Local_Swing_Up;
Filter_Output = SUC_Derivative_with_Filter(Local_Swing_Up);
Pos = (-25 >= Local_Swing_Up) && (Filter_Output >= 200);
Neg = (Filter_Output <= -200) && (Local_Swing_Up >= 25);
//Enabled Subsystem
if(Pos || Neg)
{
Switch_Value = 1;
}
//Switch
if(Switch_Value >= 1)
{
Degrees = SUC_Swing_Up_Logic(Pos, Neg);
}
else
{
Degrees = SUC_Repeating_Sequence();
}
//Deg to Rad
Degrees = (PI * Degrees)/180;
Swing_Up_Output = Theta – Degrees;
Swing_Up_Output *= 20;
Swing_Up_Output = -TF_Output -Swing_Up_Output;
return Swing_Up_Output;
}
Componenta Control State
Ȋn figura de mai jos este prezentată implementarea in mediul Simulink Matlab al acestei componente:
Figura – Control State
Componenta "Control State" este reprezentat in programul C printr-o funcția Control_State_Main așa cum se poate observa in funcția SRV02_Rotary_Pendulum_Main.
Această componentă nu aduce nici o schimbare majoră in programul C fiind doar simple adunari, inmulțiri, comparări.
Ȋntreaga funcție Control_State_Main este:
char Control_State_Main(float Alpha)
{
char Enable = 0;
static char Local_Enable = 0;
float Local_Alpha = 0;
//Rad to Deg
Local_Alpha = 180/PI * Alpha;
//Abs
if(Local_Alpha < 0)
{
Local_Alpha = -Local_Alpha;
}
//Enabled Subsystem
if(Local_Alpha <= 2)
{
Local_Enable = 1;
}
Enable = Local_Enable && (Local_Alpha < Alpha_Threshold);
return Enable;
}
Concluzii
Pendul invers rotativ este un experiment ideal atunci când se introduc concepte importante de control, cum ar fi respingerea tulbulențelor și sisteme non-liniare. Scopul acestui experiment fiind de proiectarea unui controler complet în bucla ȋnchisă ȋn spațiul stărilor, care va menține pendulul în poziție verticală.
Pendul invers are aplicații practice în sensul că poate fi folosit pentru a modela multe sisteme neliniare.
Experimentul pendul invers este un exemplu clasic al modului în care reglarea poate fi folosită pentru a stabiliza un sistem inerent instabil.Pendulul inversat este, de asemenea, un model exact în pitch și yaw al unei rachete în zbor și poate fi folosită ca referință pentru multe metodologii de control.
Bibliografie
[ES08] – Ionete, Cosmin; Surlea Dragoș; Neagu Nicolae, Embedded Systems, Craiova, 2008;
[SI11] – Ionete, Cosmin, Sisteme integrate – Indrumar de laborator, Craiova, 2011;
[SRVIP] – SRV02-Series Rotary Experiment # 7 – SRV02_Exp7_Inverted Pendulum
[SRVIPS] – SRV02-Series Rotary Experiment # 7 – SRV02_Exp7_Inverted Pendulum_Solution
[SRVIPUM] – SRV02-Series Rotary Experiment # 7 – SRV02_Rotary Pendulum_User Manual
[SSRA05] – Marin, Constantin, Structuri și legi de reglare automată, Ed. Sitech, Craiova, 2005;
Referințe web
[AUTOSAT] – disponibil via web la adresa http://www.autosar.org
[MATLAB] – disponibil via web la adresa http://www.mathworks.com/help/matlab/
[MIKRO] – Mikroelektronika, Programming dsPIC (Digital Signal Controllers) in C – dsPIC PRO4 User Manual, disponibil via web la adresa http://www.mikroe.com/pdf/
dspicpro4_manual_v101.pdf
[SIMULINK] – disponibil via web la adresa http://www.mathworks.com/help/simulink
[WIKI] – disponibil via web la adresa http://en.wikipedia.org/wiki/
Codul sursă
Codul sursǎ este atașat, ȋmpreunǎ cu documentația și programul Interfața Om-Mașinǎ, ȋn format electronic ȋn CD anexat lucrǎrii de disertație.
CD / DVD
Autorul atașează în această anexă obligatorie, versiunea electronică a aplicației, a acestei lucrări, precum și prezentarea finală a tezei.
Index
A
Afișaj LCD graphic 31
Afișajul LCD 30
B
Bibliografie 82
Butoane 29
C
Ceas de timp real 27
Codul sursă 84
Componenta Control State 79
Componenta q_SRV02_Rotary_Pendulum_SE_MultiQ 68
Componenta SRV02-E ROTPEN-E 70
Componenta Swing Up Controller 75
Conector USB 26
Conversia Experimentului din mediul Simulink Matlab in cod C 66
Convertoare analog-numerice 32
Convertorul digital-analogic 27
CUPRINSUL xii
D
Discretizarea funcției de transfer a unui element PID 22
Drivere și Handlere utilizate 58
Driverul de GPT (General Purpose Time) 59
Driverul ENCODER 64
Driverul MCU (Microcontroller Unit) 58
Driverul PWM (Pulse Width Modulation) 62
E
Element Proporțional Integrator Derivator real 21
H
Handlerul BrgdH (Bridge) 65
I
Introducere 18
L
LED-uri 28
Legi tipizate de reglare 20
LISTA FIGURILOR xv
LISTA TABELELOR xvii
M
Microcontroler 25
Motorul de curent continuu Quanser SRV 02 43
P
Pendulul rotativ 37
Pini pentru acces direct la microcontroler 32
Prezentare generală 20, 23
Prezentarea Plăcii de dezvoltare dsPIC PRO4 23
Principalele caracteristici ale plăcii de dezvoltare dsPIC PRO4 23
R
Referințe web 83
S
Scopul 18
Sisteme de reglare 19
Structura generală a unui sistem de conducere 19
T
Touch Panel 31
Bibliografie
[ES08] – Ionete, Cosmin; Surlea Dragoș; Neagu Nicolae, Embedded Systems, Craiova, 2008;
[SI11] – Ionete, Cosmin, Sisteme integrate – Indrumar de laborator, Craiova, 2011;
[SRVIP] – SRV02-Series Rotary Experiment # 7 – SRV02_Exp7_Inverted Pendulum
[SRVIPS] – SRV02-Series Rotary Experiment # 7 – SRV02_Exp7_Inverted Pendulum_Solution
[SRVIPUM] – SRV02-Series Rotary Experiment # 7 – SRV02_Rotary Pendulum_User Manual
[SSRA05] – Marin, Constantin, Structuri și legi de reglare automată, Ed. Sitech, Craiova, 2005;
Referințe web
[AUTOSAT] – disponibil via web la adresa http://www.autosar.org
[MATLAB] – disponibil via web la adresa http://www.mathworks.com/help/matlab/
[MIKRO] – Mikroelektronika, Programming dsPIC (Digital Signal Controllers) in C – dsPIC PRO4 User Manual, disponibil via web la adresa http://www.mikroe.com/pdf/
dspicpro4_manual_v101.pdf
[SIMULINK] – disponibil via web la adresa http://www.mathworks.com/help/simulink
[WIKI] – disponibil via web la adresa http://en.wikipedia.org/wiki/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Experimentul Quanser Pendulul Invers Rotativ (ID: 121180)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
